• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

[System] Unit Properties

Level 3
Joined
Mar 7, 2004
Messages
37
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:
JASS:
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.

[jass=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 = 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[/code]


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.
 

Attachments

  • UnitPropertiesGenerator.txt
    3.3 KB · Views: 567
Last edited by a moderator:
Level 3
Joined
Mar 7, 2004
Messages
37
Evasion Module

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

[jass=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
if d == 0 then
set d = unitWeapID.create()
set DamagePoint = 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=DAMAGE POINT
//
set s=s__unitWeapID_getFromKey('Hamg')
set s__unitWeapID_dmgpt1=0.55
set s=s__unitWeapID_getFromKey('Hblm')
set s__unitWeapID_dmgpt1=0.55
set s=s__unitWeapID_getFromKey('Hmkg')
set s__unitWeapID_dmgpt1=0.35
set s=s__unitWeapID_getFromKey('Hpal')
set s__unitWeapID_dmgpt1=0.433
set s=s__unitWeapID_getFromKey('hbot')
set s=s__unitWeapID_getFromKey('hbsh')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('hdes')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('hdhw')
set s__unitWeapID_dmgpt1=0.43
set s=s__unitWeapID_getFromKey('hfoo')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('hgry')
set s__unitWeapID_dmgpt1=0.8
set s=s__unitWeapID_getFromKey('hgyr')
set s__unitWeapID_dmgpt1=0.03
set s=s__unitWeapID_getFromKey('hkni')
set s__unitWeapID_dmgpt1=0.66
set s=s__unitWeapID_getFromKey('hmil')
set s__unitWeapID_dmgpt1=0.39
set s=s__unitWeapID_getFromKey('hmpr')
set s__unitWeapID_dmgpt1=0.59
set s=s__unitWeapID_getFromKey('hmtm')
set s__unitWeapID_dmgpt1=1
set s=s__unitWeapID_getFromKey('hmtt')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('hpea')
set s__unitWeapID_dmgpt1=0.433
set s=s__unitWeapID_getFromKey('hphx')
set s__unitWeapID_dmgpt1=0.43
set s=s__unitWeapID_getFromKey('hpxe')
set s=s__unitWeapID_getFromKey('hrif')
set s__unitWeapID_dmgpt1=0.17
set s=s__unitWeapID_getFromKey('hrtt')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('hsor')
set s__unitWeapID_dmgpt1=0.75
set s=s__unitWeapID_getFromKey('hspt')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('hwat')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('hwt2')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('hwt3')
set s__unitWeapID_dmgpt1=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=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=0.3
set s=s__unitWeapID_getFromKey('hgra')
set s=s__unitWeapID_getFromKey('hgtw')
set s__unitWeapID_dmgpt1=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=0.33
set s=s__unitWeapID_getFromKey('Ofar')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('Oshd')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('Otch')
set s__unitWeapID_dmgpt1=0.36
set s=s__unitWeapID_getFromKey('nwad')
set s=s__unitWeapID_getFromKey('obot')
set s=s__unitWeapID_getFromKey('ocat')
set s__unitWeapID_dmgpt1=0.1
set s=s__unitWeapID_getFromKey('odes')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('odoc')
set s__unitWeapID_dmgpt1=0.73
set s=s__unitWeapID_getFromKey('oeye')
set s=s__unitWeapID_getFromKey('ogru')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('ohun')
set s__unitWeapID_dmgpt1=0.31
set s=s__unitWeapID_getFromKey('ohwd')
set s=s__unitWeapID_getFromKey('okod')
set s__unitWeapID_dmgpt1=0.85
set s=s__unitWeapID_getFromKey('opeo')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('orai')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('oshm')
set s__unitWeapID_dmgpt1=0.43
set s=s__unitWeapID_getFromKey('osp1')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('osp2')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('osp3')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('osp4')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('ospm')
set s=s__unitWeapID_getFromKey('ospw')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('osw1')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('osw2')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('osw3')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('otau')
set s__unitWeapID_dmgpt1=0.467
set s=s__unitWeapID_getFromKey('otbk')
set s__unitWeapID_dmgpt1=0.31
set s=s__unitWeapID_getFromKey('otbr')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('otot')
set s=s__unitWeapID_getFromKey('owyv')
set s__unitWeapID_dmgpt1=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=0.3
set s=s__unitWeapID_getFromKey('otto')
set s=s__unitWeapID_getFromKey('ovln')
set s=s__unitWeapID_getFromKey('owtw')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('Edem')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('Edmm')
set s__unitWeapID_dmgpt1=0.26
set s=s__unitWeapID_getFromKey('Ekee')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('Emoo')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('Ewar')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('earc')
set s__unitWeapID_dmgpt1=0.72
set s=s__unitWeapID_getFromKey('ebal')
set s__unitWeapID_dmgpt1=0.1
set s=s__unitWeapID_getFromKey('ebsh')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('echm')
set s__unitWeapID_dmgpt1=0.7
set s=s__unitWeapID_getFromKey('edcm')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('edes')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('edoc')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('edot')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('edry')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('edtm')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('efdr')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('efon')
set s__unitWeapID_dmgpt1=0.467
set s=s__unitWeapID_getFromKey('ehip')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('ehpr')
set s__unitWeapID_dmgpt1=0.633
set s=s__unitWeapID_getFromKey('emtg')
set s__unitWeapID_dmgpt1=0.49
set s=s__unitWeapID_getFromKey('esen')
set s__unitWeapID_dmgpt1=0.46
set s=s__unitWeapID_getFromKey('espv')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('even')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('ewsp')
set s=s__unitWeapID_getFromKey('eaoe')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('eaom')
set s__unitWeapID_dmgpt1=0.59
set s=s__unitWeapID_getFromKey('eaow')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('eate')
set s=s__unitWeapID_getFromKey('eden')
set s__unitWeapID_dmgpt1=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=0.4
set s=s__unitWeapID_getFromKey('etoe')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('etol')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('etrp')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('Ucrl')
set s__unitWeapID_dmgpt1=0.46
set s=s__unitWeapID_getFromKey('Udea')
set s__unitWeapID_dmgpt1=0.56
set s=s__unitWeapID_getFromKey('Udre')
set s__unitWeapID_dmgpt1=0.55
set s=s__unitWeapID_getFromKey('Ulic')
set s__unitWeapID_dmgpt1=0.46
set s=s__unitWeapID_getFromKey('uabo')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('uaco')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('uban')
set s__unitWeapID_dmgpt1=0.56
set s=s__unitWeapID_getFromKey('ubsp')
set s__unitWeapID_dmgpt1=0.633
set s=s__unitWeapID_getFromKey('ucrm')
set s=s__unitWeapID_getFromKey('ucry')
set s__unitWeapID_dmgpt1=0.64
set s=s__unitWeapID_getFromKey('ucs1')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('ucs2')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('ucs3')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('ucsB')
set s=s__unitWeapID_getFromKey('ucsC')
set s=s__unitWeapID_getFromKey('ufro')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('ugar')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('ugho')
set s__unitWeapID_dmgpt1=0.39
set s=s__unitWeapID_getFromKey('ugrm')
set s=s__unitWeapID_getFromKey('uloc')
set s__unitWeapID_dmgpt1=0
set s=s__unitWeapID_getFromKey('umtw')
set s__unitWeapID_dmgpt1=0.7
set s=s__unitWeapID_getFromKey('unec')
set s__unitWeapID_dmgpt1=0.53
set s=s__unitWeapID_getFromKey('uobs')
set s__unitWeapID_dmgpt1=0.53
set s=s__unitWeapID_getFromKey('uplg')
set s=s__unitWeapID_getFromKey('ushd')
set s=s__unitWeapID_getFromKey('uske')
set s__unitWeapID_dmgpt1=0.56
set s=s__unitWeapID_getFromKey('uskm')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('uubs')
set s__unitWeapID_dmgpt1=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=0.3
set s=s__unitWeapID_getFromKey('unp2')
set s__unitWeapID_dmgpt1=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=0.5
set s=s__unitWeapID_getFromKey('uzg2')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('uzig')
set s=s__unitWeapID_getFromKey('Nbrn')
set s__unitWeapID_dmgpt1=0.7
set s=s__unitWeapID_getFromKey('Nbst')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nnht')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('npfl')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('ndr1')
set s__unitWeapID_dmgpt1=0.56
set s=s__unitWeapID_getFromKey('ndr2')
set s__unitWeapID_dmgpt1=0.56
set s=s__unitWeapID_getFromKey('ndr3')
set s__unitWeapID_dmgpt1=0.56
set s=s__unitWeapID_getFromKey('ngz1')
set s__unitWeapID_dmgpt1=0.63
set s=s__unitWeapID_getFromKey('ngz2')
set s__unitWeapID_dmgpt1=0.63
set s=s__unitWeapID_getFromKey('ngz3')
set s__unitWeapID_dmgpt1=0.63
set s=s__unitWeapID_getFromKey('ngzc')
set s__unitWeapID_dmgpt1=0.63
set s=s__unitWeapID_getFromKey('ngzd')
set s__unitWeapID_dmgpt1=0.63
set s=s__unitWeapID_getFromKey('ngza')
set s__unitWeapID_dmgpt1=0.63
set s=s__unitWeapID_getFromKey('ngz4')
set s__unitWeapID_dmgpt1=0.63
set s=s__unitWeapID_getFromKey('npn1')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('npn2')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('npn3')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('npn4')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('npn5')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('npn6')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('npng')
set s=s__unitWeapID_getFromKey('nqb2')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nqb3')
set s__unitWeapID_dmgpt1=0.633
set s=s__unitWeapID_getFromKey('nqb4')
set s__unitWeapID_dmgpt1=0.633
set s=s__unitWeapID_getFromKey('nqbh')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('nwe1')
set s=s__unitWeapID_getFromKey('nwe2')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nwe3')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nadk')
set s__unitWeapID_dmgpt1=0.94
set s=s__unitWeapID_getFromKey('nadr')
set s__unitWeapID_dmgpt1=0.94
set s=s__unitWeapID_getFromKey('nadw')
set s__unitWeapID_dmgpt1=0.94
set s=s__unitWeapID_getFromKey('nahy')
set s__unitWeapID_dmgpt1=0.7
set s=s__unitWeapID_getFromKey('nanb')
set s__unitWeapID_dmgpt1=0.53
set s=s__unitWeapID_getFromKey('nanm')
set s__unitWeapID_dmgpt1=0.53
set s=s__unitWeapID_getFromKey('nanc')
set s__unitWeapID_dmgpt1=0.53
set s=s__unitWeapID_getFromKey('nane')
set s__unitWeapID_dmgpt1=0.53
set s=s__unitWeapID_getFromKey('nano')
set s__unitWeapID_dmgpt1=0.53
set s=s__unitWeapID_getFromKey('nanw')
set s__unitWeapID_dmgpt1=0.53
set s=s__unitWeapID_getFromKey('narg')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nass')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nbal')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nba2')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nban')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nbda')
set s__unitWeapID_dmgpt1=0.83
set s=s__unitWeapID_getFromKey('nbdk')
set s__unitWeapID_dmgpt1=0.94
set s=s__unitWeapID_getFromKey('nbdm')
set s__unitWeapID_dmgpt1=0.83
set s=s__unitWeapID_getFromKey('nbdo')
set s__unitWeapID_dmgpt1=0.83
set s=s__unitWeapID_getFromKey('nbdr')
set s__unitWeapID_dmgpt1=0.94
set s=s__unitWeapID_getFromKey('nbds')
set s__unitWeapID_dmgpt1=0.83
set s=s__unitWeapID_getFromKey('nbdw')
set s__unitWeapID_dmgpt1=0.83
set s=s__unitWeapID_getFromKey('nbld')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nbnb')
set s=s__unitWeapID_getFromKey('nbot')
set s=s__unitWeapID_getFromKey('nbrg')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nbwm')
set s__unitWeapID_dmgpt1=0.94
set s=s__unitWeapID_getFromKey('nbzd')
set s__unitWeapID_dmgpt1=0.94
set s=s__unitWeapID_getFromKey('nbzk')
set s__unitWeapID_dmgpt1=0.94
set s=s__unitWeapID_getFromKey('nbzw')
set s__unitWeapID_dmgpt1=0.94
set s=s__unitWeapID_getFromKey('ncea')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('ncen')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('ncer')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('ncfs')
set s__unitWeapID_dmgpt1=0.38
set s=s__unitWeapID_getFromKey('ncim')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('ncks')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('ncnk')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('ndqn')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('ndqp')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('ndqs')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('ndqt')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('ndqv')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('ndrv')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('ndtb')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('ndth')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('ndtp')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('ndtr')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('ndtt')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('ndtw')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nehy')
set s__unitWeapID_dmgpt1=0.7
set s=s__unitWeapID_getFromKey('nelb')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('nele')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('nenc')
set s__unitWeapID_dmgpt1=0.467
set s=s__unitWeapID_getFromKey('nenf')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nenp')
set s__unitWeapID_dmgpt1=0.467
set s=s__unitWeapID_getFromKey('nepl')
set s__unitWeapID_dmgpt1=0.467
set s=s__unitWeapID_getFromKey('nerd')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('ners')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nerw')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nfel')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('nfgb')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('nfgo')
set s__unitWeapID_dmgpt1=0.26
set s=s__unitWeapID_getFromKey('nfgt')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('nfgu')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('nfod')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nfor')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nfot')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nfov')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('nfpc')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nfpe')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nfpl')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nfps')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nfpt')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nfpu')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nfra')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nfrb')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nfre')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nfrg')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nfrl')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nfrp')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nfrs')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nfsh')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nfsp')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nftb')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nftk')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nftr')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nftt')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('ngdk')
set s__unitWeapID_dmgpt1=0.94
set s=s__unitWeapID_getFromKey('nggr')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('ngh1')
set s__unitWeapID_dmgpt1=0.56
set s=s__unitWeapID_getFromKey('ngh2')
set s__unitWeapID_dmgpt1=0.56
set s=s__unitWeapID_getFromKey('ngir')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nglm')
set s=s__unitWeapID_getFromKey('ngna')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('ngnb')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('ngno')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('ngns')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('ngnv')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('ngnw')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('ngrd')
set s__unitWeapID_dmgpt1=0.94
set s=s__unitWeapID_getFromKey('ngrk')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('ngrw')
set s__unitWeapID_dmgpt1=0.94
set s=s__unitWeapID_getFromKey('ngsp')
set s=s__unitWeapID_getFromKey('ngst')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nhar')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nhdc')
set s__unitWeapID_dmgpt1=0.53
set s=s__unitWeapID_getFromKey('nhfp')
set s__unitWeapID_dmgpt1=0.53
set s=s__unitWeapID_getFromKey('nhhr')
set s__unitWeapID_dmgpt1=0.53
set s=s__unitWeapID_getFromKey('nhrh')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nhrq')
set s__unitWeapID_dmgpt1=0.35
set s=s__unitWeapID_getFromKey('nhrr')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nhrw')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nhyc')
set s__unitWeapID_dmgpt1=0.7
set s=s__unitWeapID_getFromKey('nhyd')
set s__unitWeapID_dmgpt1=0.7
set s=s__unitWeapID_getFromKey('nhyh')
set s__unitWeapID_dmgpt1=0.7
set s=s__unitWeapID_getFromKey('nina')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('ninc')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('ninf')
set s__unitWeapID_dmgpt1=0.26
set s=s__unitWeapID_getFromKey('ninm')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nith')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nitp')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nitr')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nits')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nitt')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nitw')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('njgb')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('njga')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('njg1')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nkob')
set s__unitWeapID_dmgpt1=0.38
set s=s__unitWeapID_getFromKey('nkog')
set s__unitWeapID_dmgpt1=0.38
set s=s__unitWeapID_getFromKey('nkol')
set s__unitWeapID_dmgpt1=0.38
set s=s__unitWeapID_getFromKey('nkot')
set s__unitWeapID_dmgpt1=0.38
set s=s__unitWeapID_getFromKey('nlds')
set s__unitWeapID_dmgpt1=0.53
set s=s__unitWeapID_getFromKey('nlkl')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nlpd')
set s__unitWeapID_dmgpt1=0.66
set s=s__unitWeapID_getFromKey('nlpr')
set s__unitWeapID_dmgpt1=0.38
set s=s__unitWeapID_getFromKey('nlps')
set s__unitWeapID_dmgpt1=0.38
set s=s__unitWeapID_getFromKey('nlrv')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('nlsn')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nltc')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nltl')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nlur')
set s=s__unitWeapID_getFromKey('nmam')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nmbg')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('nmcf')
set s__unitWeapID_dmgpt1=0.38
set s=s__unitWeapID_getFromKey('nmdr')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nmfs')
set s__unitWeapID_dmgpt1=0.66
set s=s__unitWeapID_getFromKey('nmgd')
set s__unitWeapID_dmgpt1=0.66
set s=s__unitWeapID_getFromKey('nmgr')
set s__unitWeapID_dmgpt1=0.66
set s=s__unitWeapID_getFromKey('nmgw')
set s__unitWeapID_dmgpt1=0.66
set s=s__unitWeapID_getFromKey('nmit')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nmmu')
set s__unitWeapID_dmgpt1=0.66
set s=s__unitWeapID_getFromKey('nmpg')
set s__unitWeapID_dmgpt1=0.66
set s=s__unitWeapID_getFromKey('nmrm')
set s__unitWeapID_dmgpt1=0.66
set s=s__unitWeapID_getFromKey('nmrr')
set s__unitWeapID_dmgpt1=0.66
set s=s__unitWeapID_getFromKey('nmrv')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('nmsc')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('nmsh')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nmtw')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('nmyr')
set s__unitWeapID_dmgpt1=0.36
set s=s__unitWeapID_getFromKey('nmys')
set s=s__unitWeapID_getFromKey('nnad')
set s=s__unitWeapID_getFromKey('nndr')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('nnfm')
set s=s__unitWeapID_getFromKey('nnmg')
set s__unitWeapID_dmgpt1=0.7
set s=s__unitWeapID_getFromKey('nnrg')
set s__unitWeapID_dmgpt1=0.36
set s=s__unitWeapID_getFromKey('nnrs')
set s=s__unitWeapID_getFromKey('nnsa')
set s=s__unitWeapID_getFromKey('nnsw')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nntg')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('nnwl')
set s__unitWeapID_dmgpt1=0.64
set s=s__unitWeapID_getFromKey('nnwq')
set s__unitWeapID_dmgpt1=0.64
set s=s__unitWeapID_getFromKey('nnwr')
set s__unitWeapID_dmgpt1=0.64
set s=s__unitWeapID_getFromKey('nnws')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nnzg')
set s=s__unitWeapID_getFromKey('nogl')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nogm')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nogn')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nogo')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nogr')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nomg')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('now2')
set s=s__unitWeapID_getFromKey('nowe')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nowk')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nowl')
set s=s__unitWeapID_getFromKey('npfm')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('npgf')
set s=s__unitWeapID_getFromKey('Npld')
set s__unitWeapID_dmgpt1=0.8
set s=s__unitWeapID_getFromKey('Nplh')
set s__unitWeapID_dmgpt1=0.8
set s=s__unitWeapID_getFromKey('Nfir')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nlv1')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('nlv2')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('nlv3')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('nrat')
set s=s__unitWeapID_getFromKey('nrdr')
set s__unitWeapID_dmgpt1=0.94
set s=s__unitWeapID_getFromKey('nrel')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nrmf')
set s=s__unitWeapID_getFromKey('nrog')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nrvd')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('nrvf')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('nrvi')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('nrvl')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('nrvs')
set s__unitWeapID_dmgpt1=0.65
set s=s__unitWeapID_getFromKey('nrwm')
set s__unitWeapID_dmgpt1=0.94
set s=s__unitWeapID_getFromKey('nrzb')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('nrzg')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nrzm')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nrzs')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nrzt')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('nsat')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nsbm')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nsbs')
set s=s__unitWeapID_getFromKey('nsc2')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nsc3')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nscb')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nsel')
set s__unitWeapID_dmgpt1=0.53
set s=s__unitWeapID_getFromKey('nsgb')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('nsgg')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nsgh')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('nsgn')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('nsgt')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nska')
set s__unitWeapID_dmgpt1=0.7
set s=s__unitWeapID_getFromKey('nske')
set s__unitWeapID_dmgpt1=0.56
set s=s__unitWeapID_getFromKey('nsca')
set s__unitWeapID_dmgpt1=0.7
set s=s__unitWeapID_getFromKey('nsce')
set s__unitWeapID_dmgpt1=0.56
set s=s__unitWeapID_getFromKey('nskf')
set s__unitWeapID_dmgpt1=0.7
set s=s__unitWeapID_getFromKey('nskg')
set s__unitWeapID_dmgpt1=0.56
set s=s__unitWeapID_getFromKey('nskm')
set s__unitWeapID_dmgpt1=0.7
set s=s__unitWeapID_getFromKey('nsko')
set s__unitWeapID_dmgpt1=0.56
set s=s__unitWeapID_getFromKey('nslf')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nslh')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nsll')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nslm')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nsln')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nslr')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nslv')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nsnp')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nsns')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('nsoc')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('nsog')
set s__unitWeapID_dmgpt1=0.56
set s=s__unitWeapID_getFromKey('nspb')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nspd')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nspg')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nspp')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('nspr')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nsqa')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nsqe')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nsqo')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nsqt')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nsra')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nsrh')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nsrn')
set s__unitWeapID_dmgpt1=0.53
set s=s__unitWeapID_getFromKey('nsrv')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('nsrw')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nssp')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('nsth')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nstl')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nsts')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nstw')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nsty')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nthl')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('ntka')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('ntkc')
set s__unitWeapID_dmgpt1=0.36
set s=s__unitWeapID_getFromKey('ntkf')
set s__unitWeapID_dmgpt1=0.36
set s=s__unitWeapID_getFromKey('ntkh')
set s__unitWeapID_dmgpt1=0.36
set s=s__unitWeapID_getFromKey('ntks')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('ntkt')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('ntkw')
set s__unitWeapID_dmgpt1=0.36
set s=s__unitWeapID_getFromKey('ntor')
set s=s__unitWeapID_getFromKey('ntrd')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('ntrg')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('ntrh')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('ntrs')
set s__unitWeapID_dmgpt1=0.66
set s=s__unitWeapID_getFromKey('ntrt')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('ntrv')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('ntws')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('nubk')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nubr')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nubw')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nvde')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nvdg')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nvdl')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nvdw')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nwen')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nwgs')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('nwiz')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nwld')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('nwlg')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('nwlt')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('nwna')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nwnr')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nwns')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nwrg')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nws1')
set s__unitWeapID_dmgpt1=0.43
set s=s__unitWeapID_getFromKey('nwwd')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('nwwf')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('nwwg')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('nwzd')
set s__unitWeapID_dmgpt1=0.55
set s=s__unitWeapID_getFromKey('nwzg')
set s__unitWeapID_dmgpt1=0.55
set s=s__unitWeapID_getFromKey('nwzr')
set s__unitWeapID_dmgpt1=0.55
set s=s__unitWeapID_getFromKey('nzep')
set s=s__unitWeapID_getFromKey('nzom')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nhym')
set s__unitWeapID_dmgpt1=0.55
set s=s__unitWeapID_getFromKey('nchp')
set s__unitWeapID_dmgpt1=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=0.3
set s=s__unitWeapID_getFromKey('Npbm')
set s__unitWeapID_dmgpt1=0.35
set s=s__unitWeapID_getFromKey('Nalc')
set s__unitWeapID_dmgpt1=0.35
set s=s__unitWeapID_getFromKey('Nalm')
set s__unitWeapID_dmgpt1=0.35
set s=s__unitWeapID_getFromKey('Nal2')
set s__unitWeapID_dmgpt1=0.35
set s=s__unitWeapID_getFromKey('Nal3')
set s__unitWeapID_dmgpt1=0.35
set s=s__unitWeapID_getFromKey('Ntin')
set s__unitWeapID_dmgpt1=0.35
set s=s__unitWeapID_getFromKey('Nrob')
set s__unitWeapID_dmgpt1=0.35
set s=s__unitWeapID_getFromKey('ncgb')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('ncg1')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('ncg2')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('ncg3')
set s__unitWeapID_dmgpt1=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=0.63
set s=s__unitWeapID_getFromKey('npnw')
set s=s__unitWeapID_getFromKey('nqb1')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nrdk')
set s__unitWeapID_dmgpt1=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=0.66
set s=s__unitWeapID_getFromKey('noga')
set s__unitWeapID_dmgpt1=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=0.4
set s=s__unitWeapID_getFromKey('Eevi')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('Eevm')
set s__unitWeapID_dmgpt1=0.26
set s=s__unitWeapID_getFromKey('Efur')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('Eidm')
set s__unitWeapID_dmgpt1=0.26
set s=s__unitWeapID_getFromKey('Eill')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('Eilm')
set s__unitWeapID_dmgpt1=0.26
set s=s__unitWeapID_getFromKey('Ekgg')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('Emfr')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('Emns')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('Etyr')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('Ewrd')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('Hant')
set s__unitWeapID_dmgpt1=0.55
set s=s__unitWeapID_getFromKey('Hapm')
set s__unitWeapID_dmgpt1=0.433
set s=s__unitWeapID_getFromKey('Harf')
set s__unitWeapID_dmgpt1=0.433
set s=s__unitWeapID_getFromKey('Hart')
set s__unitWeapID_dmgpt1=0.433
set s=s__unitWeapID_getFromKey('Hdgo')
set s__unitWeapID_dmgpt1=0.433
set s=s__unitWeapID_getFromKey('Hhkl')
set s__unitWeapID_dmgpt1=0.433
set s=s__unitWeapID_getFromKey('Hjai')
set s__unitWeapID_dmgpt1=0.55
set s=s__unitWeapID_getFromKey('Hkal')
set s__unitWeapID_dmgpt1=0.55
set s=s__unitWeapID_getFromKey('Hlgr')
set s__unitWeapID_dmgpt1=0.433
set s=s__unitWeapID_getFromKey('Hmbr')
set s__unitWeapID_dmgpt1=0.633
set s=s__unitWeapID_getFromKey('Hmgd')
set s__unitWeapID_dmgpt1=0.433
set s=s__unitWeapID_getFromKey('Hpb1')
set s__unitWeapID_dmgpt1=0.433
set s=s__unitWeapID_getFromKey('Hpb2')
set s__unitWeapID_dmgpt1=0.433
set s=s__unitWeapID_getFromKey('Huth')
set s__unitWeapID_dmgpt1=0.433
set s=s__unitWeapID_getFromKey('Hvsh')
set s__unitWeapID_dmgpt1=0.73
set s=s__unitWeapID_getFromKey('Hvwd')
set s__unitWeapID_dmgpt1=0.7
set s=s__unitWeapID_getFromKey('Nbbc')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('Nklj')
set s__unitWeapID_dmgpt1=0.55
set s=s__unitWeapID_getFromKey('Nkjx')
set s__unitWeapID_dmgpt1=0.55
set s=s__unitWeapID_getFromKey('Nmag')
set s__unitWeapID_dmgpt1=0.8
set s=s__unitWeapID_getFromKey('Nman')
set s__unitWeapID_dmgpt1=0.833
set s=s__unitWeapID_getFromKey('nplg')
set s__unitWeapID_dmgpt1=0.63
set s=s__unitWeapID_getFromKey('Nsjs')
set s__unitWeapID_dmgpt1=0.35
set s=s__unitWeapID_getFromKey('Ocbh')
set s__unitWeapID_dmgpt1=0.36
set s=s__unitWeapID_getFromKey('Ocb2')
set s__unitWeapID_dmgpt1=0.36
set s=s__unitWeapID_getFromKey('Odrt')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('Ogld')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('Ogrh')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('Opgh')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('Orex')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('Orkn')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('Osam')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('Otcc')
set s__unitWeapID_dmgpt1=0.36
set s=s__unitWeapID_getFromKey('Othr')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('Uanb')
set s__unitWeapID_dmgpt1=0.46
set s=s__unitWeapID_getFromKey('Ubal')
set s__unitWeapID_dmgpt1=0.55
set s=s__unitWeapID_getFromKey('Uclc')
set s__unitWeapID_dmgpt1=0.46
set s=s__unitWeapID_getFromKey('Udth')
set s__unitWeapID_dmgpt1=0.55
set s=s__unitWeapID_getFromKey('Uear')
set s__unitWeapID_dmgpt1=0.56
set s=s__unitWeapID_getFromKey('Uktl')
set s__unitWeapID_dmgpt1=0.46
set s=s__unitWeapID_getFromKey('Umal')
set s__unitWeapID_dmgpt1=0.55
set s=s__unitWeapID_getFromKey('Usyl')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('Utic')
set s__unitWeapID_dmgpt1=0.55
set s=s__unitWeapID_getFromKey('Uvar')
set s__unitWeapID_dmgpt1=0.55
set s=s__unitWeapID_getFromKey('Uvng')
set s__unitWeapID_dmgpt1=0.55
set s=s__unitWeapID_getFromKey('Uwar')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('Hgam')
set s__unitWeapID_dmgpt1=0.55
set s=s__unitWeapID_getFromKey('eilw')
set s=s__unitWeapID_getFromKey('enec')
set s=s__unitWeapID_getFromKey('ensh')
set s__unitWeapID_dmgpt1=0.46
set s=s__unitWeapID_getFromKey('eshd')
set s__unitWeapID_dmgpt1=0.72
set s=s__unitWeapID_getFromKey('etrs')
set s=s__unitWeapID_getFromKey('hbew')
set s=s__unitWeapID_getFromKey('hcth')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('hhdl')
set s=s__unitWeapID_getFromKey('hhes')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('hrdh')
set s=s__unitWeapID_getFromKey('Naka')
set s__unitWeapID_dmgpt1=0.59
set s=s__unitWeapID_getFromKey('nsw1')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('nsw2')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('nsw3')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('ncat')
set s__unitWeapID_dmgpt1=0.1
set s=s__unitWeapID_getFromKey('nbee')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nbel')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nbsp')
set s=s__unitWeapID_getFromKey('nchg')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('nchr')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nchw')
set s__unitWeapID_dmgpt1=0.43
set s=s__unitWeapID_getFromKey('nckb')
set s__unitWeapID_dmgpt1=0.85
set s=s__unitWeapID_getFromKey('ncpn')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('ndmu')
set s__unitWeapID_dmgpt1=0.39
set s=s__unitWeapID_getFromKey('ndrd')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('ndrn')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('ndrt')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('ndrf')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('ndrh')
set s__unitWeapID_dmgpt1=0.59
set s=s__unitWeapID_getFromKey('ndrj')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('ndrm')
set s__unitWeapID_dmgpt1=0.59
set s=s__unitWeapID_getFromKey('ndrp')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('ndrs')
set s__unitWeapID_dmgpt1=0.59
set s=s__unitWeapID_getFromKey('ndrw')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('ndrl')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('ndsa')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('negz')
set s=s__unitWeapID_getFromKey('nemi')
set s__unitWeapID_dmgpt1=0.59
set s=s__unitWeapID_getFromKey('nfgl')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('ngbl')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nhea')
set s__unitWeapID_dmgpt1=0.72
set s=s__unitWeapID_getFromKey('nhef')
set s=s__unitWeapID_getFromKey('nhem')
set s=s__unitWeapID_getFromKey('nhew')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('njks')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nmdm')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('nmed')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('nmpe')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nmsn')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('nser')
set s__unitWeapID_dmgpt1=0.94
set s=s__unitWeapID_getFromKey('nspc')
set s=s__unitWeapID_getFromKey('nssn')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nthr')
set s__unitWeapID_dmgpt1=0.94
set s=s__unitWeapID_getFromKey('nw2w')
set s__unitWeapID_dmgpt1=0.43
set s=s__unitWeapID_getFromKey('nwat')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('odkt')
set s__unitWeapID_dmgpt1=0.53
set s=s__unitWeapID_getFromKey('ogrk')
set s__unitWeapID_dmgpt1=0.33
set s=s__unitWeapID_getFromKey('ojgn')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('omtg')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('onzg')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('oosc')
set s=s__unitWeapID_getFromKey('oswy')
set s=s__unitWeapID_getFromKey('ovlj')
set s__unitWeapID_dmgpt1=0.73
set s=s__unitWeapID_getFromKey('owar')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('ownr')
set s__unitWeapID_dmgpt1=0.6
set s=s__unitWeapID_getFromKey('uabc')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('uarb')
set s=s__unitWeapID_getFromKey('ubdd')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('ubdr')
set s__unitWeapID_dmgpt1=0.94
set s=s__unitWeapID_getFromKey('ubot')
set s=s__unitWeapID_getFromKey('udes')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('uktg')
set s=s__unitWeapID_getFromKey('uktn')
set s__unitWeapID_dmgpt1=0.53
set s=s__unitWeapID_getFromKey('uswb')
set s__unitWeapID_dmgpt1=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=0.3
set s=s__unitWeapID_getFromKey('nbt2')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nbwd')
set s=s__unitWeapID_getFromKey('ncap')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('ncaw')
set s__unitWeapID_dmgpt1=0.59
set s=s__unitWeapID_getFromKey('ncmw')
set s=s__unitWeapID_getFromKey('ncta')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('ncte')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('nctl')
set s__unitWeapID_dmgpt1=0.4
set s=s__unitWeapID_getFromKey('ndfl')
set s=s__unitWeapID_getFromKey('ndgt')
set s__unitWeapID_dmgpt1=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=0.3
set s=s__unitWeapID_getFromKey('ndt2')
set s__unitWeapID_dmgpt1=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=0.3
set s=s__unitWeapID_getFromKey('negm')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('negt')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('net1')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('net2')
set s__unitWeapID_dmgpt1=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=0.3
set s=s__unitWeapID_getFromKey('nft2')
set s__unitWeapID_dmgpt1=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=0.4
set s=s__unitWeapID_getFromKey('Nngs')
set s__unitWeapID_dmgpt1=0.73
set s=s__unitWeapID_getFromKey('nnsg')
set s=s__unitWeapID_getFromKey('nnsu')
set s__unitWeapID_dmgpt1=0.5
set s=s__unitWeapID_getFromKey('nntt')
set s=s__unitWeapID_getFromKey('nnwa')
set s__unitWeapID_dmgpt1=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=0.3
set s=s__unitWeapID_getFromKey('ntx2')
set s__unitWeapID_dmgpt1=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=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=0.17
set s=s__unitWeapID_getFromKey('zhyd')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('zjug')
set s__unitWeapID_dmgpt1=0.17
set s=s__unitWeapID_getFromKey('zmar')
set s__unitWeapID_dmgpt1=0.17
set s=s__unitWeapID_getFromKey('zshv')
set s__unitWeapID_dmgpt1=0.38
set s=s__unitWeapID_getFromKey('zsmc')
set s__unitWeapID_dmgpt1=0.55
set s=s__unitWeapID_getFromKey('zzrg')
set s__unitWeapID_dmgpt1=0.3
set s=s__unitWeapID_getFromKey('nzlc')
endfunction
endlibrary[/code]
 
