2017-01-05 5 views
3
function GetDamage(spell, unit) 
    if spell == _Q and (isReady(_Q) or qActive) and not HasItem(3025) and not HasItem(3100) and not HasItem(3057) and not HasItem(3078) then 
     return myHero:CalcDamage(unit, ((((myHero:GetSpellData(_Q).level * 20) + 10) + myHero.totalDamage) + qStacks)) 
    elseif spell == _Q and (isReady(_Q) or qActive) and (HasItem(3057) or sheenActive) then 
     return myHero:CalcDamage(unit, myHero.damage) + myHero:CalcDamage(unit, ((((myHero:GetSpellData(_Q).level * 20) + 10) + myHero.totalDamage) + qStacks)) 
    elseif spell == _Q and (isReady(_Q) or qActive) and (HasItem(3025) or fActive) then 
     return myHero:CalcDamage(unit, myHero.damage) + myHero:CalcDamage(unit, ((((myHero:GetSpellData(_Q).level * 20) + 10) + myHero.totalDamage) + qStacks)) 
    elseif spell == _Q and (isReady(_Q) or qActive) and (HasItem(3100) or lActive) then 
     return myHero:CalcMagicDamage(unit, ((myHero.damage * 0.75) + (myHero.ap * 0.5))) + myHero:CalcDamage(unit, ((((myHero:GetSpellData(_Q).level * 20) + 10) + myHero.totalDamage) + qStacks)) 
    elseif spell == _Q and (isReady(_Q) or qActive) and (HasItem(3078) or tActive) then 
     return myHero:CalcDamage(unit, (myHero.damage * 2)) + myHero:CalcDamage(unit, ((((myHero:GetSpellData(_Q).level * 20) + 10) + myHero.totalDamage) + qStacks)) 
    elseif spell == _E and isReady(_E) then 
     return myHero:CalcMagicDamage(unit, (((myHero:GetSpellData(_E).level * 40) + 15) + (myHero.ap * 0.6))) 
    else 
     return 0 
    end 
end 

это мой код, чтобы вернуть х урон от заклинаний на х врагов, однако в то время как она работает, как предполагалось, кажется неэффективным и некрасиво и я хотел бы, чтобы работать немного по-другому, и я m не уверен, как закодировать его как таковой.Ищете уборщик более эффективный способ

Что я хотел бы это сделать, если я, например, GetDamage(all) или что-то похоже, я хотел бы его вернуть общий ущерб я могу сделать данный isReady(spell) возвращает истинный, т.е. если заклинание q и e готовы было бы вернуть в общей сложности q и e только, или если все были готовы, то он вернет все, кроме того, если мне нужно только знать повреждение r, я все еще мог бы сделать GetDamage(_R).

Есть ли более чистый способ сделать это, используя таблицу или более эффективный способ получить результаты, которые мне нужны? Потому что в настоящее время использование GetDamage(spell) + GetDamage(spell2) + GetDamage(spell3) и т. Д. Выглядит очень плохое кодирование.

ответ

2

Ввести новое заклинание "ALL"

function GetDamage(spell, unit) 
    local result = 0 
    if (spell == "ALL" or spell == _Q) and (isReady(_Q) or qActive) then 
     local bonus = 0 
     if (HasItem(3057) or sheenActive) then 
     bonus = myHero:CalcDamage(unit, myHero.damage) 
     elseif (HasItem(3025) or fActive) then 
     bonus = myHero:CalcDamage(unit, myHero.damage) 
     elseif (HasItem(3100) or lActive) then 
     bonus = myHero:CalcMagicDamage(unit, ((myHero.damage * 0.75) + (myHero.ap * 0.5))) 
     elseif (HasItem(3078) or tActive) then 
     bonus = myHero:CalcDamage(unit, (myHero.damage * 2)) 
     end 
     result = result + bonus + myHero:CalcDamage(unit, ((((myHero:GetSpellData(_Q).level * 20) + 10) + myHero.totalDamage) + qStacks)) 
    end 
    if (spell == "ALL" or spell == _E) and isReady(_E) then 
     result = result + myHero:CalcMagicDamage(unit, (((myHero:GetSpellData(_E).level * 40) + 15) + (myHero.ap * 0.6))) 
    end 
    return result 
end 

Примеры использования:

dmg = GetDamage("ALL", unit) 
dmg = GetDamage(_Q, unit) 
dmg = GetDamage(_E, unit) 

EDIT:
Существует еще один способ реализации такой же с помощью таблицы с заклинаниями как ключи и функции как значения:

spell_dmg_func = { 
    [_Q] = 
     function(unit) 
     if (isReady(_Q) or qActive) then 
      local bonus = 0 
      if (HasItem(3057) or sheenActive) then 
       bonus = myHero:CalcDamage(unit, myHero.damage) 
      elseif (HasItem(3025) or fActive) then 
       bonus = myHero:CalcDamage(unit, myHero.damage) 
      elseif (HasItem(3100) or lActive) then 
       bonus = myHero:CalcMagicDamage(unit, ((myHero.damage * 0.75) + (myHero.ap * 0.5))) 
      elseif (HasItem(3078) or tActive) then 
       bonus = myHero:CalcDamage(unit, (myHero.damage * 2)) 
      end 
      return bonus + myHero:CalcDamage(unit, ((((myHero:GetSpellData(_Q).level * 20) + 10) + myHero.totalDamage) + qStacks)) 
     end 
     end, 
    [_E] = 
     function(unit) 
     if isReady(_E) then 
      return myHero:CalcMagicDamage(unit, (((myHero:GetSpellData(_E).level * 40) + 15) + (myHero.ap * 0.6))) 
     end 
     end, 
} 

function GetDamage(spell, unit) 
    if spells == "ALL" then 
     local sum = 0 
     for spell, func in pairs(spell_dmg_func) do 
     sum = sum + (func(unit) or 0) 
     end 
     return sum 
    else 
     return spell_dmg_func[spell](unit) or 0 
    end 
end 
+0

Спасибо, но это самый эффективный способ кодирования этой функции, или вы считаете, что существует более чистый способ? – loveroflua

+0

@loveroflua - Ответ обновлен. –

+0

Отлично, это именно то, что я искал спасибо – loveroflua

Смежные вопросы