[Log in / Register]
| News | Chat | Pastebin | Donations | Tutorials | Rules | Forums | Starcraft II |
| Maps | Skins | Icons | Models | Spells | Tools | Jass | Packs |
(Keeps Hive Alive)
Go Back   The Hive Workshop > Warcraft III Resources > JASS Functions

JASS Functions Approved JASS functions will be located here.
Remember to submit your own resources to the submission forum.

Reply
 
LinkBack (34) Thread Tools
Old 08-29-2009, 03:03 AM   34 links from elsewhere to this Post. Click to view. #1 (permalink)
Registered User Cassiel
a.k.a. Litany
 
Cassiel's Avatar
 
Join Date: Mar 2004
Posts: 21
Cassiel has disabled reputation
[vJASS][System] Unit Properties

Updated for 1.24b compatibility and renamed constants to circumvent a JassHelper bug.

Components:
  • Unit Properties: Requires JNGP
  • Evasion Module: Requires Table

Unit Properties consists of the core Unit Properties library and an additional Evasion library. These libraries give you dynamic control over the following properties for a unit:
  • Agility
  • Intelligence
  • Strength
  • Current Life
  • Max Life
  • Life Regeneration
  • Current Mana
  • Max Mana
  • Mana Regeneration
  • Mana Regeneration Percent
  • Armor
  • Damage
  • Attack Speed
  • Move Speed
  • Attack Evasion
  • Attack Miss

The API is:
function CreateUnitProperties takes unit u returns nothing
function GetUnitProperties takes unit u returns properties
function DestroyUnitProperties takes unit u returns nothing

function UnitModifyAgi takes unit u, real amount returns nothing
function UnitModifyInt takes unit u, real amount returns nothing
function UnitModifyStr takes unit u, real amount returns nothing
function UnitModifyLife takes unit u, real amount returns nothing
function UnitModifyMaxLife takes unit u, real amount returns nothing
function UnitModifyLifeRegen takes unit u, real amount returns nothing
function UnitModifyMana takes unit u, real amount returns nothing
function UnitModifyMaxMana takes unit u, real amount returns nothing
function UnitModifyManaRegen takes unit u, real amount returns nothing
function UnitModifyManaRegenPercent takes unit u, real amount returns nothing
function UnitModifyArmor takes unit u, real amount returns nothing
function UnitModifyDamage takes unit u, real amount returns nothing
function UnitModifyAttackSpeed takes unit u, real amount returns nothing
function UnitModifyMoveSpeed takes unit u, real amount returns nothing
function UnitModifyAttackEvasion takes unit u, real amount returns nothing
function UnitModifyAttackMiss takes unit u, real amount returns nothing

//For each of these functions, there is also a UnitSet and a UnitGet equivalent.

To increase a unit's strength by 4, for example, you would call UnitModifyStr(unit, 4), or UnitModifyStr(unit, -4) if you wanted to decrease it instead. To set a property to a specific value, you would use UnitSetStr(unit, value). In addition to these functions, the following wrapper syntax is also included: set unit:Str = value, or, if you want to increase or decrease the property by a certain amount, set unit:Str = unit:Str + value.

Unit Properties
Unit Properties:
//*******************************************************************************
//* Unit Properties *
//* v.D *
//* *
//* By: Cassiel *
//*******************************************************************************

//*******************************************************************************
// The ObjectMerger command will automatically generate all the necessary
// abilities for you using the external Lua script, which should be placed in the
// same directory as the map you're installing to. It only needs to be run once.
//
////! external ObjectMerger UnitPropertiesGenerator.lua

library UnitProperties initializer Init
    globals

    //*******************************************************************************
    // Max: Specifies the highest power of 2 the property ability sets use. A Max
    // of 8 means the system supports values of +/- 511. To change values
    // simply reset the Max variable in the Lua script.
    //
    // Offset: Specifies the difference between the + and - abilities for any
    // property.
    //
        private constant integer MAX = 8
        private constant integer OFFSET = 512

    //*******************************************************************************
    // These globals reference the starting abilities for properties that use binary
    // counting. Changing them means changing the rawcodes of all the abilities the
    // system uses for that property. This list includes all properties that stack
    // linearly and are binary countable.
    //
        private constant integer AGI = 'AG+a'
        private constant integer INT = 'IN+a'
        private constant integer STR = 'ST+a'
        private constant integer ATTACK_SPEED = 'AT+a'
        private constant integer ARMOR = 'AR+a'
        private constant integer DAMAGE = 'DA+a'
        private constant integer LIFE_REGEN = 'LI+a'
        private constant integer MANA_REGEN_PERCENT = 'MR+a'

    //*******************************************************************************
    // These globals reference the starting abilities for properties that use the
    // life/mana bug.
    //
        private constant integer MAX_LIFE = 'Lif+'
        private constant integer MAX_MANA = 'Man+'

    // ******************************************************************************
    // Timer: Used for any periodic properties that you want/need to
    // trigger. Static mana gain (as opposed to percentage mana gain)
    // is included as an example.
    //
    // pow2: Powers of 2 up to 30 are calculated and stored in this array at
    // Init.
    //
    // UnitProperties: This array stores the properties struct for each unit that has
    // it. It and the properties struct are public so that advanced
    // users have the option of manipulating properties directly
    // instead of relying on the UnitGet/Set functions.
    //
        private timer Timer = CreateTimer()
        private integer array Pow2
        properties array UnitProperties
    endglobals

    struct properties
    // ******************************************************************************
    // These are the standard properties you would want to manipulate on a given unit
    //
        real Agi = 0
        real Int = 0
        real Str = 0
        real LifeRegen = 0
        real ManaRegen = 0
        real ManaRegenPercent = 0
        real Armor = 0
        real Damage = 0
        real AttackSpeed = 0
        real MoveSpeed

    // ******************************************************************************
    // These properties are used by the Evasion module, which gives fully dynamic
    // control over a unit's chance to evade incoming or miss on outgoing attacks.
    //
        unit unit
        real AttackEvasion = 0
        real AttackMiss = 0

    // ******************************************************************************
    // These are examples of additional properties which would require other systems
    // to take advantage of.
    //
        //real AttackCritical = 0
        //real SpellEvasion = 0
        //real SpellMiss = 0
        //real SpellCritical = 0

    // ******************************************************************************
    // JASS doesn't handle decimal values very well. 1. + .05 = 1.049999952, and
    // 1. + .05 - .05 != 1. Thus it is necessary to store the values without decimals
    // and then convert them when they they are retrieved.
    //
        //real ExpRate = 100
        //real BountyRate = 100

        static method create takes unit u returns properties
            local properties this = properties.allocate()
            set .unit = u
            // You may want to use GetUnitDefaultMoveSpeed here, but I have seen
            // some bugs with it.
            set .MoveSpeed = GetUnitMoveSpeed(u)
            return this
        endmethod

        method onDestroy takes nothing returns nothing
            set UnitProperties[.unit:Id] = 0
            set .unit = null
        endmethod
    endstruct

    // ******************************************************************************
// These functions allow you to retrieve the handle index of a unit. Other
    // methods of indexing units, like UnitUserData and HAIL, would also work. This
    // method is only viable if you correctly dispose of used handles, so if your
    // map suffers from inflated handle indices you should either change
    // the "UnitProperties" array above to "UnitProperties[verybignumber]", or use a
    // different system. A UnitUserData system is recommended as a replacement
    // regardless.
    //
    // The Id wrapper allows you to retrieve a unit's Id as with:
    //
    // unit:Id
    //
    function GetUnitId takes unit u returns integer
        return GetHandleId(u)-0x100000
endfunction

    struct Id
        static method operator [] takes unit u returns integer
            return GetUnitId(u)
        endmethod
    endstruct


    // ******************************************************************************
    // Create or manipulate a set of properties for a given unit.
//
    function CreateUnitProperties takes unit u returns nothing
        local integer id = u:Id
        if UnitProperties[id] == 0 then
            set UnitProperties[id] = properties.create(u)
        endif
    endfunction

    function GetUnitProperties takes unit u returns properties
        return UnitProperties[u:Id]
    endfunction

    function DestroyUnitProperties takes unit u returns nothing
        local integer id = u:Id
        if UnitProperties[id] != 0 then
            call properties.destroy(UnitProperties[id])
        endif
    endfunction

    //*******************************************************************************
    // These are the custom functions that allow you to manipulate specific
    // properties. For each property, the macros generate a UnitSet, UnitModify and
// UnitGet function.
    //
    // UnitSetAgi(u, 10): This would set a unit's bonus Agility to 10.
    //
    // UnitModifyAgi(u, 10): This would add 10 to a unit's bonus Agility. A
    // negative number could be used to subtract.
//
    // UnitGetAgi(u): This would return a unit's current Agi bonus.
    //
    // The OperatorWrappers library offers a different interface for those who are
    // comfortable with vJASS. More details are available at the top of the library.
    //
    function UnitModifyMoveSpeed takes unit u, real amount returns nothing