Level 3
Joined
Mar 7, 2004
Messages
37
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).
 
Level 40
Joined
Dec 14, 2005
Messages
10,532
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:

    JASS:
            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.

    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:

    JASS:
        //! 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:

    JASS:
    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:
Level 11
Joined
Feb 22, 2006
Messages
752
JASS:
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).
 
Level 3
Joined
Mar 7, 2004
Messages
37
I'll be moving to a different state over the next few days, so this is just a quick response.

  • 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:

    JASS:
            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.

    [*]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.

    [*]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.

    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.

    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.)
 
Level 3
Joined
Mar 7, 2004
Messages
37
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:

JASS:
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.
 
Level 11
Joined
Feb 22, 2006
Messages
752
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.
 
Level 40
Joined
Dec 14, 2005
Messages
10,532
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.
 
Level 17
Joined
Apr 27, 2008
Messages
2,455
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)
 
Level 3
Joined
Mar 7, 2004
Messages
37
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).

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.

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.
 
Level 40
Joined
Dec 14, 2005
Messages
10,532
With a second version which does address such changes I can see why you don't want to bother with them for this one. If it's going to be soon then I'll just leave this here (assuming you plan to attach it to the same post, which would make sense). Otherwise, I'll approve it (just confirm which you plan on doing).
 
