Snippet Armor

Discussion in 'Systems and Snippets' started by Dirac, Oct 19, 2011.

  1. Dirac

    Dirac 22710180

    Ratings:
    +147 / 0 / -0
    JASS:
    library Armor /* v1.0.0
    
    */uses/*
    */  Damage  /* thehelper.net/forums/showthread.php/168144-Damage-Struct
    
    Useful tool for unit armor reduction and armor amount calculation
    
    **********************************************************************/
    globals
    //*********************************************************************
    //  The gameplay constant that sets how much damage the armor reduces.
        private constant real ARMOR_REDUCTION           =   0.06
    //*********************************************************************
    //  The gameplay constant for ethereal damage modification
        private constant real ETHEREAL_ARMOR_REDUCTION  =   1.66
    endglobals
    /**********************************************************************
    *
    *   function GetUnitDamageReduction takes unit whichUnit, attacktype attackType, damagetype damageType returns real
    *       -   If returns 1.00 means it takes 100% damage.
    *   function GetUnitArmor takes unit whichUnit returns real
    *       -   Calculates the unit's armor, as accurate as it gets.
    *
    **********************************************************************/
    
        private function Ln takes real a returns real
            local real sum = 0.0
            loop
                exitwhen a < bj_E
                set a = a/bj_E
                set sum = sum + 1.
            endloop
            return sum + (a-1.)*(1. + 9./(2.+a) + 9./(1.+a*2.) + 1/a)/8.
        endfunction
        
        function GetUnitDamageReduction takes unit whichUnit, attacktype attackType, damagetype damageType returns real
            local real result
            local real prevLife=GetWidgetLife(whichUnit)
            
            //*********************************************************************
            //  Deals 100 damage that ignores armor type to the unit, and from the
            //  unit's remaining life we know how much damage was reduced.
            //  To prevent the unit from dying from damage dealt this way the life
            //  bonus ability is added
            call UnitAddAbility(whichUnit,ABILITY_LIFE_BONUS)
            set Damage.enabled=false
            set result=GetWidgetLife(whichUnit)
            call UnitDamageTarget(whichUnit,whichUnit,100,true,false,attackType,damageType,null)
            set Damage.enabled=true
            set result=result-GetWidgetLife(whichUnit)
            call UnitRemoveAbility(whichUnit,ABILITY_LIFE_BONUS)
            call SetWidgetLife(whichUnit,prevLife)
            return result/100
        endfunction
            
        function GetUnitArmor takes unit whichUnit returns real
            local real reduction=GetUnitDamageReduction(whichUnit,ATTACK_TYPE_CHAOS,DAMAGE_TYPE_NORMAL)
            
            //*********************************************************************
            //  (armor)*0.06/(1+armor*0.06) = reduction
            if 0==reduction then
                set reduction=GetUnitDamageReduction(whichUnit,ATTACK_TYPE_MAGIC,DAMAGE_TYPE_NORMAL)
                return ((1-reduction)/(ARMOR_REDUCTION*(reduction)))/ETHEREAL_ARMOR_REDUCTION
            endif
            if reduction<=1 then
                return (1-reduction)/(ARMOR_REDUCTION*(reduction))
            endif
            
            //*********************************************************************
            //  Ln of 0.94, w3's magic number for negative armor.
            return -(Ln(2-reduction)/-0.061875)
        endfunction
    endlibrary
     
  2. Dirac

    Dirac 22710180

    Ratings:
    +147 / 0 / -0
    Please graveyard this as it is no longer required, it's now implemented inside Damage by default.
     
  3. GFreak45

    GFreak45 I didnt slap you, i high 5'd your face.

    Ratings:
    +132 / 0 / -0
    if you want it GY'd report it yourself and it wont go negatively for you but it will bring it to the attention of the mods
     
  4. tooltiperror

    tooltiperror Super Moderator Staff Member

    Ratings:
    +233 / 0 / -0
    What GFreak said. This will be added to submission rules (eventually).
     
  5. Sim

    Sim Forum Administrator Staff Member

    Ratings:
    +531 / 0 / -0
    Ungraveyarded as per Dirac's inquiry.
     
  6. Magthridon96

    Magthridon96 Member

    Ratings:
    +2 / 0 / -0
    Newsflash:
    The whole 0 == x is faster than x == 0 is total baloney. (According to recent benchmarks by Anitarf)
     
    • Like Like x 1
  7. tooltiperror

    tooltiperror Super Moderator Staff Member

    Ratings:
    +233 / 0 / -0
    You should have posted the link :p

    Regardless of if either was faster, you should not have been doing it anyways. As Anitarf points out, it is probably CPU (processor) specific.
     
  8. Bribe

    Bribe vJass errors are legion

    Ratings:
    +67 / 0 / -0
    Or another speedfreak myth like that nonsense Increment/Decrement Captain Griffin tried a few months ago.
     
  9. Mabaet.Baet

    Mabaet.Baet Member

    Ratings:
    +2 / 0 / -0
    The system deals damage to the unit. Which triggers the which is used by many spells or other systems. Example, if a hero has a damage reflecting aura(like Spectre's DotA Dispersion), and detects armor, it will deal damage to surrounding units and players would think it is bug(it is). More dangerous if this unit's armor is being detected every period.

    I need these system, but it conflicts with spells that I use with damage detect. Please fix D:
     
  10. Magthridon96

    Magthridon96 Member

    Ratings:
    +2 / 0 / -0
    I know you're going to think I'm crazy for this, but:

    JASS:
    return -(Ln(2-reduction)/-0.061875)

    ->
    JASS:
    return Ln(2-reduction)/0.061875
     

Share This Page