local properties p = UnitProperties[GetUnitId(u)]
        set p.MoveSpeed = p.MoveSpeed + R2I(amount)
        call SetUnitMoveSpeed(u, p.MoveSpeed)
    endfunction

    function UnitSetMoveSpeed takes unit u, real amount returns nothing
        local properties p = UnitProperties[GetUnitId(u)]
        set p.MoveSpeed = R2I(amount)
        call SetUnitMoveSpeed(u, p.MoveSpeed)
    endfunction

    //There's already a native for this, but for the sake of completeness:
    function UnitGetMoveSpeed takes unit u returns real
        return UnitProperties[GetUnitId(u)].MoveSpeed
    endfunction

    // ******************************************************************************
    // Periodic properties, like static mana regeneration.
    //
    //! textmacro UnitSetPeriodic takes member
    globals
        private group $member$Group = CreateGroup()
    endglobals
    function UnitModify$member$ takes unit u, real amount returns nothing
        local properties p = UnitProperties[GetUnitId(u)]
        set p.$member$ = p.$member$ + amount
        if p.$member$ != 0 then
            call GroupAddUnit($member$Group, u)
        else
            call GroupRemoveUnit($member$Group, u)
        endif
    endfunction

    function UnitSet$member$ takes unit u, real amount returns nothing
        local properties p = UnitProperties[GetUnitId(u)]
        set p.$member$ = amount
        if amount != 0 then
            call GroupAddUnit($member$Group, u)
        else
            call GroupRemoveUnit($member$Group, u)
        endif
    endfunction

    function UnitGet$member$ takes unit u returns real
        return UnitProperties[GetUnitId(u)].$member$
    endfunction
    //! endtextmacro
    //! runtextmacro UnitSetPeriodic("ManaRegen")

    // ******************************************************************************
    // Triggered properties like Spell Crits and Spell Evasion use these macros.
    //
    //! textmacro UnitSetProperty takes member
    function UnitModify$member$ takes unit u, real amount returns nothing
        local properties p = UnitProperties[GetUnitId(u)]
        set p.$member$ = p.$member$ + R2I(amount)
    endfunction

    function UnitSet$member$ takes unit u, real amount returns nothing
        set UnitProperties[GetUnitId(u)].$member$ = R2I(amount)
    endfunction

    function UnitGet$member$ takes unit u returns real
        return UnitProperties[GetUnitId(u)].$member$
    endfunction
    //! endtextmacro
    //! runtextmacro UnitSetProperty("AttackEvasion")
    //! runtextmacro UnitSetProperty("AttackMiss")
    ////! runtextmacro UnitSetProperty("AttackCritical")
    ////! runtextmacro UnitSetProperty("SpellCritical")
    ////! runtextmacro UnitSetProperty("SpellEvasion")
    ////! runtextmacro UnitSetProperty("SpellMiss")
    ////! runtextmacro UnitSetProperty("SpellResistance")
    ////! runtextmacro UnitSetProperty("SpellReflection")

    //! textmacro UnitSetPercentageProperty takes member
    function UnitModify$member$ takes unit u, real amount returns nothing
        local properties p = UnitProperties[GetUnitId(u)]
        set p.$member$ = p.$member$ + R2I(amount)
    endfunction

    function UnitSet$member$ takes unit u, real amount returns nothing
        set UnitProperties[GetUnitId(u)].$member$ = R2I(amount)
    endfunction

    function UnitGet$member$ takes unit u returns real
        return UnitProperties[GetUnitId(u)].$member$
    endfunction
    //! endtextmacro
    ////! runtextmacro UnitSetPercentageProperty("SpellPower")
    ////! runtextmacro UnitSetPercentageProperty("ExpRate")
    ////! runtextmacro UnitSetPercentageProperty("BountyRate")
    ////! runtextmacro UnitSetPercentageProperty("BloodRate")

    // ******************************************************************************
    // Properties that are modified by using a binary count system. This includes
    // stats, armor, damage etc.
    //
    //! textmacro UnitSetBinary takes member, MEMBER
    function UnitModify$member$ takes unit u, real amount returns nothing
        local properties p = GetUnitProperties(u)
        local real r = p.$member$
        local integer i = 1
        local integer e
        local integer a
        set p.$member$ = p.$member$ + R2I(amount)
        set amount = R2I(p.$member$)
        loop
            exitwhen i > 1
            if amount >= 0 and r >= 0. then
                set e = $MEMBER$
                set r = amount
            elseif amount <= 0 and r <= 0. then
                set e = $MEMBER$ + OFFSET
                set r = -amount
            elseif amount <= 0 and r >= 0. then
                set e = $MEMBER$
                set r = 0.
                set i = 0
            elseif amount >= 0 and r <= 0. then
                set e = $MEMBER$ + OFFSET
                set r = 0.
                set i = 0
            endif
            set a = MAX
            loop
                exitwhen a < 0
                if r >= Pow2[a] then
                    call UnitAddAbility(u, e + a)
                    set r = r - Pow2[a]
                else
                    call UnitRemoveAbility(u, e + a)
                endif
                set a = a - 1
            endloop
            set i = i + 1
        endloop
    endfunction

    function UnitSet$member$ takes unit u, real amount returns nothing
        local properties p = GetUnitProperties(u)
        local real r = p.$member$
        local integer i = 1
        local integer e
        local integer a
        set p.$member$ = R2I(amount)
        set amount = R2I(p.$member$)
        loop
            exitwhen i > 1
            if amount >= 0 and r >= 0. then
                set e = $MEMBER$
                set r = amount
            elseif amount <= 0 and r <= 0. then
                set e = $MEMBER$ + OFFSET
                set r = -amount
            elseif amount <= 0 and r >= 0. then
                set e = $MEMBER$
                set r = 0.
                set i = 0
            elseif amount >= 0 and r <= 0. then
                set e = $MEMBER$ + OFFSET
                set r = 0.
                set i = 0
            endif
            set a = MAX
            loop
                exitwhen a < 0
                if r >= Pow2[a] then
                    call UnitAddAbility(u, e + a)
                    set r = r - Pow2[a]
                else
                    call UnitRemoveAbility(u, e + a)
                endif
                set a = a - 1
            endloop
            set i = i + 1
        endloop
    endfunction

    function UnitGet$member$ takes unit u returns real
        return UnitProperties[GetUnitId(u)].$member$
    endfunction

    struct $member$ extends array
        static method operator [] takes unit u returns real
            return UnitProperties[GetUnitId(u)].$member$
        endmethod

        static method operator []= takes unit u, real r returns nothing
            call UnitSet$member$(u, r)
        endmethod
    endstruct
    //! endtextmacro
    //! runtextmacro UnitSetBinary("Agi", "AGI")
    //! runtextmacro UnitSetBinary("Int", "INT")
    //! runtextmacro UnitSetBinary("Str", "STR")
    //! runtextmacro UnitSetBinary("Damage", "DAMAGE")
    //! runtextmacro UnitSetBinary("Armor", "ARMOR")
    //! runtextmacro UnitSetBinary("AttackSpeed", "ATTACK_SPEED")
    //! runtextmacro UnitSetBinary("LifeRegen", "LIFE_REGEN")
    //! runtextmacro UnitSetBinary("ManaRegenPercent", "MANA_REGEN_PERCENT")

    // ******************************************************************************
    // Modifying max life and mana are special cases, although they could also be
    // done using binary counting.
    //
    //! textmacro UnitSetMaxState takes member, state
    function UnitModify$member$ takes unit u, real amount returns nothing
        local integer comp = 100
        local integer i = 4
        local integer abil = $state$
        if amount < 0 then
            set abil = abil + 2
            set amount = -amount
        endif
        set amount = R2I(amount)
        loop
            exitwhen i < 2
             if amount >= comp then
                loop
                    exitwhen amount < comp
                    call UnitAddAbility (u, abil)
                    call SetUnitAbilityLevel(u, abil, i)
                    call UnitRemoveAbility (u, abil)
                    set amount = amount - comp
                endloop
            endif
            set comp = comp / 10
            set i = i - 1
        endloop
    endfunction

    function UnitSet$member$ takes unit u, real amount returns nothing
        local integer comp = 100
        local integer i = 4
        local integer abil = $state$
        local real r = GetUnitState(u, UNIT_STATE_$state$)
        if amount > r then
            set amount = R2I(amount - r)
        elseif amount < r then
            set amount = R2I(RAbsBJ(r - amount))
            set abil = abil + 2
        endif
        loop
            exitwhen i < 2
             if amount >= comp then
                loop
                    exitwhen amount < comp
                    call UnitAddAbility (u, abil)
                    call SetUnitAbilityLevel(u, abil, i)
                    call UnitRemoveAbility (u, abil)
                    set amount = amount - comp
                endloop
            endif
            set comp = comp / 10
            set i = i - 1
        endloop
    endfunction

    function UnitGet$member$ takes unit u returns real
        return GetUnitState(u, UNIT_STATE_$state$)
    endfunction
    //! endtextmacro
    //! runtextmacro UnitSetMaxState("MaxLife", "MAX_LIFE")
    //! runtextmacro UnitSetMaxState("MaxMana", "MAX_MANA")

    // ******************************************************************************
    // Refreshes properties for a unit in case a morph ability or something else
    // causes them to vanish.
    //
    function RefreshUnitProperties takes unit u returns nothing
        call UnitModifyArmor (u, 0)
        call UnitModifyDamage (u, 0)
        call UnitModifyAttackSpeed (u, 0)
        call UnitModifyMoveSpeed (u, 0)
        call UnitModifyAgi (u, 0)
        call UnitModifyInt (u, 0)
        call UnitModifyStr (u, 0)
        call UnitModifyLifeRegen (u, 0)
        call UnitModifyManaRegen (u, 0)
        call UnitModifyManaRegenPercent(u, 0)
    endfunction

    // ******************************************************************************
    // Additional periodic properties would be added to the Periodic function and
    // would require their own ForGroup.
    //
    private function UnitAdjustMana takes nothing returns nothing
        local unit u = GetEnumUnit()
        set u:Mana = u:Mana + u:ManaRegen
        set u = null
    endfunction

    private function Periodic takes nothing returns nothing
        call ForGroup(ManaRegenGroup, function UnitAdjustMana)
    endfunction

    // ******************************************************************************
    // Initialization stores powers of 2 up to 30, starts the periodic timer and
    // preloads all property abilities.
    //
    globals
        private unit u
    endglobals

    private function PreloadBinary takes integer i returns nothing
        local integer done = i + OFFSET + MAX
        local integer exit
        loop
            set exit = i + MAX
            loop
                exitwhen i == exit
                call UnitAddAbility(u, i)
                set i = i + 1
            endloop
            exitwhen i == done
            set i = (i - MAX) + OFFSET
        endloop
    endfunction

    private function Init takes nothing returns nothing
        local integer i = 1
        set Pow2[0] = 1
        call TimerStart(Timer, 1, true, function Periodic)
        loop
            exitwhen i > 30 // Can't go above 2^30, integer will overflow
            set Pow2[i] = Pow2[i - 1] * 2
            set i = i + 1
        endloop
        set u = CreateUnit(Player(14), 'hfoo', 0, 0, 0)
        call PreloadBinary (AGI)
        call PreloadBinary (INT)
        call PreloadBinary (STR)
        call PreloadBinary (ATTACK_SPEED)
        call PreloadBinary (DAMAGE)
        call PreloadBinary (LIFE_REGEN)
        call PreloadBinary (ARMOR)
        call PreloadBinary (MANA_REGEN_PERCENT)
        call UnitAddAbility(u, MAX_LIFE)
        call UnitAddAbility(u, MAX_LIFE+2)
        call UnitAddAbility(u, MAX_MANA)
        call UnitAddAbility(u, MAX_MANA+2)
        call UnitAddAbility(u, 'Evas')
        call KillUnit (u)
        call RemoveUnit (u)
        set u = null
    endfunction

    //*******************************************************************************
    // These wrappers use operator overloading to allow a more intuitive syntax than
    // UnitSet/Modify/GetProperty():
    //
    // set Unit:Property = x
    // or
    // set Property[Unit] = x
    //
    // To modify a property rather than set it to a specific value:
    //
    // set Unit:Property = Unit:Property + x
    // or
    // set Property[Unit] = Property[Unit] + x
    //

    //! textmacro UnitPropertyWrapper takes name
    struct $name$ extends array
        static method operator [] takes unit u returns real
            return UnitGet$name$(u)
        endmethod
        static method operator []= takes unit u, real r returns nothing
            call UnitSet$name$(u, r)
        endmethod
    endstruct
    //! endtextmacro
    //! runtextmacro UnitPropertyWrapper("ManaRegen")
    //! runtextmacro UnitPropertyWrapper("MoveSpeed")
    //! runtextmacro UnitPropertyWrapper("AttackEvasion")
    //! runtextmacro UnitPropertyWrapper("AttackMiss")

    //! textmacro UnitStateWrapper takes name, type
    struct $name$ extends array
        static method operator [] takes unit u returns real
            return GetUnitState(u, UNIT_STATE_$type$)
        endmethod
        static method operator []= takes unit u, real r returns nothing
            call SetUnitState(u, UNIT_STATE_$type$, r)
        endmethod
    endstruct
    struct Max$name$ extends array
        static method operator [] takes unit u returns real
            return GetUnitState(u, UNIT_STATE_MAX_$type$)
        endmethod
        static method operator []= takes unit u, real r returns nothing
            call UnitSetMax$name$(u, r)
        endmethod
    endstruct
    //! endtextmacro
    //! runtextmacro UnitStateWrapper("Life", "LIFE")
    //! runtextmacro UnitStateWrapper("Mana", "MANA")
endlibrary


Installation

Download UnitPropertiesGenerator.txt and rename it to UnitPropertiesGenerator.lua. Place UnitPropertiesGenerator.lua in the same directory as your map. Then paste the UnitProperties library (and the Evasion library, if you want it) into your map and uncomment the line ////! external ObjectMerger UnitPropertiesGenerator.lua. Save the map, then close it, then open it again. Everything Unit Properties needs to run will have been generated automatically, and you can now comment //! external ObjectMerger UnitPropertiesGenerator.lua back out.


Credits

Thanks to PitzerMike and Vexorian for their tools, Alexander244 for the original Lua script, and Anitarf for syntax and implementation suggestions.
Attached Files
File Type: txt UnitPropertiesGenerator.txt (3.3 KB, 104 views)

Last edited by PurplePoot; 09-03-2009 at 10:13 PM.
Cassiel is offline   Reply With Quote
Old 08-29-2009, 03:08 AM   #2 (permalink)
Registered User Cassiel
a.k.a. Litany
 
Cassiel's Avatar
 
Join Date: Mar 2004
Posts: 21
Cassiel has disabled reputation
Evasion Module

Data for all stock units is included. Custom units can be added manually or using //! loaddata. See comments for more information.

Evasion Module
Evasion Module:
//*******************************************************************************
// Note that dynamic Evasion will not work if methods outside of Unit Properties
// are used to modify a unit's attack speed. This is because we need to calculate
// the unit's exact damage point in order for dynamic Evasion to work.
//
library Evasion initializer Init needs UnitProperties, Table
    globals
        private constant integer Evasion = 'Evas'
        private HandleTable UnitId
        private trigger Trigger

    //*******************************************************************************
    // Dynamic Evasion requires access to the damage points of all attack-enabled
    // units used in a map. This library takes care of things for stock units, and
    // has two different options for adding custom units.
    //
        private Table DamagePoint

    //*******************************************************************************
    // By default each point of Agi increases a unit's attack speed by 2%. Modify
    // this constant accordingly if you use a different value.
    //
        private constant real AgiMod = 2.
    endglobals

    //*******************************************************************************
    // Specify the path to your damage points SLK here, if you use one. Note that the
    // unitWeapID struct is left public because loaddata will not work if it is
    // privatized. For more information on loaddata see the JassHelper documentation.
    //
    // //! loaddata "Drive:\Path to SLK\SLK.slk"
    //
    struct unitWeapID