Level 3
Joined
Mar 7, 2004
Messages
37
It's not going to be for at least several weeks, probably longer. Ideally it wouldn't be until after JassHelper finally gives us either optional library support with ifdef or better function hooking, that way I can make the system truly modular instead of having to provide instructions on how to add or remove modules from the core.

However, this version doesn't really need to be approved, either. It just needs a thread where some of the people already using it can go to look back at the unmodified code, redownload the Lua script, etc. I suppose it may be worth approving in case other people want to use this version for now.

Also, any way we can get .lua allowed as an attachment extension? I dug up the other version of the Evasion Module. The lua script is:
Code:
-- Generates Evasion abilities from 1 to 100% and places each in a spellbook.

setobjecttype("abilities")
CharFinder = [[ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~]]

function CreateEvasionAbilities ()
	for i = 1, 95 do
		cha = string.sub(CharFinder, i, i)
		raw = "eva"..cha

		createobject("ACes", raw)
      	  	makechange(current, "Eev1", 1, i / 100.)
     	   	makechange(current, "arac", "Other")
     	   	makechange(current, "Name", "Evasion")
     	   	makechange(current, "ansf", "("..tostring(i).."%)")

		createobject("Aspb", "bea"..cha)
      	  	makechange(current, "spb1", 1, raw)
     	   	makechange(current, "aite", 0)
     	   	makechange(current, "Name", "Evasion Spell Book")
     	   	makechange(current, "ansf", "("..tostring(i).."%)")
	end

	for i = 1, 5 do
		cha = string.sub(CharFinder, i, i)
		raw = "evb"..cha

		createobject("ACes", raw)
      	  	makechange(current, "Eev1", 1, (i + 95) / 100.)
     	   	makechange(current, "arac", "Other")
     	   	makechange(current, "ansf", "("..tostring(i + 95).."%)")
     	   	makechange(current, "Name", "Evasion")

		createobject("Aspb", "beb"..cha)
      	  	makechange(current, "spb1", 1, raw)
     	   	makechange(current, "aite", 0)
     	   	makechange(current, "Name", "Evasion Spell Book")
     	   	makechange(current, "ansf", "("..tostring(i + 95).."%)")
	end