real dmgpt1

        static method getFromKey takes integer i returns unitWeapID
            local unitWeapID d = DamagePoint[i]
            if d == 0 then
                set d = unitWeapID.create()
                set DamagePoint[i] = d
            endif
            return d
        endmethod
    endstruct

    function UnitGetDamagePoint takes unit u returns real
        return unitWeapID.getFromKey(GetUnitTypeId(u)).dmgpt1
    endfunction

    //*******************************************************************************
    // These are wrappers. You should remove them if you have something like CSSafety
    // in place.
    //
    private function NewTimer takes nothing returns timer
        return CreateTimer()
    endfunction

    private function ReleaseTimer takes timer t returns nothing
        call DestroyTimer(t)
    endfunction

    //*******************************************************************************
    // These functions calculate whether a particular attack should miss and if so
    // perform the necessary operations.
    //
    private function Remove takes nothing returns nothing
        local timer t = GetExpiredTimer()
        call UnitRemoveAbility(UnitProperties[UnitId[t]].unit, Evasion)
        call ReleaseTimer(t)
        set t = null
    endfunction

    private function Add takes nothing returns nothing
        local timer t = GetExpiredTimer()
        call UnitAddAbility(UnitProperties[UnitId[t]].unit, Evasion)
        call TimerStart(t, 0., false, function Remove)
        set t = null
    endfunction

    private function Attack takes nothing returns boolean
        local unit attacker = GetAttacker()
        local unit target = GetTriggerUnit()
        local real r
        local timer t

        if GetRandomReal(1, 100) < UnitGetAttackMiss(attacker) or GetRandomReal(1, 100) < UnitGetAttackEvasion(target) then
            set t = NewTimer()
            set UnitId[t] = GetUnitId(target)
            set r = (GetHeroAgi(attacker, true) * AgiMod) + UnitGetAttackSpeed(attacker)
            if r > 400 then
                set r = 400
            endif
            set r = UnitGetDamagePoint(attacker) * (100. / (100. + r))
            call TimerStart(t, r, false, function Add)
            set t = null
        endif

        set attacker = null
        set target = null
        return false
    endfunction

    private function Init takes nothing returns nothing
        local integer s
        set UnitId = Table.create()
        set DamagePoint = Table.create()
        set Trigger = CreateTrigger()
        call TriggerRegisterAnyUnitEventBJ(Trigger, EVENT_PLAYER_UNIT_ATTACKED)
        call TriggerAddCondition(Trigger, Condition(function Attack))

    //*******************************************************************************
    // The damage points for all stock units are loaded here. You can add custom
    // units manually, or load them from an SLK using the "//! loaddata" command
    // (this is a straight cut and paste of the code generated by loaddata on the SLK
    // used by ladder maps).
    //
    // set s=s__unitWeapID_getFromKey('CUSTOM UNIT')
    // set s__unitWeapID_dmgpt1[s]=DAMAGE POINT
    //
        set s=s__unitWeapID_getFromKey('Hamg')
        set s__unitWeapID_dmgpt1[s]=0.55
        set s=s__unitWeapID_getFromKey('Hblm')
        set s__unitWeapID_dmgpt1[s]=0.55
        set s=s__unitWeapID_getFromKey('Hmkg')
        set s__unitWeapID_dmgpt1[s]=0.35
        set s=s__unitWeapID_getFromKey('Hpal')
        set s__unitWeapID_dmgpt1[s]=0.433
        set s=s__unitWeapID_getFromKey('hbot')
        set s=s__unitWeapID_getFromKey('hbsh')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('hdes')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('hdhw')
        set s__unitWeapID_dmgpt1[s]=0.43
        set s=s__unitWeapID_getFromKey('hfoo')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('hgry')
        set s__unitWeapID_dmgpt1[s]=0.8
        set s=s__unitWeapID_getFromKey('hgyr')
        set s__unitWeapID_dmgpt1[s]=0.03
        set s=s__unitWeapID_getFromKey('hkni')
        set s__unitWeapID_dmgpt1[s]=0.66
        set s=s__unitWeapID_getFromKey('hmil')
        set s__unitWeapID_dmgpt1[s]=0.39
        set s=s__unitWeapID_getFromKey('hmpr')
        set s__unitWeapID_dmgpt1[s]=0.59
        set s=s__unitWeapID_getFromKey('hmtm')
        set s__unitWeapID_dmgpt1[s]=1
        set s=s__unitWeapID_getFromKey('hmtt')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('hpea')
        set s__unitWeapID_dmgpt1[s]=0.433
        set s=s__unitWeapID_getFromKey('hphx')
        set s__unitWeapID_dmgpt1[s]=0.43
        set s=s__unitWeapID_getFromKey('hpxe')
        set s=s__unitWeapID_getFromKey('hrif')
        set s__unitWeapID_dmgpt1[s]=0.17
        set s=s__unitWeapID_getFromKey('hrtt')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('hsor')
        set s__unitWeapID_dmgpt1[s]=0.75
        set s=s__unitWeapID_getFromKey('hspt')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('hwat')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('hwt2')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('hwt3')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('halt')
        set s=s__unitWeapID_getFromKey('harm')
        set s=s__unitWeapID_getFromKey('hars')
        set s=s__unitWeapID_getFromKey('hatw')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('hbar')
        set s=s__unitWeapID_getFromKey('hbla')
        set s=s__unitWeapID_getFromKey('hcas')
        set s=s__unitWeapID_getFromKey('hctw')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('hgra')
        set s=s__unitWeapID_getFromKey('hgtw')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('hhou')
        set s=s__unitWeapID_getFromKey('hkee')
        set s=s__unitWeapID_getFromKey('hlum')
        set s=s__unitWeapID_getFromKey('hshy')
        set s=s__unitWeapID_getFromKey('htow')
        set s=s__unitWeapID_getFromKey('hvlt')
        set s=s__unitWeapID_getFromKey('hwtw')
        set s=s__unitWeapID_getFromKey('Obla')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('Ofar')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('Oshd')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('Otch')
        set s__unitWeapID_dmgpt1[s]=0.36
        set s=s__unitWeapID_getFromKey('nwad')
        set s=s__unitWeapID_getFromKey('obot')
        set s=s__unitWeapID_getFromKey('ocat')
        set s__unitWeapID_dmgpt1[s]=0.1
        set s=s__unitWeapID_getFromKey('odes')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('odoc')
        set s__unitWeapID_dmgpt1[s]=0.73
        set s=s__unitWeapID_getFromKey('oeye')
        set s=s__unitWeapID_getFromKey('ogru')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('ohun')
        set s__unitWeapID_dmgpt1[s]=0.31
        set s=s__unitWeapID_getFromKey('ohwd')
        set s=s__unitWeapID_getFromKey('okod')
        set s__unitWeapID_dmgpt1[s]=0.85
        set s=s__unitWeapID_getFromKey('opeo')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('orai')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('oshm')
        set s__unitWeapID_dmgpt1[s]=0.43
        set s=s__unitWeapID_getFromKey('osp1')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('osp2')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('osp3')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('osp4')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('ospm')
        set s=s__unitWeapID_getFromKey('ospw')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('osw1')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('osw2')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('osw3')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('otau')
        set s__unitWeapID_dmgpt1[s]=0.467
        set s=s__unitWeapID_getFromKey('otbk')
        set s__unitWeapID_dmgpt1[s]=0.31
        set s=s__unitWeapID_getFromKey('otbr')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('otot')
        set s=s__unitWeapID_getFromKey('owyv')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('oalt')
        set s=s__unitWeapID_getFromKey('obar')
        set s=s__unitWeapID_getFromKey('obea')
        set s=s__unitWeapID_getFromKey('ofor')
        set s=s__unitWeapID_getFromKey('ofrt')
        set s=s__unitWeapID_getFromKey('ogre')
        set s=s__unitWeapID_getFromKey('oshy')
        set s=s__unitWeapID_getFromKey('osld')
        set s=s__unitWeapID_getFromKey('ostr')
        set s=s__unitWeapID_getFromKey('otrb')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('otto')
        set s=s__unitWeapID_getFromKey('ovln')
        set s=s__unitWeapID_getFromKey('owtw')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('Edem')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('Edmm')
        set s__unitWeapID_dmgpt1[s]=0.26
        set s=s__unitWeapID_getFromKey('Ekee')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('Emoo')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('Ewar')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('earc')
        set s__unitWeapID_dmgpt1[s]=0.72
        set s=s__unitWeapID_getFromKey('ebal')
        set s__unitWeapID_dmgpt1[s]=0.1
        set s=s__unitWeapID_getFromKey('ebsh')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('echm')
        set s__unitWeapID_dmgpt1[s]=0.7
        set s=s__unitWeapID_getFromKey('edcm')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('edes')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('edoc')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('edot')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('edry')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('edtm')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('efdr')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('efon')
        set s__unitWeapID_dmgpt1[s]=0.467
        set s=s__unitWeapID_getFromKey('ehip')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('ehpr')
        set s__unitWeapID_dmgpt1[s]=0.633
        set s=s__unitWeapID_getFromKey('emtg')
        set s__unitWeapID_dmgpt1[s]=0.49
        set s=s__unitWeapID_getFromKey('esen')
        set s__unitWeapID_dmgpt1[s]=0.46
        set s=s__unitWeapID_getFromKey('espv')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('even')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('ewsp')
        set s=s__unitWeapID_getFromKey('eaoe')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('eaom')
        set s__unitWeapID_dmgpt1[s]=0.59
        set s=s__unitWeapID_getFromKey('eaow')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('eate')
        set s=s__unitWeapID_getFromKey('eden')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('edob')
        set s=s__unitWeapID_getFromKey('edos')
        set s=s__unitWeapID_getFromKey('egol')
        set s=s__unitWeapID_getFromKey('emow')
        set s=s__unitWeapID_getFromKey('eshy')
        set s=s__unitWeapID_getFromKey('etoa')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('etoe')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('etol')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('etrp')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('Ucrl')
        set s__unitWeapID_dmgpt1[s]=0.46
        set s=s__unitWeapID_getFromKey('Udea')
        set s__unitWeapID_dmgpt1[s]=0.56
        set s=s__unitWeapID_getFromKey('Udre')
        set s__unitWeapID_dmgpt1[s]=0.55
        set s=s__unitWeapID_getFromKey('Ulic')
        set s__unitWeapID_dmgpt1[s]=0.46
        set s=s__unitWeapID_getFromKey('uabo')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('uaco')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('uban')
        set s__unitWeapID_dmgpt1[s]=0.56
        set s=s__unitWeapID_getFromKey('ubsp')
        set s__unitWeapID_dmgpt1[s]=0.633
        set s=s__unitWeapID_getFromKey('ucrm')
        set s=s__unitWeapID_getFromKey('ucry')
        set s__unitWeapID_dmgpt1[s]=0.64
        set s=s__unitWeapID_getFromKey('ucs1')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('ucs2')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('ucs3')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('ucsB')
        set s=s__unitWeapID_getFromKey('ucsC')
        set s=s__unitWeapID_getFromKey('ufro')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('ugar')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('ugho')
        set s__unitWeapID_dmgpt1[s]=0.39
        set s=s__unitWeapID_getFromKey('ugrm')
        set s=s__unitWeapID_getFromKey('uloc')
        set s__unitWeapID_dmgpt1[s]=0
        set s=s__unitWeapID_getFromKey('umtw')
        set s__unitWeapID_dmgpt1[s]=0.7
        set s=s__unitWeapID_getFromKey('unec')
        set s__unitWeapID_dmgpt1[s]=0.53
        set s=s__unitWeapID_getFromKey('uobs')
        set s__unitWeapID_dmgpt1[s]=0.53
        set s=s__unitWeapID_getFromKey('uplg')
        set s=s__unitWeapID_getFromKey('ushd')
        set s=s__unitWeapID_getFromKey('uske')
        set s__unitWeapID_dmgpt1[s]=0.56
        set s=s__unitWeapID_getFromKey('uskm')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('uubs')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('uaod')
        set s=s__unitWeapID_getFromKey('ubon')
        set s=s__unitWeapID_getFromKey('ugol')
        set s=s__unitWeapID_getFromKey('ugrv')
        set s=s__unitWeapID_getFromKey('unp1')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('unp2')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('unpl')
        set s=s__unitWeapID_getFromKey('usap')
        set s=s__unitWeapID_getFromKey('usep')
        set s=s__unitWeapID_getFromKey('ushp')
        set s=s__unitWeapID_getFromKey('uslh')
        set s=s__unitWeapID_getFromKey('utod')
        set s=s__unitWeapID_getFromKey('utom')
        set s=s__unitWeapID_getFromKey('uzg1')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('uzg2')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('uzig')
        set s=s__unitWeapID_getFromKey('Nbrn')
        set s__unitWeapID_dmgpt1[s]=0.7
        set s=s__unitWeapID_getFromKey('Nbst')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nnht')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('npfl')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('ndr1')
        set s__unitWeapID_dmgpt1[s]=0.56
        set s=s__unitWeapID_getFromKey('ndr2')
        set s__unitWeapID_dmgpt1[s]=0.56
        set s=s__unitWeapID_getFromKey('ndr3')
        set s__unitWeapID_dmgpt1[s]=0.56
        set s=s__unitWeapID_getFromKey('ngz1')
        set s__unitWeapID_dmgpt1[s]=0.63
        set s=s__unitWeapID_getFromKey('ngz2')
        set s__unitWeapID_dmgpt1[s]=0.63
        set s=s__unitWeapID_getFromKey('ngz3')
        set s__unitWeapID_dmgpt1[s]=0.63
        set s=s__unitWeapID_getFromKey('ngzc')
        set s__unitWeapID_dmgpt1[s]=0.63
        set s=s__unitWeapID_getFromKey('ngzd')
        set s__unitWeapID_dmgpt1[s]=0.63
        set s=s__unitWeapID_getFromKey('ngza')
        set s__unitWeapID_dmgpt1[s]=0.63
        set s=s__unitWeapID_getFromKey('ngz4')
        set s__unitWeapID_dmgpt1[s]=0.63
        set s=s__unitWeapID_getFromKey('npn1')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('npn2')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('npn3')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('npn4')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('npn5')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('npn6')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('npng')
        set s=s__unitWeapID_getFromKey('nqb2')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nqb3')
        set s__unitWeapID_dmgpt1[s]=0.633
        set s=s__unitWeapID_getFromKey('nqb4')
        set s__unitWeapID_dmgpt1[s]=0.633
        set s=s__unitWeapID_getFromKey('nqbh')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('nwe1')
        set s=s__unitWeapID_getFromKey('nwe2')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nwe3')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nadk')
        set s__unitWeapID_dmgpt1[s]=0.94
        set s=s__unitWeapID_getFromKey('nadr')
        set s__unitWeapID_dmgpt1[s]=0.94
        set s=s__unitWeapID_getFromKey('nadw')
        set s__unitWeapID_dmgpt1[s]=0.94
        set s=s__unitWeapID_getFromKey('nahy')
        set s__unitWeapID_dmgpt1[s]=0.7
        set s=s__unitWeapID_getFromKey('nanb')
        set s__unitWeapID_dmgpt1[s]=0.53
        set s=s__unitWeapID_getFromKey('nanm')
        set s__unitWeapID_dmgpt1[s]=0.53
        set s=s__unitWeapID_getFromKey('nanc')
        set s__unitWeapID_dmgpt1[s]=0.53
        set s=s__unitWeapID_getFromKey('nane')
        set s__unitWeapID_dmgpt1[s]=0.53
        set s=s__unitWeapID_getFromKey('nano')
        set s__unitWeapID_dmgpt1[s]=0.53
        set s=s__unitWeapID_getFromKey('nanw')
        set s__unitWeapID_dmgpt1[s]=0.53
        set s=s__unitWeapID_getFromKey('narg')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nass')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nbal')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nba2')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nban')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nbda')
        set s__unitWeapID_dmgpt1[s]=0.83
        set s=s__unitWeapID_getFromKey('nbdk')
        set s__unitWeapID_dmgpt1[s]=0.94
        set s=s__unitWeapID_getFromKey('nbdm')
        set s__unitWeapID_dmgpt1[s]=0.83
        set s=s__unitWeapID_getFromKey('nbdo')
        set s__unitWeapID_dmgpt1[s]=0.83
        set s=s__unitWeapID_getFromKey('nbdr')
        set s__unitWeapID_dmgpt1[s]=0.94
        set s=s__unitWeapID_getFromKey('nbds')
        set s__unitWeapID_dmgpt1[s]=0.83
        set s=s__unitWeapID_getFromKey('nbdw')
        set s__unitWeapID_dmgpt1[s]=0.83
        set s=s__unitWeapID_getFromKey('nbld')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nbnb')
        set s=s__unitWeapID_getFromKey('nbot')
        set s=s__unitWeapID_getFromKey('nbrg')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nbwm')
        set s__unitWeapID_dmgpt1[s]=0.94
        set s=s__unitWeapID_getFromKey('nbzd')
        set s__unitWeapID_dmgpt1[s]=0.94
        set s=s__unitWeapID_getFromKey('nbzk')
        set s__unitWeapID_dmgpt1[s]=0.94
        set s=s__unitWeapID_getFromKey('nbzw')
        set s__unitWeapID_dmgpt1[s]=0.94
        set s=s__unitWeapID_getFromKey('ncea')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('ncen')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('ncer')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('ncfs')
        set s__unitWeapID_dmgpt1[s]=0.38
        set s=s__unitWeapID_getFromKey('ncim')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('ncks')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('ncnk')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('ndqn')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('ndqp')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('ndqs')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('ndqt')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('ndqv')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('ndrv')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('ndtb')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('ndth')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('ndtp')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('ndtr')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('ndtt')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('ndtw')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nehy')
        set s__unitWeapID_dmgpt1[s]=0.7
        set s=s__unitWeapID_getFromKey('nelb')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('nele')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('nenc')
        set s__unitWeapID_dmgpt1[s]=0.467
        set s=s__unitWeapID_getFromKey('nenf')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nenp')
        set s__unitWeapID_dmgpt1[s]=0.467
        set s=s__unitWeapID_getFromKey('nepl')
        set s__unitWeapID_dmgpt1[s]=0.467
        set s=s__unitWeapID_getFromKey('nerd')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('ners')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nerw')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nfel')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('nfgb')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('nfgo')
        set s__unitWeapID_dmgpt1[s]=0.26
        set s=s__unitWeapID_getFromKey('nfgt')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('nfgu')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('nfod')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nfor')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nfot')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nfov')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('nfpc')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nfpe')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nfpl')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nfps')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nfpt')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nfpu')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nfra')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nfrb')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nfre')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nfrg')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nfrl')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nfrp')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nfrs')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nfsh')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nfsp')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nftb')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nftk')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nftr')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nftt')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('ngdk')
        set s__unitWeapID_dmgpt1[s]=0.94
        set s=s__unitWeapID_getFromKey('nggr')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('ngh1')
        set s__unitWeapID_dmgpt1[s]=0.56
        set s=s__unitWeapID_getFromKey('ngh2')
        set s__unitWeapID_dmgpt1[s]=0.56
        set s=s__unitWeapID_getFromKey('ngir')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nglm')
        set s=s__unitWeapID_getFromKey('ngna')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('ngnb')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('ngno')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('ngns')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('ngnv')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('ngnw')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('ngrd')
        set s__unitWeapID_dmgpt1[s]=0.94
        set s=s__unitWeapID_getFromKey('ngrk')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('ngrw')
        set s__unitWeapID_dmgpt1[s]=0.94
        set s=s__unitWeapID_getFromKey('ngsp')
        set s=s__unitWeapID_getFromKey('ngst')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nhar')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nhdc')
        set s__unitWeapID_dmgpt1[s]=0.53
        set s=s__unitWeapID_getFromKey('nhfp')
        set s__unitWeapID_dmgpt1[s]=0.53
        set s=s__unitWeapID_getFromKey('nhhr')
        set s__unitWeapID_dmgpt1[s]=0.53
        set s=s__unitWeapID_getFromKey('nhrh')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nhrq')
        set s__unitWeapID_dmgpt1[s]=0.35
        set s=s__unitWeapID_getFromKey('nhrr')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nhrw')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nhyc')
        set s__unitWeapID_dmgpt1[s]=0.7
        set s=s__unitWeapID_getFromKey('nhyd')
        set s__unitWeapID_dmgpt1[s]=0.7
        set s=s__unitWeapID_getFromKey('nhyh')
        set s__unitWeapID_dmgpt1[s]=0.7
        set s=s__unitWeapID_getFromKey('nina')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('ninc')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('ninf')
        set s__unitWeapID_dmgpt1[s]=0.26
        set s=s__unitWeapID_getFromKey('ninm')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nith')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nitp')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nitr')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nits')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nitt')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nitw')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('njgb')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('njga')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('njg1')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nkob')
        set s__unitWeapID_dmgpt1[s]=0.38
        set s=s__unitWeapID_getFromKey('nkog')
        set s__unitWeapID_dmgpt1[s]=0.38
        set s=s__unitWeapID_getFromKey('nkol')
        set s__unitWeapID_dmgpt1[s]=0.38
        set s=s__unitWeapID_getFromKey('nkot')
        set s__unitWeapID_dmgpt1[s]=0.38
        set s=s__unitWeapID_getFromKey('nlds')
        set s__unitWeapID_dmgpt1[s]=0.53
        set s=s__unitWeapID_getFromKey('nlkl')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nlpd')
        set s__unitWeapID_dmgpt1[s]=0.66
        set s=s__unitWeapID_getFromKey('nlpr')
        set s__unitWeapID_dmgpt1[s]=0.38
        set s=s__unitWeapID_getFromKey('nlps')
        set s__unitWeapID_dmgpt1[s]=0.38
        set s=s__unitWeapID_getFromKey('nlrv')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('nlsn')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nltc')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nltl')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nlur')
        set s=s__unitWeapID_getFromKey('nmam')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nmbg')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('nmcf')
        set s__unitWeapID_dmgpt1[s]=0.38
        set s=s__unitWeapID_getFromKey('nmdr')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nmfs')
        set s__unitWeapID_dmgpt1[s]=0.66
        set s=s__unitWeapID_getFromKey('nmgd')
        set s__unitWeapID_dmgpt1[s]=0.66
        set s=s__unitWeapID_getFromKey('nmgr')
        set s__unitWeapID_dmgpt1[s]=0.66
        set s=s__unitWeapID_getFromKey('nmgw')
        set s__unitWeapID_dmgpt1[s]=0.66
        set s=s__unitWeapID_getFromKey('nmit')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nmmu')
        set s__unitWeapID_dmgpt1[s]=0.66
        set s=s__unitWeapID_getFromKey('nmpg')
        set s__unitWeapID_dmgpt1[s]=0.66
        set s=s__unitWeapID_getFromKey('nmrm')
        set s__unitWeapID_dmgpt1[s]=0.66
        set s=s__unitWeapID_getFromKey('nmrr')
        set s__unitWeapID_dmgpt1[s]=0.66
        set s=s__unitWeapID_getFromKey('nmrv')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('nmsc')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('nmsh')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nmtw')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('nmyr')
        set s__unitWeapID_dmgpt1[s]=0.36
        set s=s__unitWeapID_getFromKey('nmys')
        set s=s__unitWeapID_getFromKey('nnad')
        set s=s__unitWeapID_getFromKey('nndr')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('nnfm')
        set s=s__unitWeapID_getFromKey('nnmg')
        set s__unitWeapID_dmgpt1[s]=0.7
        set s=s__unitWeapID_getFromKey('nnrg')
        set s__unitWeapID_dmgpt1[s]=0.36
        set s=s__unitWeapID_getFromKey('nnrs')
        set s=s__unitWeapID_getFromKey('nnsa')
        set s=s__unitWeapID_getFromKey('nnsw')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nntg')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('nnwl')
        set s__unitWeapID_dmgpt1[s]=0.64
        set s=s__unitWeapID_getFromKey('nnwq')
        set s__unitWeapID_dmgpt1[s]=0.64
        set s=s__unitWeapID_getFromKey('nnwr')
        set s__unitWeapID_dmgpt1[s]=0.64
        set s=s__unitWeapID_getFromKey('nnws')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nnzg')
        set s=s__unitWeapID_getFromKey('nogl')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nogm')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nogn')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nogo')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nogr')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nomg')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('now2')
        set s=s__unitWeapID_getFromKey('nowe')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nowk')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nowl')
        set s=s__unitWeapID_getFromKey('npfm')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('npgf')
        set s=s__unitWeapID_getFromKey('Npld')
        set s__unitWeapID_dmgpt1[s]=0.8
        set s=s__unitWeapID_getFromKey('Nplh')
        set s__unitWeapID_dmgpt1[s]=0.8
        set s=s__unitWeapID_getFromKey('Nfir')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nlv1')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('nlv2')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('nlv3')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('nrat')
        set s=s__unitWeapID_getFromKey('nrdr')
        set s__unitWeapID_dmgpt1[s]=0.94
        set s=s__unitWeapID_getFromKey('nrel')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nrmf')
        set s=s__unitWeapID_getFromKey('nrog')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nrvd')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('nrvf')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('nrvi')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('nrvl')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('nrvs')
        set s__unitWeapID_dmgpt1[s]=0.65
        set s=s__unitWeapID_getFromKey('nrwm')
        set s__unitWeapID_dmgpt1[s]=0.94
        set s=s__unitWeapID_getFromKey('nrzb')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('nrzg')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nrzm')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nrzs')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nrzt')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('nsat')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nsbm')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nsbs')
        set s=s__unitWeapID_getFromKey('nsc2')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nsc3')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nscb')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nsel')
        set s__unitWeapID_dmgpt1[s]=0.53
        set s=s__unitWeapID_getFromKey('nsgb')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('nsgg')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nsgh')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('nsgn')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('nsgt')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nska')
        set s__unitWeapID_dmgpt1[s]=0.7
        set s=s__unitWeapID_getFromKey('nske')
        set s__unitWeapID_dmgpt1[s]=0.56
        set s=s__unitWeapID_getFromKey('nsca')
        set s__unitWeapID_dmgpt1[s]=0.7
        set s=s__unitWeapID_getFromKey('nsce')
        set s__unitWeapID_dmgpt1[s]=0.56
        set s=s__unitWeapID_getFromKey('nskf')
        set s__unitWeapID_dmgpt1[s]=0.7
        set s=s__unitWeapID_getFromKey('nskg')
        set s__unitWeapID_dmgpt1[s]=0.56
        set s=s__unitWeapID_getFromKey('nskm')
        set s__unitWeapID_dmgpt1[s]=0.7
        set s=s__unitWeapID_getFromKey('nsko')
        set s__unitWeapID_dmgpt1[s]=0.56
        set s=s__unitWeapID_getFromKey('nslf')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nslh')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nsll')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nslm')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nsln')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nslr')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nslv')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nsnp')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nsns')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('nsoc')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('nsog')
        set s__unitWeapID_dmgpt1[s]=0.56
        set s=s__unitWeapID_getFromKey('nspb')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nspd')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nspg')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nspp')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('nspr')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nsqa')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nsqe')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nsqo')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nsqt')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nsra')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nsrh')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nsrn')
        set s__unitWeapID_dmgpt1[s]=0.53
        set s=s__unitWeapID_getFromKey('nsrv')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('nsrw')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nssp')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('nsth')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nstl')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nsts')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nstw')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nsty')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nthl')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('ntka')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('ntkc')
        set s__unitWeapID_dmgpt1[s]=0.36
        set s=s__unitWeapID_getFromKey('ntkf')
        set s__unitWeapID_dmgpt1[s]=0.36
        set s=s__unitWeapID_getFromKey('ntkh')
        set s__unitWeapID_dmgpt1[s]=0.36
        set s=s__unitWeapID_getFromKey('ntks')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('ntkt')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('ntkw')
        set s__unitWeapID_dmgpt1[s]=0.36
        set s=s__unitWeapID_getFromKey('ntor')
        set s=s__unitWeapID_getFromKey('ntrd')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('ntrg')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('ntrh')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('ntrs')
        set s__unitWeapID_dmgpt1[s]=0.66
        set s=s__unitWeapID_getFromKey('ntrt')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('ntrv')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('ntws')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('nubk')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nubr')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nubw')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nvde')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nvdg')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nvdl')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nvdw')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nwen')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nwgs')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('nwiz')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nwld')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('nwlg')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('nwlt')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('nwna')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nwnr')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nwns')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nwrg')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nws1')
        set s__unitWeapID_dmgpt1[s]=0.43
        set s=s__unitWeapID_getFromKey('nwwd')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('nwwf')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('nwwg')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('nwzd')
        set s__unitWeapID_dmgpt1[s]=0.55
        set s=s__unitWeapID_getFromKey('nwzg')
        set s__unitWeapID_dmgpt1[s]=0.55
        set s=s__unitWeapID_getFromKey('nwzr')
        set s__unitWeapID_dmgpt1[s]=0.55
        set s=s__unitWeapID_getFromKey('nzep')
        set s=s__unitWeapID_getFromKey('nzom')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nhym')
        set s__unitWeapID_dmgpt1[s]=0.55
        set s=s__unitWeapID_getFromKey('nchp')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nalb')
        set s=s__unitWeapID_getFromKey('ncrb')
        set s=s__unitWeapID_getFromKey('nech')
        set s=s__unitWeapID_getFromKey('nfro')
        set s=s__unitWeapID_getFromKey('necr')
        set s=s__unitWeapID_getFromKey('nrac')
        set s=s__unitWeapID_getFromKey('nder')
        set s=s__unitWeapID_getFromKey('ndog')
        set s=s__unitWeapID_getFromKey('ndwm')
        set s=s__unitWeapID_getFromKey('nfbr')
        set s=s__unitWeapID_getFromKey('nhmc')
        set s=s__unitWeapID_getFromKey('now3')
        set s=s__unitWeapID_getFromKey('nowb')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('Npbm')
        set s__unitWeapID_dmgpt1[s]=0.35
        set s=s__unitWeapID_getFromKey('Nalc')
        set s__unitWeapID_dmgpt1[s]=0.35
        set s=s__unitWeapID_getFromKey('Nalm')
        set s__unitWeapID_dmgpt1[s]=0.35
        set s=s__unitWeapID_getFromKey('Nal2')
        set s__unitWeapID_dmgpt1[s]=0.35
        set s=s__unitWeapID_getFromKey('Nal3')
        set s__unitWeapID_dmgpt1[s]=0.35
        set s=s__unitWeapID_getFromKey('Ntin')
        set s__unitWeapID_dmgpt1[s]=0.35
        set s=s__unitWeapID_getFromKey('Nrob')
        set s__unitWeapID_dmgpt1[s]=0.35
        set s=s__unitWeapID_getFromKey('ncgb')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('ncg1')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('ncg2')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('ncg3')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('nfac')
        set s=s__unitWeapID_getFromKey('nfa1')
        set s=s__unitWeapID_getFromKey('nfa2')
        set s=s__unitWeapID_getFromKey('nplb')
        set s__unitWeapID_dmgpt1[s]=0.63
        set s=s__unitWeapID_getFromKey('npnw')
        set s=s__unitWeapID_getFromKey('nqb1')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nrdk')
        set s__unitWeapID_dmgpt1[s]=0.94
        set s=s__unitWeapID_getFromKey('nsea')
        set s=s__unitWeapID_getFromKey('nsha')
        set s=s__unitWeapID_getFromKey('nshe')
        set s=s__unitWeapID_getFromKey('nshf')
        set s=s__unitWeapID_getFromKey('nshw')
        set s=s__unitWeapID_getFromKey('nskk')
        set s=s__unitWeapID_getFromKey('nsno')
        set s=s__unitWeapID_getFromKey('nvil')
        set s=s__unitWeapID_getFromKey('nvk2')
        set s=s__unitWeapID_getFromKey('nvl2')
        set s=s__unitWeapID_getFromKey('nvlk')
        set s=s__unitWeapID_getFromKey('nvlw')
        set s=s__unitWeapID_getFromKey('nvul')
        set s=s__unitWeapID_getFromKey('ncb0')
        set s=s__unitWeapID_getFromKey('ncb1')
        set s=s__unitWeapID_getFromKey('ncb2')
        set s=s__unitWeapID_getFromKey('ncb3')
        set s=s__unitWeapID_getFromKey('ncb4')
        set s=s__unitWeapID_getFromKey('ncb5')
        set s=s__unitWeapID_getFromKey('ncb6')
        set s=s__unitWeapID_getFromKey('ncb7')
        set s=s__unitWeapID_getFromKey('ncb8')
        set s=s__unitWeapID_getFromKey('ncb9')
        set s=s__unitWeapID_getFromKey('ncba')
        set s=s__unitWeapID_getFromKey('ncbb')
        set s=s__unitWeapID_getFromKey('ncbc')
        set s=s__unitWeapID_getFromKey('ncbd')
        set s=s__unitWeapID_getFromKey('ncbe')
        set s=s__unitWeapID_getFromKey('ncbf')
        set s=s__unitWeapID_getFromKey('ncnt')
        set s=s__unitWeapID_getFromKey('ncop')
        set s=s__unitWeapID_getFromKey('ncp2')
        set s=s__unitWeapID_getFromKey('ncp3')
        set s=s__unitWeapID_getFromKey('nct1')
        set s=s__unitWeapID_getFromKey('nct2')
        set s=s__unitWeapID_getFromKey('ndch')
        set s=s__unitWeapID_getFromKey('ndh0')
        set s=s__unitWeapID_getFromKey('ndh1')
        set s=s__unitWeapID_getFromKey('ndh2')
        set s=s__unitWeapID_getFromKey('ndh3')
        set s=s__unitWeapID_getFromKey('ndh4')
        set s=s__unitWeapID_getFromKey('ndrg')
        set s=s__unitWeapID_getFromKey('ndrk')
        set s=s__unitWeapID_getFromKey('ndro')
        set s=s__unitWeapID_getFromKey('ndrr')
        set s=s__unitWeapID_getFromKey('ndru')
        set s=s__unitWeapID_getFromKey('ndrz')
        set s=s__unitWeapID_getFromKey('nfh0')
        set s=s__unitWeapID_getFromKey('nfh1')
        set s=s__unitWeapID_getFromKey('nfoh')
        set s=s__unitWeapID_getFromKey('nfr1')
        set s=s__unitWeapID_getFromKey('nfr2')
        set s=s__unitWeapID_getFromKey('ngad')
        set s=s__unitWeapID_getFromKey('ngme')
        set s=s__unitWeapID_getFromKey('ngnh')
        set s=s__unitWeapID_getFromKey('ngni')
        set s=s__unitWeapID_getFromKey('ngol')
        set s=s__unitWeapID_getFromKey('ngt2')
        set s=s__unitWeapID_getFromKey('ngwr')
        set s=s__unitWeapID_getFromKey('nhns')
        set s=s__unitWeapID_getFromKey('nmer')
        set s=s__unitWeapID_getFromKey('nmg0')
        set s=s__unitWeapID_getFromKey('nmg1')
        set s=s__unitWeapID_getFromKey('nmh0')
        set s=s__unitWeapID_getFromKey('nmh1')
        set s=s__unitWeapID_getFromKey('nmoo')
        set s=s__unitWeapID_getFromKey('nmr0')
        set s=s__unitWeapID_getFromKey('nmr2')
        set s=s__unitWeapID_getFromKey('nmr3')
        set s=s__unitWeapID_getFromKey('nmr4')
        set s=s__unitWeapID_getFromKey('nmr5')
        set s=s__unitWeapID_getFromKey('nmr6')
        set s=s__unitWeapID_getFromKey('nmr7')
        set s=s__unitWeapID_getFromKey('nmr8')
        set s=s__unitWeapID_getFromKey('nmr9')
        set s=s__unitWeapID_getFromKey('nmra')
        set s=s__unitWeapID_getFromKey('nmrb')
        set s=s__unitWeapID_getFromKey('nmrc')
        set s=s__unitWeapID_getFromKey('nmrd')
        set s=s__unitWeapID_getFromKey('nmre')
        set s=s__unitWeapID_getFromKey('nmrf')
        set s=s__unitWeapID_getFromKey('nmrk')
        set s=s__unitWeapID_getFromKey('nmrl')
        set s__unitWeapID_dmgpt1[s]=0.66
        set s=s__unitWeapID_getFromKey('noga')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nshp')
        set s=s__unitWeapID_getFromKey('ntav')
        set s=s__unitWeapID_getFromKey('nten')
        set s=s__unitWeapID_getFromKey('nth0')
        set s=s__unitWeapID_getFromKey('nth1')
        set s=s__unitWeapID_getFromKey('ntn2')
        set s=s__unitWeapID_getFromKey('ntnt')
        set s=s__unitWeapID_getFromKey('ntt2')
        set s=s__unitWeapID_getFromKey('nwgt')
        set s=s__unitWeapID_getFromKey('Ecen')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('Eevi')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('Eevm')
        set s__unitWeapID_dmgpt1[s]=0.26
        set s=s__unitWeapID_getFromKey('Efur')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('Eidm')
        set s__unitWeapID_dmgpt1[s]=0.26
        set s=s__unitWeapID_getFromKey('Eill')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('Eilm')
        set s__unitWeapID_dmgpt1[s]=0.26
        set s=s__unitWeapID_getFromKey('Ekgg')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('Emfr')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('Emns')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('Etyr')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('Ewrd')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('Hant')
        set s__unitWeapID_dmgpt1[s]=0.55
        set s=s__unitWeapID_getFromKey('Hapm')
        set s__unitWeapID_dmgpt1[s]=0.433
        set s=s__unitWeapID_getFromKey('Harf')
        set s__unitWeapID_dmgpt1[s]=0.433
        set s=s__unitWeapID_getFromKey('Hart')
        set s__unitWeapID_dmgpt1[s]=0.433
        set s=s__unitWeapID_getFromKey('Hdgo')
        set s__unitWeapID_dmgpt1[s]=0.433
        set s=s__unitWeapID_getFromKey('Hhkl')
        set s__unitWeapID_dmgpt1[s]=0.433
        set s=s__unitWeapID_getFromKey('Hjai')
        set s__unitWeapID_dmgpt1[s]=0.55
        set s=s__unitWeapID_getFromKey('Hkal')
        set s__unitWeapID_dmgpt1[s]=0.55
        set s=s__unitWeapID_getFromKey('Hlgr')
        set s__unitWeapID_dmgpt1[s]=0.433
        set s=s__unitWeapID_getFromKey('Hmbr')
        set s__unitWeapID_dmgpt1[s]=0.633
        set s=s__unitWeapID_getFromKey('Hmgd')
        set s__unitWeapID_dmgpt1[s]=0.433
        set s=s__unitWeapID_getFromKey('Hpb1')
        set s__unitWeapID_dmgpt1[s]=0.433
        set s=s__unitWeapID_getFromKey('Hpb2')
        set s__unitWeapID_dmgpt1[s]=0.433
        set s=s__unitWeapID_getFromKey('Huth')
        set s__unitWeapID_dmgpt1[s]=0.433
        set s=s__unitWeapID_getFromKey('Hvsh')
        set s__unitWeapID_dmgpt1[s]=0.73
        set s=s__unitWeapID_getFromKey('Hvwd')
        set s__unitWeapID_dmgpt1[s]=0.7
        set s=s__unitWeapID_getFromKey('Nbbc')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('Nklj')
        set s__unitWeapID_dmgpt1[s]=0.55
        set s=s__unitWeapID_getFromKey('Nkjx')
        set s__unitWeapID_dmgpt1[s]=0.55
        set s=s__unitWeapID_getFromKey('Nmag')
        set s__unitWeapID_dmgpt1[s]=0.8
        set s=s__unitWeapID_getFromKey('Nman')
        set s__unitWeapID_dmgpt1[s]=0.833
        set s=s__unitWeapID_getFromKey('nplg')
        set s__unitWeapID_dmgpt1[s]=0.63
        set s=s__unitWeapID_getFromKey('Nsjs')
        set s__unitWeapID_dmgpt1[s]=0.35
        set s=s__unitWeapID_getFromKey('Ocbh')
        set s__unitWeapID_dmgpt1[s]=0.36
        set s=s__unitWeapID_getFromKey('Ocb2')
        set s__unitWeapID_dmgpt1[s]=0.36
        set s=s__unitWeapID_getFromKey('Odrt')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('Ogld')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('Ogrh')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('Opgh')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('Orex')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('Orkn')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('Osam')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('Otcc')
        set s__unitWeapID_dmgpt1[s]=0.36
        set s=s__unitWeapID_getFromKey('Othr')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('Uanb')
        set s__unitWeapID_dmgpt1[s]=0.46
        set s=s__unitWeapID_getFromKey('Ubal')
        set s__unitWeapID_dmgpt1[s]=0.55
        set s=s__unitWeapID_getFromKey('Uclc')
        set s__unitWeapID_dmgpt1[s]=0.46
        set s=s__unitWeapID_getFromKey('Udth')
        set s__unitWeapID_dmgpt1[s]=0.55
        set s=s__unitWeapID_getFromKey('Uear')
        set s__unitWeapID_dmgpt1[s]=0.56
        set s=s__unitWeapID_getFromKey('Uktl')
        set s__unitWeapID_dmgpt1[s]=0.46
        set s=s__unitWeapID_getFromKey('Umal')
        set s__unitWeapID_dmgpt1[s]=0.55
        set s=s__unitWeapID_getFromKey('Usyl')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('Utic')
        set s__unitWeapID_dmgpt1[s]=0.55
        set s=s__unitWeapID_getFromKey('Uvar')
        set s__unitWeapID_dmgpt1[s]=0.55
        set s=s__unitWeapID_getFromKey('Uvng')
        set s__unitWeapID_dmgpt1[s]=0.55
        set s=s__unitWeapID_getFromKey('Uwar')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('Hgam')
        set s__unitWeapID_dmgpt1[s]=0.55
        set s=s__unitWeapID_getFromKey('eilw')
        set s=s__unitWeapID_getFromKey('enec')
        set s=s__unitWeapID_getFromKey('ensh')
        set s__unitWeapID_dmgpt1[s]=0.46
        set s=s__unitWeapID_getFromKey('eshd')
        set s__unitWeapID_dmgpt1[s]=0.72
        set s=s__unitWeapID_getFromKey('etrs')
        set s=s__unitWeapID_getFromKey('hbew')
        set s=s__unitWeapID_getFromKey('hcth')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('hhdl')
        set s=s__unitWeapID_getFromKey('hhes')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('hrdh')
        set s=s__unitWeapID_getFromKey('Naka')
        set s__unitWeapID_dmgpt1[s]=0.59
        set s=s__unitWeapID_getFromKey('nsw1')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('nsw2')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('nsw3')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('ncat')
        set s__unitWeapID_dmgpt1[s]=0.1
        set s=s__unitWeapID_getFromKey('nbee')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nbel')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nbsp')
        set s=s__unitWeapID_getFromKey('nchg')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('nchr')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nchw')
        set s__unitWeapID_dmgpt1[s]=0.43
        set s=s__unitWeapID_getFromKey('nckb')
        set s__unitWeapID_dmgpt1[s]=0.85
        set s=s__unitWeapID_getFromKey('ncpn')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('ndmu')
        set s__unitWeapID_dmgpt1[s]=0.39
        set s=s__unitWeapID_getFromKey('ndrd')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('ndrn')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('ndrt')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('ndrf')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('ndrh')
        set s__unitWeapID_dmgpt1[s]=0.59
        set s=s__unitWeapID_getFromKey('ndrj')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('ndrm')
        set s__unitWeapID_dmgpt1[s]=0.59
        set s=s__unitWeapID_getFromKey('ndrp')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('ndrs')
        set s__unitWeapID_dmgpt1[s]=0.59
        set s=s__unitWeapID_getFromKey('ndrw')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('ndrl')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('ndsa')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('negz')
        set s=s__unitWeapID_getFromKey('nemi')
        set s__unitWeapID_dmgpt1[s]=0.59
        set s=s__unitWeapID_getFromKey('nfgl')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('ngbl')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nhea')
        set s__unitWeapID_dmgpt1[s]=0.72
        set s=s__unitWeapID_getFromKey('nhef')
        set s=s__unitWeapID_getFromKey('nhem')
        set s=s__unitWeapID_getFromKey('nhew')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('njks')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nmdm')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('nmed')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('nmpe')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nmsn')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('nser')
        set s__unitWeapID_dmgpt1[s]=0.94
        set s=s__unitWeapID_getFromKey('nspc')
        set s=s__unitWeapID_getFromKey('nssn')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nthr')
        set s__unitWeapID_dmgpt1[s]=0.94
        set s=s__unitWeapID_getFromKey('nw2w')
        set s__unitWeapID_dmgpt1[s]=0.43
        set s=s__unitWeapID_getFromKey('nwat')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('odkt')
        set s__unitWeapID_dmgpt1[s]=0.53
        set s=s__unitWeapID_getFromKey('ogrk')
        set s__unitWeapID_dmgpt1[s]=0.33
        set s=s__unitWeapID_getFromKey('ojgn')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('omtg')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('onzg')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('oosc')
        set s=s__unitWeapID_getFromKey('oswy')
        set s=s__unitWeapID_getFromKey('ovlj')
        set s__unitWeapID_dmgpt1[s]=0.73
        set s=s__unitWeapID_getFromKey('owar')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('ownr')
        set s__unitWeapID_dmgpt1[s]=0.6
        set s=s__unitWeapID_getFromKey('uabc')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('uarb')
        set s=s__unitWeapID_getFromKey('ubdd')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('ubdr')
        set s__unitWeapID_dmgpt1[s]=0.94
        set s=s__unitWeapID_getFromKey('ubot')
        set s=s__unitWeapID_getFromKey('udes')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('uktg')
        set s=s__unitWeapID_getFromKey('uktn')
        set s__unitWeapID_dmgpt1[s]=0.53
        set s=s__unitWeapID_getFromKey('uswb')
        set s__unitWeapID_dmgpt1[s]=0.56
        set s=s__unitWeapID_getFromKey('hprt')
        set s=s__unitWeapID_getFromKey('haro')
        set s=s__unitWeapID_getFromKey('nbfl')
        set s=s__unitWeapID_getFromKey('nbsm')
        set s=s__unitWeapID_getFromKey('nbt1')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nbt2')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nbwd')
        set s=s__unitWeapID_getFromKey('ncap')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('ncaw')
        set s__unitWeapID_dmgpt1[s]=0.59
        set s=s__unitWeapID_getFromKey('ncmw')
        set s=s__unitWeapID_getFromKey('ncta')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('ncte')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('nctl')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('ndfl')
        set s=s__unitWeapID_getFromKey('ndgt')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('ndke')
        set s=s__unitWeapID_getFromKey('ndkw')
        set s=s__unitWeapID_getFromKey('ndmg')
        set s=s__unitWeapID_getFromKey('ndrb')
        set s=s__unitWeapID_getFromKey('ndt1')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('ndt2')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nef0')
        set s=s__unitWeapID_getFromKey('nef1')
        set s=s__unitWeapID_getFromKey('nef2')
        set s=s__unitWeapID_getFromKey('nef3')
        set s=s__unitWeapID_getFromKey('nef4')
        set s=s__unitWeapID_getFromKey('nef5')
        set s=s__unitWeapID_getFromKey('nef6')
        set s=s__unitWeapID_getFromKey('nef7')
        set s=s__unitWeapID_getFromKey('nefm')
        set s=s__unitWeapID_getFromKey('negf')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('negm')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('negt')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('net1')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('net2')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nfnp')
        set s=s__unitWeapID_getFromKey('nfrm')
        set s=s__unitWeapID_getFromKey('nfrt')
        set s=s__unitWeapID_getFromKey('nft1')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nft2')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nfv0')
        set s=s__unitWeapID_getFromKey('nfv1')
        set s=s__unitWeapID_getFromKey('nfv2')
        set s=s__unitWeapID_getFromKey('nfv3')
        set s=s__unitWeapID_getFromKey('nfv4')
        set s=s__unitWeapID_getFromKey('ngob')
        set s=s__unitWeapID_getFromKey('nhcn')
        set s=s__unitWeapID_getFromKey('nheb')
        set s=s__unitWeapID_getFromKey('nico')
        set s=s__unitWeapID_getFromKey('nitb')
        set s=s__unitWeapID_getFromKey('nmgv')
        set s=s__unitWeapID_getFromKey('nndk')
        set s__unitWeapID_dmgpt1[s]=0.4
        set s=s__unitWeapID_getFromKey('Nngs')
        set s__unitWeapID_dmgpt1[s]=0.73
        set s=s__unitWeapID_getFromKey('nnsg')
        set s=s__unitWeapID_getFromKey('nnsu')
        set s__unitWeapID_dmgpt1[s]=0.5
        set s=s__unitWeapID_getFromKey('nntt')
        set s=s__unitWeapID_getFromKey('nnwa')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('npgr')
        set s=s__unitWeapID_getFromKey('npig')
        set s=s__unitWeapID_getFromKey('nshr')
        set s=s__unitWeapID_getFromKey('ntt1')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('ntx2')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nvr0')
        set s=s__unitWeapID_getFromKey('nvr1')
        set s=s__unitWeapID_getFromKey('nvr2')
        set s=s__unitWeapID_getFromKey('nwc1')
        set s=s__unitWeapID_getFromKey('nwc2')
        set s=s__unitWeapID_getFromKey('ocbw')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nzin')
        set s=s__unitWeapID_getFromKey('nbse')
        set s=s__unitWeapID_getFromKey('nbsw')
        set s=s__unitWeapID_getFromKey('zcso')
        set s__unitWeapID_dmgpt1[s]=0.17
        set s=s__unitWeapID_getFromKey('zhyd')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('zjug')
        set s__unitWeapID_dmgpt1[s]=0.17
        set s=s__unitWeapID_getFromKey('zmar')
        set s__unitWeapID_dmgpt1[s]=0.17
        set s=s__unitWeapID_getFromKey('zshv')
        set s__unitWeapID_dmgpt1[s]=0.38
        set s=s__unitWeapID_getFromKey('zsmc')
        set s__unitWeapID_dmgpt1[s]=0.55
        set s=s__unitWeapID_getFromKey('zzrg')
        set s__unitWeapID_dmgpt1[s]=0.3
        set s=s__unitWeapID_getFromKey('nzlc')
    endfunction