end

CreateEvasionAbilities()
And the (tiny) library is:
JASS:
library EvasionModule initializer Init

    // //! external ObjectMerger EvasionGenerator.lua

    globals
        private integer       EvasionA = 'bea ' - 1
        private integer       EvasionB = 'beb ' - 1
        private integer array E
        private integer array U
    endglobals
    
    function UnitSetAttackEvasion takes unit u, integer e returns nothing
        local integer i = u:Id
        if U[i] != 0 then
            call UnitRemoveAbility(u, E[U[i]])
        endif
        set U[i] = e
        call UnitAddAbility(u, E[e])
    endfunction
    
    private function Init takes nothing returns nothing
        local integer i
        local integer e
        local player  p
        
        set i = 1
        loop
            exitwhen i == 101
            if i < 96 then
                set E[i] = EvasionA + i
            else
                set E[i] = EvasionB + i - 95
            endif
            set i = i + 1
        endloop
        
        set i = 0
        loop
            exitwhen i == 16
            set p = Player(i)
            set e = 1
            loop
                exitwhen e == 101
                call SetPlayerAbilityAvailable(p, E[e], false)
                set e = e + 1
            endloop
            set i = i + 1
        endloop
    endfunction
endlibrary
 
Level 13
Joined
Nov 22, 2006
Messages
1,260
//For each of these functions, there is also a UnitSet and a UnitGet equivalent.


This is not entirely true. For example, there isn't a UnitSetLife/Mana or UnitGetLife/Mana. I know that I can get those simply by calling GetUnitState, but it would be cool if you added those as as wrappers.
 
Level 3
Joined
Mar 7, 2004
Messages
37
That's one of the reasons I hated maintaining multiple versions of the library simultaneously. Silly inconsistencies are always popping up.

I removed those functions because there's just no point to them with the colon operator. States inline completely, unlike some other properties. Unless you just hate the syntax or something there's never a reason not to use set unit:Life = unit:Life + 200.

After seeing several people try and fail to copy my Widgetizer-enabled UnitState module though I may upload that separately here pretty soon, ahead of UP2, since neither requires the other. That version preserves all syntax options just for kicks [UnitSetLife/Mana(unit, value), UnitSetState(unit, state, value), and set unit:State = value)].
 
Level 8
Joined
Aug 6, 2008
Messages
451
Thats some problem with Hives Jass tags and it kinda sucks since there aint any test map.

Probably you should ask about in Site Discussion thread. There might be more guys who know about this stuff reading your posts than in this thread.
 
Level 13
Joined
Nov 22, 2006
Messages
1,260
Or just click on the
quote.gif
button and CnP it from there.
 
Level 8
Joined
Dec 1, 2006
Messages
342
Are there abilities created with the .lua (in Unit Properties) that are used in UnitModifyMoveSpeed?