endlibrary
Cassiel is offline   Reply With Quote
Old 08-29-2009, 10:38 AM   #3 (permalink)
Registered User Viikuna
User
 
Viikuna's Avatar
 
Join Date: Aug 2008
Posts: 338
Viikuna is on a distinguished road (61)Viikuna is on a distinguished road (61)
This is like one of the coolest systems ever.
__________________
No Marlo, no game.
Viikuna is offline   Reply With Quote
Old 08-29-2009, 11:14 AM   #4 (permalink)
Forum Moderator The_Reborn_Devil
SPELL MODERATOR
 
The_Reborn_Devil's Avatar
 
Join Date: Dec 2006
Posts: 874
The_Reborn_Devil is just really nice (332)The_Reborn_Devil is just really nice (332)The_Reborn_Devil is just really nice (332)
Holy Crap! That Evasion Module is insanely long!
__________________
I liek kittehz :D
The_Reborn_Devil is offline   Reply With Quote
Old 08-29-2009, 11:18 AM   #5 (permalink)
Registered User YourNameHere
wuts dis?
 
Join Date: Apr 2007
Posts: 594
YourNameHere has a spectacular aura about (120)YourNameHere has a spectacular aura about (120)YourNameHere has a spectacular aura about (120)YourNameHere has a spectacular aura about (120)
ok, just WOW
this is insane. Can't imagine how long all of this took.
__________________
--YourNameHere
YourNameHere is offline   Reply With Quote
Old 08-29-2009, 12:14 PM   #6 (permalink)
Registered User Cassiel
a.k.a. Litany
 