I ask, cause, when I use this function it has a quite strange reaction. Like, when it should increase for 60 it decreases for 150.
And I use the regular UnitModifyMoveSpeed(u, 60) function.
 
Level 8
Joined
Aug 6, 2008
Messages
451
Nope. It uses natives because movespeed abilities dont stack, so it would require a huge movespeed ability with shitloads of levels, which would be a bitch to load and which would consume shameless amount of filesize or sumthing like that.

So, just add some debug msgs to you UnitModifyMoveSpeed and see if it is called in some place it should not be.

edit. Actually, Cassiel. Why you even use R2I here?

JASS:
set p.MoveSpeed = p.MoveSpeed + R2I(amount) // ?
call SetUnitMoveSpeed(u, p.MoveSpeed)

edit2. And yea, make sure that nothing else affects movespeed, other than those UnitProperties functions.

GetUnitMoveSpeed (unit) should equal to UnitGetMoveSpeed(unit)
 
Last edited:
Level 3
Joined
Mar 7, 2004
Messages
37
There really isn't much to demo. You need to call CreateUnitProperties for a unit before using the system (there's a redundancy check, so calling CreateUnitProperties for a unit multiple times won't break anything), and when that unit is dead and gone you need to call DestroyUnitProperties to free its index. Beyond that, the functions do what they say.

Does it work correctly with abilities, such as slow and stuff?
What do you get if you call GetCurrentMoveSpeed() on a unit that is slowed or stunned?
What if you manipulated the units movespeed already?
It's intentionally handled so that you have to script your own abilities. As long as you do that, it works for anything you want to use it for, like this or this.

The benefit of requiring you to script everything is that ultimately you can do things like this.
 
Level 8
Joined
Aug 6, 2008
Messages
451
JASS:
real AttackSpeed      = 0

It means that units attackspeed has not been modified and that its attack cooldown is equal to that attack cooldown you have set to it in object editor.

It it be 100, it would mean that unit attacks 100% faster, and its attack cooldown is shorter than the one you set in object editor.
 
Level 8
Joined
Aug 6, 2008
Messages
451
It will add 400 to max mana.

Unit will still have the initial mana amount you set to it in object editor, and it also receives max mana from sources like intellect attribute and stuff.
 
Level 3
Joined
Jan 15, 2010
Messages
47
What would be a list of steps to use this in a map? I have:

1. Saved the LUA file in map directory
2. Put the code in a blank text trigger
3. Uncommented object merger line
4. Saved successfully, including object merger
5. Commented out object merger line
6. Made a function to put a unit in the system:
JASS:
call CreateUnitProperties(hero)  //hero being a unit variable holding a hero
7. Tried modifying the units properties:
JASS:
call UnitModifyArmor(hero, 100)

But this does not work, perhaps I am missing something simple?
 
Level 8
Joined
Aug 6, 2008
Messages
451
Remember to check that you have all those bonus abilities in object editor, that the lua script actually worked.

You can also add some temporary call BJDebugMsg( " word " ) -calls to the system code to find out where the code stops running, if it stops running.
 
Level 3
Joined
Jan 15, 2010
Messages
47
Ah, I was unaware that it would actually put the abilities in the ability editor. Thought it just kinda put it in the map file. In that case, no, the LUA does not import abilities. This is also the case with the other system I tried. I am using newgen, but is there something else i need to enable for the LUA to work?

Thanks
 
Top