Cassiel's Avatar
 
Join Date: Mar 2004
Posts: 21
Cassiel has disabled reputation
If you read the comments to the Evasion Module you'll see how that works. It's really easy to generate all the data using JassHelper's //! loaddata command. To customize it to your map, all you have to do is use The Widgetizer to convert your map's object data to SLK format, then put the unit damage points in their own SLK and use //! loaddata to import them.

The reason this includes the damage points for all stock units is that it's so simple to import them. I took the SLK from War3Patch.mpq, cut out everything but the damage points, ran //! loaddata on it, then extracted the loaded data from war3map.j and pasted it directly into the library so it wouldn't have to be loaded again (which is why the ////! loaddata command is commented out by default).
Cassiel is offline   Reply With Quote
Old 08-30-2009, 12:26 AM   #7 (permalink)
Registered User PurplePoot
 
Join Date: Dec 2005
Posts: 10,057
PurplePoot has a brilliant future (1299)PurplePoot has a brilliant future (1299)PurplePoot has a brilliant future (1299)PurplePoot has a brilliant future (1299)PurplePoot has a brilliant future (1299)
Former Staff Member: This user used to be on the Hive Workshop staff. Respected User: This user has been given the respected user award. Paired Mapping Contest #4 - Winner: Fallen Angel - Lucifer's Keep Map Development Mini-Contest #1 - Winner: Stand of the Elements 
Wow, that's quite a mouthful. Anyhow, I have a few gripes with it (some of them are pretty major to the way it is structured, but they shouldn't be too hard to change):
  • In your Damage Points list (Evasion Module), you seem to have a bunch of garbage values (you create a struct and then don't actually use it because the unit in question does not have a damage point). I'll cite the list for an example of a useless block:

            set s=s__unitWeapID_getFromKey('hhou')
            set s=s__unitWeapID_getFromKey('hkee')
            set s=s__unitWeapID_getFromKey('hlum')
            set s=s__unitWeapID_getFromKey('hshy')
            set s=s__unitWeapID_getFromKey('htow')
            set s=s__unitWeapID_getFromKey('hvlt')
            set s=s__unitWeapID_getFromKey('hwtw')

    You may as well remove these and others--a relatively simple regex replace would do the job. The UnitGetDamagePoint code would have to be tweaked slightly to compensate, but that should be relatively easy and cut out a lot of garbage from the code.

    regexes
    First to replace the syntax with vJass:

    Find: s__unitWeapId_(\S*\s)
    Replace: unitWeapId.\1

    Then to clear out the garbage values (assumes vJass syntax):

    Find: set s=\S*\s*(?!set unitWeapId)
    Replace: (blank)

    If you are using a text editor which evaluates the replace on a line-by-line basis, the first replace is:

    Find: s__unitWeapId_(.*)
    Replace: unitWeapId.\1

    And the second is impossible.


  • In addition to the above, the damage point loader should really conform to proper vJass in that it should use the actual syntax rather than the compiled names (for example, set s = unitWeapID.getFromKey('Obla') rather than set s = s__unitWeapID_getFromKey('Obla'))--the current method is not necessarily forwards compatible, especially as vex has mentioned that he may be rewriting the structs phase soon and it is entirely possible that the naming scheme could be changed (and there is quite frankly no reason not to use the real syntax).

  • Finally (for the evasion module), you might as well just require TimerUtils as it is the de facto standard nowadays.

  • As for the actual system, the thing I primarily have a problem with is the textmacro abuse. While it makes sense for the generic wrappers (like UnitSetStr for those who dislike set unit:str and such), for the longer functions it needlessly extends the script, and could in fact be improved by considering the wrappers above. For example, rather than:

    Current
        //! textmacro UnitSetMaxState takes member, state
        function UnitModify$member$ takes unit u, real amount returns nothing
            local integer comp = 100
            local integer i = 4
            local integer abil = $state$
            if amount < 0 then
                set abil = abil + 2
                set amount = -amount
            endif
            set amount = R2I(amount)
            loop
                exitwhen i < 2
                 if amount >= comp then
                    loop
                        exitwhen amount < comp
                        call UnitAddAbility (u, abil)
                        call SetUnitAbilityLevel(u, abil, i)
                        call UnitRemoveAbility (u, abil)
                        set amount = amount - comp
                    endloop
                endif
                set comp = comp / 10
                set i = i - 1
            endloop
        endfunction

        function UnitSet$member$ takes unit u, real amount returns nothing
            local integer comp = 100
            local integer i = 4
            local integer abil = $state$
            local real r = GetUnitState(u, UNIT_STATE_$state$)
            if amount > r then
                set amount = R2I(amount - r)
            elseif amount < r then
                set amount = R2I(RAbsBJ(r - amount))
                set abil = abil + 2
            endif
            loop
                exitwhen i < 2
                 if amount >= comp then
                    loop
                        exitwhen amount < comp
                        call UnitAddAbility (u, abil)
                        call SetUnitAbilityLevel(u, abil, i)
                        call UnitRemoveAbility (u, abil)
                        set amount = amount - comp
                    endloop
                endif
                set comp = comp / 10
                set i = i - 1
            endloop
        endfunction

        function UnitGet$member$ takes unit u returns real
            return GetUnitState(u, UNIT_STATE_$state$)
        endfunction
        //! endtextmacro


    you could achieve the same with:

    Ideal?
    globals
        integer array max_state_abilities //[STATE_MAX_LIFE]='rawc' , [STATE_MAX_MANA]='rawc' , ...
        constant integer STATE_MAX_LIFE = 0
        constant integer STATE_MAX_MANA = 1
    endglobals
        function UnitModifyMaxState takes unit u, real amount, integer state returns nothing
            local integer comp = 100
            local integer i = 4
            local integer abil = max_state_abilites[state]
            if amount < 0 then
                set abil = abil + 2
                set amount = -amount
            endif
            set amount = R2I(amount)
            loop
                exitwhen i < 2
                 if amount >= comp then
                    loop
    exitwhen amount < comp
                        call UnitAddAbility (u, abil)
                        call SetUnitAbilityLevel(u, abil, i)
                        call UnitRemoveAbility (u, abil)
                        set amount = amount - comp
                    endloop
                endif
                set comp = comp / 10
                set i = i - 1
            endloop
        endfunction

        function UnitSetMaxState takes unit u, real amount, integer state returns nothing
            local integer comp = 100
            local integer i = 4
            local integer abil = max_state_abilities[state]
            local real r = GetUnitState(u, ConvertUnitState(1+2*state))
            if amount > r then
                set amount = R2I(amount - r)
            elseif amount < r then
                set amount = R2I(RAbsBJ(r - amount))
                set abil = abil + 2
            endif
            loop
                exitwhen i < 2
                 if amount >= comp then
                    loop
                        exitwhen amount < comp
                        call UnitAddAbility (u, abil)
                        call SetUnitAbilityLevel(u, abil, i)
                        call UnitRemoveAbility (u, abil)
                        set amount = amount - comp
                    endloop
                endif
                set comp = comp / 10
                set i = i - 1
            endloop
        endfunction
        //! textmacro UnitSetMaxState takes member, state
        function UnitModify$member$ takes unit u, real amount returns nothing
            call UnitModifyMaxState(u,amount,STATE_$state$)
        endfunction
        function UnitSet$member$ takes unit u, real amount returns nothing
            call UnitSetMaxState(u,amount,STATE_$state$)
        endfunction
        function UnitGet$member$ takes unit u returns real
            return GetUnitState(u, UNIT_STATE_$state$)
        endfunction
        //! endtextmacro


    This wasn't necessarily the best example (as it is not really extendable, unlike some of the ones oriented at modularity, and only spans two values), but I hope it gets the point across.

--

On a vaguely related note, could you please remove the first "line" (paragraph) from your post? Whether or not it is a jab at Wc3c (some will say it is, others will say it is not) it really isn't necessary and there's no point having anyone get worked up over it.

Last edited by PurplePoot; 08-30-2009 at 01:55 AM. Reason: Modern text editors are lame and do regexes line by line apparently
PurplePoot is offline   Reply With Quote
Old 08-30-2009, 04:16 AM   #8 (permalink)
Registered User aznricepuff
OOP freak.
 
Join Date: Feb 2006
Posts: 751
aznricepuff is a jewel in the rough (181)aznricepuff is a jewel in the rough (181)
Former Staff Member: This user used to be on the Hive Workshop staff. 
set unit:Str = value

Wow. That's the first time I've seen that particular syntax feature actually be useful.

But anyway...the evasion module can and most likely will bug from time to time, causing more units than the intended attacker to miss (unless in your map there's no possible way more than one unit can be attacking any given unit at the same time).
aznricepuff is offline   Reply With Quote
Old 08-30-2009, 08:15 AM   #9 (permalink)
Registered User Cassiel
a.k.a. Litany
 
Cassiel's Avatar
 
Join Date: Mar 2004
Posts: 21
Cassiel has disabled reputation
I'll be moving to a different state over the next few days, so this is just a quick response.

Quote:
Originally Posted by PurplePoot View Post
[list][*]In your Damage Points list (Evasion Module), you seem to have a bunch of garbage values (you create a struct and then don't actually use it because the unit in question does not have a damage point). I'll cite the list for an example of a useless block:

        set s=s__unitWeapID_getFromKey('hhou')
        set s=s__unitWeapID_getFromKey('hkee')
        set s=s__unitWeapID_getFromKey('hlum')
        set s=s__unitWeapID_getFromKey('hshy')
        set s=s__unitWeapID_getFromKey('htow')
        set s=s__unitWeapID_getFromKey('hvlt')
        set s=s__unitWeapID_getFromKey('hwtw')

You may as well remove these and others--a relatively simple regex replace would do the job. The UnitGetDamagePoint code would have to be tweaked slightly to compensate, but that should be relatively easy and cut out a lot of garbage from the code.
As I said, this data is generated by JassHelper itself (via //! loaddata), not me. Unless you're using this system in a ladder map you'll want to delete all the included data and replace it with data generated from your own SLK's. The ladder data is included purely as a demonstration of how //! loaddata works and what its output looks like.

Quote:
Originally Posted by PurplePoot View Post
[*]In addition to the above, the damage point loader should really conform to proper vJass in that it should use the actual syntax rather than the compiled names (for example, set s = unitWeapID.getFromKey('Obla') rather than set s = s__unitWeapID_getFromKey('Obla'))--the current method is not necessarily forwards compatible, especially as vex has mentioned that he may be rewriting the structs phase soon and it is entirely possible that the naming scheme could be changed (and there is quite frankly no reason not to use the real syntax).
Again, this is because the data is generated by JassHelper itself. Realistically, nobody is going to use that data. If you prefer I could not demonstrate what the pasted data looks like and instead attach the SLK and enable the //! loaddata command. Then the data will be compiled into the map script every time it's saved. The user has to get used to pasting their data over anyway so that may not be such a bad thing. I'll leave it up to you.

Quote:
Originally Posted by PurplePoot View Post
[*]Finally (for the evasion module), you might as well just require TimerUtils as it is the de facto standard nowadays.
Deleting the NewTimer and ReleaseTimer functions makes it TimerUtils compatible. I don't see the harm in leaving them as wrappers for the majority of people who use a TimerUtils alternative, though. But I should update the CSSafety comment to TimerUtils. I thought I already did that.

Quote:
Originally Posted by PurplePoot View Post
you could achieve the same with:
You could, and then users would have to type UnitModifyMaxState(unit, amount, STATE_MAX_LIFE) instead of just UnitModifyMaxLife(unit, amount). The UI is a question of preference, and my preference is for shorter lines. When I made the first version of this years ago it used those extra parameters, but I found that method tiresome. Yes, this way creates more code, but it's code that the MPQ compression factors out size-wise, and amount of code is not a performance bottleneck for JASS. Unit Properties 2 will support both options, but I'm submitting the original Unit Properties separately so that all the people PMing me about where to find it have somewhere to go.

Quote:
Originally Posted by aznricepuff View Post
But anyway...the evasion module can and most likely will bug from time to time, causing more units than the intended attacker to miss (unless in your map there's no possible way more than one unit can be attacking any given unit at the same time).
They would have to hit the unit in the exact same 0.0 instant, which doesn't appear to be possible. Don't take my word for it though. Have a go yourself.

(In case it's not clear from the code, the damage point timeout affects when the Evasion ability is applied, not how long it remains on the unit. It always remains on the unit for 0.0 seconds.)
Cassiel is offline   Reply With Quote
Old 08-30-2009, 08:31 AM   #10 (permalink)
Registered User Dreadnought[dA]
Map Maker Fanatic
 
Dreadnought[dA]'s Avatar
 
Join Date: Feb 2007
Posts: 789
Dreadnought[dA] is on a distinguished road (86)Dreadnought[dA] is on a distinguished road (86)
set unit:Str = value

What is that syntax? What does it do?
__________________
My internets has been invaded by liberals!

Dreadnought[dA] is offline   Reply With Quote
Old 08-30-2009, 10:36 AM   #11 (permalink)
Registered User Cassiel
a.k.a. Litany
 
Cassiel's Avatar
 
Join Date: Mar 2004
Posts: 21
Cassiel has disabled reputation
It's the same as calling UnitSetStr(unit, value). I didn't mention it in the API, but there's also a wrapper for getting a unit's id. unit:Id is the same as GetUnitId(unit), which is the same as GetHandleId(unit), although depending on their map's indexing system many people will want to change what GetUnitId wraps.

Anyway, the colon operator works like so:

local unit u = GetTriggerUnit()
//... do some stuff
set u:Str = u:Str + 4

You've just increased the unit's bonus Str by 4. Pretty simple.
Cassiel is offline   Reply With Quote
Old 08-30-2009, 05:08 PM   #12 (permalink)
Registered User aznricepuff
OOP freak.
 
Join Date: Feb 2006
Posts: 751
aznricepuff is a jewel in the rough (181)aznricepuff is a jewel in the rough (181)
Former Staff Member: This user used to be on the Hive Workshop staff. 
Quote:
They would have to hit the unit in the exact same 0.0 instant, which doesn't appear to be possible. Don't take my word for it though. Have a go yourself.

(In case it's not clear from the code, the damage point timeout affects when the Evasion ability is applied, not how long it remains on the unit. It always remains on the unit for 0.0 seconds.)
A 0.0 second timer doesn't actually fire in 0.0 seconds. It has to wait for any currently executing threads with higher priority to finish their run before the callback function can begin execution. I use a 0.0 second timer in my damage detection system and I found out pretty quickly (i.e. first test that I did) that if I didn't consider the possibility of multiple hits in that "0.0" second interval, the system freaked out because units WERE getting hit multiple times. And it's not like I had hundreds of units all attacking the same thing in that test either; it was just like 8 footmen attacking 8 grunts and vice versa.
aznricepuff is offline   Reply With Quote
Old 08-30-2009, 08:10 PM   #13 (permalink)
Registered User PurplePoot
 
Join Date: Dec 2005
Posts: 10,057
PurplePoot has a brilliant future (1299)PurplePoot has a brilliant future (1299)PurplePoot has a brilliant future (1299)PurplePoot has a brilliant future (1299)PurplePoot has a brilliant future (1299)
Former Staff Member: This user used to be on the Hive Workshop staff. Respected User: This user has been given the respected user award. Paired Mapping Contest #4 - Winner: Fallen Angel - Lucifer's Keep Map Development Mini-Contest #1 - Winner: Stand of the Elements 
I was actually suggesting you have wrappers for those who prefer the old syntax (as in the example), as that is pretty much a win-win situation (it's not like one extra function call, even if it doesn't get inlined, is of any speed concern in a system such as this). As for the evasion stuff, I see your point (I realize the data was generated by JH but I figured you had already run it through a rename), but in that case shouldn't the data be included separately (that's a lot of code for people to copy and then delete)?

As for the TUtils comment, that was originally aimed at helping the more clueless, but on second thought to profit from this system they would need it explained to them anyways.

Anyhow, I'll see about running a test to see whether the 0.0 thing is a problem and if so, how much.
PurplePoot is offline   Reply With Quote
Old 08-31-2009, 06:06 PM   #14 (permalink)
Registered User Troll-Brain
Anozer jasser
 
Join Date: Apr 2008
Posts: 244
Troll-Brain has little to show at this moment (15)Troll-Brain has little to show at this moment (15)
Just a precision, a 0 timer is in fact a 0.0001 timer, which is the lowest period ever possible.
You can try it yourself if you don't believe me. (increment a global integer variable in a 0.0001 periodic timer and an other one in a 0 timer, wait few seconds and display the values of the two integers, you will have the same result)
Troll-Brain is offline   Reply With Quote
Old 09-02-2009, 03:16 AM   #15 (permalink)
Registered User Cassiel
a.k.a. Litany
 
Cassiel's Avatar
 
Join Date: Mar 2004
Posts: 21
Cassiel has disabled reputation
Quote:
Originally Posted by aznricepuff View Post
A 0.0 second timer doesn't actually fire in 0.0 seconds. It has to wait for any currently executing threads with higher priority to finish their run before the callback function can begin execution. I use a 0.0 second timer in my damage detection system and I found out pretty quickly (i.e. first test that I did) that if I didn't consider the possibility of multiple hits in that "0.0" second interval, the system freaked out because units WERE getting hit multiple times. And it's not like I had hundreds of units all attacking the same thing in that test either; it was just like 8 footmen attacking 8 grunts and vice versa.
It is, like Troll-Brain says, a duration, not a yield. WC3 doesn't really have threads. I've never tested what the minimum timeout actually is, but .0001 sounds plausible enough. Damage detection is a different matter because damage events can fire from within other damage events and groups of units can also be damaged simultaneously from enums, by AoE, etc.

You can more or less get attacks to overlap by triggering a special test, but even then the results aren't uniform. With enough simultaneous attackers the Evasion will apply to extra attacks, but randomly and not for all attackers, if at all. That's in a test map. Outside of test map conditions where a lot of other things are going on I've never seen it misbehave.

Anyway after the addition of Lua to grimext I made a second Evasion Module flavor that generates 100 Evasion abilities from 1-100% and adds them to 100 Spell Books. I never released this one though because there are two issues with it. First, if you don't use The Widgetizer then that's too much object data (if you're already using Unit Properties then chances are you widgetize, but this version of the module was standalone). Second, and this is the real issue, static Evasion can replicate Attack Evasion, but not Attack Miss, whereas the version in the first post gives you both (i.e. dynamic Evasion and dynamic Curse).

I could submit the other Evasion library separately, but since this one has double the functionality and I've yet to see it fail in actual play that seems counterproductive. Then again, the other one is much easier to set up (no loaddata).

Quote:
Originally Posted by PurplePoot View Post
I was actually suggesting you have wrappers for those who prefer the old syntax (as in the example), as that is pretty much a win-win situation (it's not like one extra function call, even if it doesn't get inlined, is of any speed concern in a system such as this).
It should inline now, which wasn't the case back when I originally wrote the library. That's why I upgraded it for UP2. At the moment UP2 won't be backwards compatible with this version though, hence why I'm submitting this separately specifically for the people who already use it with the existing syntax. Syntax additions to this version don't make much sense when there's a new generation coming. It would be sort of like continuing to add features to the Caster System after the creation of xe.

Quote:
Originally Posted by PurplePoot View Post
As for the evasion stuff, I see your point (I realize the data was generated by JH but I figured you had already run it through a rename), but in that case shouldn't the data be included separately (that's a lot of code for people to copy and then delete)?
The data was actually part of a test map. I just didn't attach it here because nobody ever bothered to look at it before. I would always get "x doesn't work" comments when there was a fully functional test map right there. Usually the person had just failed to call CreateUnitProperties. Anyway like I said, I could remove all the data and attach a sample SLK instead, which might be more instructive for people seeing this for the first time. Unless they need these features immediately though I encourage new users to just wait for UP2.
Cassiel is offline   Reply With Quote
Reply

Bookmarks

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On


LinkBacks (?)
LinkBack to this Thread: http://www.hiveworkshop.com/forums/jass-functions-413/vjass-system-unit-properties-142012/
Posted By For Type Date
Question on LUA - Wc3C.net This thread Refback 01-14-2010 05:03 AM
Using Tomes of Damage to add natural damage to stuff - The Helper Forums This thread Refback 01-10-2010 12:19 PM
Max mana / hit point - The Helper Forums This thread Refback 12-10-2009 02:31 PM
A physical block (evasion) trigger? - Page 3 - The Helper Forums This thread Refback 12-08-2009 09:42 AM
Mini Problem - Ability that increase attack speed by value not % - The Helper Forums This thread Refback 11-23-2009 08:52 AM
Range Based Dynamic Evasion - The Helper Forums This thread Refback 11-19-2009 12:37 PM
Increasing Damage Passivly - The Helper Forums This thread Refback 10-27-2009 06:22 AM
How to use Grimext Object Merger - The Helper Forums This thread Refback 10-24-2009 12:51 AM
How to use Grimext Object Merger - The Helper Forums This thread Refback 10-23-2009 12:34 PM
T32, how to use the This thread Refback 10-11-2009 11:41 AM
T32, how to use the This thread Refback 10-10-2009 07:43 PM
Changing Defense on the hero - The Helper Forums This thread Refback 10-10-2009 11:45 AM
T32, how to use the This thread Refback 10-06-2009 11:31 PM
Tides of Blood: Kudzu - Wc3C.net This thread Refback 10-01-2009 05:30 PM
Patch 1.24b Discussion - Wc3C.net This thread Refback 09-28-2009 05:09 PM
Increase a units HP, Damage, Defense via trigger - Wc3C.net This thread Refback 09-27-2009 02:43 PM
Increase a units HP, Damage, Defense via trigger - Wc3C.net This thread Refback 09-27-2009 02:28 PM
Increase a units HP, Damage, Defense via trigger - Wc3C.net This thread Refback 09-27-2009 02:27 PM
setting unit hp to above normal max - The Helper Forums This thread Refback 09-26-2009 07:43 PM
setting unit hp to above normal max - The Helper Forums This thread Refback 09-26-2009 06:30 PM
setting unit hp to above normal max - The Helper Forums This thread Refback 09-26-2009 02:39 PM
Stacking buffs with Jass not possible? - The Helper Forums This thread Refback 09-22-2009 04:53 PM
Stacking buffs with Jass not possible? - The Helper Forums This thread Refback 09-22-2009 04:37 PM
Scaling Summons? - Wc3C.net This thread Refback 09-03-2009 08:18 PM
Scaling Summons? - Wc3C.net This thread Refback 09-03-2009 04:57 PM
[Snippet] Unit States - Page 2 - The Helper Forums This thread Refback 09-02-2009 04:45 PM
ADamage - a damage detection and prevention engine - Wc3C.net This thread Refback 09-02-2009 02:40 AM
[Snippet] Unit States - Page 2 - The Helper Forums This thread Refback 08-31-2009 05:32 PM
Wc3C.net - View Profile: Litany This thread Refback 08-30-2009 04:53 AM
Best way to do this? - Page 2 - Wc3C.net This thread Refback 08-29-2009 11:26 PM
Tides of Blood: Blood Meter - Wc3C.net This thread Refback 08-29-2009 06:35 PM
Best way to do this? - Page 2 - Wc3C.net This thread Refback 08-29-2009 11:49 AM
Wc3C.net - View Profile: Litany This thread Refback 08-29-2009 06:56 AM
Best way to do this? - Wc3C.net This thread Refback 08-29-2009 06:16 AM

Similar Threads
Thread Thread Starter Forum Replies Last Post
Unit Properties Bowzerbro Requests 2 12-22-2008 12:23 AM
[vJASS] CG's Transmission System Captain Griffen JASS Functions 6 04-05-2008 05:14 PM
[Trigger] Setting Unit's Properties to a formula NoobMapmaker Triggers & Scripts 16 04-02-2008 02:28 PM
[Question] Can i get the properties of unit mazong Triggers & Scripts 3 09-24-2004 07:49 PM

All times are GMT. The time now is 10:09 AM.






Hosting by SliceHost 
Powered by vBulletin®
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.3.1
Copyright©Ralle