Name | Type | is_array | initial_value |
a | real | No | |
i | integer | No | |
u | unit | No |
//TESH.scrollpos=26
//TESH.alwaysfold=0
library TriggerRefresh /* v1.0.2.1
*************************************************************************************
*
* Optimal trigger refreshing for unit events. Used in such things as Damage Detection
* Systems.
*
* Events are never destroyed. When a unit event is registered to a trigger and that
* unit no longer exists, the event remains. The trigger has to be recreated in order
* to clean the leak. This resource recreates triggers in the most optimal manner possible.
*
* Used in DamageEvent and recommended for all Damage Detection Systems.
*
* Place the macros in order at the bottom of the DDS Library.
*
*************************************************************************************
*
* */uses/*
*
* */ UnitIndexer /* hiveworkshop.com/forums/jass-functions-413/unit-indexer-172090/
* All Requirements of Unit Indexer are not needed as they are included with Trigger Refresh
*
*************************************************************************************
*
* //! textmacro TRIGGER_REFRESH takes TRIGGER_SIZE, TRIGGER_EVENT, CODE
*
* This macro creates the refreshing trigger.
*
* TRIGGER_SIZE
* How many units to register to a given trigger. More units = less refreshes, but
* more fps spikes. A value of 80 is recommended.
*
* TRIGGER_EVENT
* The event to register to the trigger. Example: EVENT_UNIT_DAMAGED.
*
* CODE
* Registers code to the trigger. Only 1 function may be registered to the trigger.
*
* private keyword Trigger
* Trigger(UnitIndex).parent.trigger
* - enable/disable trigger for specific unit
*
*************************************************************************************
*
* //quick and dirty DDS
* library MyDDS
* private function Core takes nothing returns nothing
* //will display whenever a unit is damaged
* call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,R2S(GetEventDamage()))
* endfunction
*
* //! runtextmacro TRIGGER_REFRESH("80", "EVENT_UNIT_DAMAGED", "function Core")
* endlibrary
*
*************************************************************************************/
endlibrary
//! textmacro TRIGGER_REFRESH takes TRIGGER_SIZE, TRIGGER_EVENT, CODE
scope TriggerRefresh
globals
private boolexpr condition
endglobals
struct Trigger extends array
private static integer instanceCount = 0
private thistype first
private thistype next
private thistype prev
readonly thistype parent
private integer inactiveUnits
readonly integer activeUnits
readonly trigger trigger
private method registerUnit takes UnitIndex whichUnit returns boolean
if (activeUnits < $TRIGGER_SIZE$) then
call TriggerRegisterUnitEvent(trigger, GetUnitById(whichUnit), $TRIGGER_EVENT$)
set activeUnits = activeUnits + 1
return true
endif
return false
endmethod
private method unregisterUnit takes nothing returns nothing
set inactiveUnits = inactiveUnits + 1
set activeUnits = activeUnits - 1
endmethod
private method createTrigger takes nothing returns nothing
set trigger = CreateTrigger()
call TriggerAddCondition(trigger, condition)
endmethod
private method remakeTrigger takes nothing returns nothing
call DestroyTrigger(trigger)
call createTrigger()
endmethod
private method rebuildTrigger takes nothing returns nothing
local thistype current = first
call remakeTrigger()
/*
* Iterate over all units registered to the trigger and reregister them
*/
set current.prev.next = 0
loop
exitwhen 0 == current
call TriggerRegisterUnitEvent(trigger, GetUnitById(current), $TRIGGER_EVENT$)
set current = current.next
endloop
set first.prev.next = current
endmethod
private method remake takes nothing returns nothing
if (inactiveUnits == $TRIGGER_SIZE$) then
set inactiveUnits = 0
call rebuildTrigger()
endif
endmethod
private method addToList takes thistype whichUnit returns nothing
set whichUnit.parent = this
if (0 == first) then
set first = whichUnit
set whichUnit.next = whichUnit
set whichUnit.prev = whichUnit
else
set this = first
set whichUnit.prev = prev
set whichUnit.next = this
set prev.next = whichUnit
set prev = whichUnit
endif
endmethod
method add takes thistype whichUnit returns boolean
if (0 == this) then
return false
endif
if (registerUnit(whichUnit)) then
call addToList(whichUnit)
return true
endif
return false
endmethod
private method removeFromList takes thistype whichUnit returns nothing
set whichUnit.parent = 0
set whichUnit.prev.next = whichUnit.next
set whichUnit.next.prev = whichUnit.prev
if (first == whichUnit) then
set first = whichUnit.next
if (first == whichUnit) then
set first = 0
endif
endif
endmethod
static method remove takes thistype whichUnit returns nothing
local thistype this = whichUnit.parent
call removeFromList(whichUnit)
call unregisterUnit()
call remake()
endmethod
private static method allocate takes nothing returns thistype
set instanceCount = instanceCount + 1
return instanceCount
endmethod
static method create takes nothing returns thistype
local thistype this = allocate()
call createTrigger()
return this
endmethod
endstruct
private struct TriggerHeapInner extends array
readonly static integer size = 0
readonly thistype node
readonly thistype heap
public method bubbleUp takes nothing returns nothing
local integer activeUnits = Trigger(this).activeUnits
local thistype heapPosition = heap
local thistype parent
/*
* Bubble node up
*/
loop
set parent = heapPosition/2
if (integer(parent) != 0 and activeUnits < Trigger(parent.node).activeUnits) then
set heapPosition.node = parent.node
set heapPosition.node.heap = heapPosition
else
exitwhen true
endif
set heapPosition = parent
endloop
/*
* Update pointers
*/
set heapPosition.node = this
set heap = heapPosition
endmethod
public method bubbleDown takes nothing returns nothing
local integer activeUnits = Trigger(this).activeUnits
local thistype heapPosition = heap
local thistype left
local thistype right
/*
* Bubble node down
*/
loop
set left = heapPosition*2
set right = left + 1
if (Trigger(left.node).activeUnits < activeUnits and Trigger(left.node).activeUnits < Trigger(right.node).activeUnits) then
/*
* Go left
*/
set heapPosition.node = left.node
set heapPosition.node.heap = heapPosition
set heapPosition = left
elseif (Trigger(right.node).activeUnits < activeUnits) then
/*
* Go right
*/
set heapPosition.node = right.node
set heapPosition.node.heap = heapPosition
set heapPosition = right
else
exitwhen true
endif
endloop
/*
* Update pointers
*/
set heapPosition.node = this
set heap = heapPosition
endmethod
static method insert takes thistype this returns nothing
/*
* Increase heap size
*/
set size = size + 1
/*
* Store node in last heap position
*/
set thistype(size).node = this
set heap = size
/*
* Bubble node into correct position
*/
call bubbleUp()
endmethod
endstruct
private struct TriggerHeap extends array
static method add takes UnitIndex whichUnit returns nothing
local Trigger trig = TriggerHeapInner(1).node
if (not trig.add(whichUnit)) then
set trig = Trigger.create()
call trig .add(whichUnit)
call TriggerHeapInner.insert(trig)
else
call TriggerHeapInner(trig).bubbleDown()
endif
endmethod
static method remove takes UnitIndex whichUnit returns nothing
local Trigger trig = Trigger(whichUnit).parent
call Trigger.remove(whichUnit)
call TriggerHeapInner(trig).bubbleUp()
endmethod
endstruct
private module TriggerRefreshInitModule
private static method onInit takes nothing returns nothing
call init($CODE$)
endmethod
endmodule
private struct TriggerRefreshInit extends array
private static method onIndex takes nothing returns boolean
call TriggerHeap.add(GetIndexedUnitId())
return false
endmethod
private static method onDeindex takes nothing returns boolean
call TriggerHeap.remove(GetIndexedUnitId())
return false
endmethod
private static method init takes code c returns nothing
set condition = Condition(c)
call RegisterUnitIndexEvent(Condition(function thistype.onIndex), UnitIndexer.INDEX)
call RegisterUnitIndexEvent(Condition(function thistype.onDeindex), UnitIndexer.DEINDEX)
endmethod
implement TriggerRefreshInitModule
endstruct
endscope
//! endtextmacro
library_once WorldBounds
private module WorldBoundInit
private static method onInit takes nothing returns nothing
set world=GetWorldBounds()
set maxX=R2I(GetRectMaxX(world))
set maxY=R2I(GetRectMaxY(world))
set minX=R2I(GetRectMinX(world))
set minY=R2I(GetRectMinY(world))
set centerX=R2I((maxX+minX)/2)
set centerY=R2I((minY+maxY)/2)
set worldRegion=CreateRegion()
call RegionAddRect(worldRegion,world)
endmethod
endmodule
struct WorldBounds extends array
readonly static integer maxX
readonly static integer maxY
readonly static integer minX
readonly static integer minY
readonly static integer centerX
readonly static integer centerY
readonly static rect world
readonly static region worldRegion
implement WorldBoundInit
endstruct
endlibrary
library_once Event
globals
private real q=0
endglobals
struct Event extends array
private static integer w=0
private static trigger array e
static method create takes nothing returns thistype
set w=w+1
set e[w]=CreateTrigger()
return w
endmethod
method registerTrigger takes trigger t returns nothing
call TriggerRegisterVariableEvent(t,SCOPE_PRIVATE+"q",EQUAL,this)
endmethod
method register takes boolexpr c returns nothing
call TriggerAddCondition(e[this],c)
endmethod
method fire takes nothing returns nothing
set q=0
set q=this
call TriggerEvaluate(e[this])
endmethod
endstruct
function CreateEvent takes nothing returns Event
return Event.create()
endfunction
function TriggerRegisterEvent takes trigger t,Event ev returns nothing
call ev.registerTrigger(t)
endfunction
function RegisterEvent takes boolexpr c,Event ev returns nothing
call ev.register(c)
endfunction
function FireEvent takes Event ev returns nothing
call ev.fire()
endfunction
endlibrary
//TESH.scrollpos=0
//TESH.alwaysfold=0
library DDS /* v1.0.1.0
*************************************************************************************
*
* */uses/*
*
* */ TriggerRefresh /* hiveworkshop.com/forums/submissions-414/trigger-refresh-systems-using-single-unit-events-like-dds-231167/
*
************************************************************************************
*
* SETTINGS
*/
globals
/*************************************************************************************
*
* How many units can refresh at a given moment (when a trigger is rebuilt).
* larger size means less triggers but harder refreshes.
*
*************************************************************************************/
private constant integer TRIGGER_SIZE = 80
endglobals
/*
*************************************************************************************
*
* struct DDS extends array
*
* Plugin properties
*
* module DDS
*
* Plugin interface
* Plugin properties (from DDS struct)
*
* Standard Methods (can be overwritten)
*
* boolean enabled
*
* - enables and disables the system for a given unit
*
* DDS[unit index].enabled = true
*
*************************************************************************************/
private keyword Trigger
private keyword DAMAGE_EVENT_API
private keyword DAMAGE_EVENT_MODIFICATION_API
private keyword DAMAGE_EVENT_ARCHETYPE_API
private keyword DAMAGE_EVENT_UNIT_MODIFICATION_API
private keyword DAMAGE_EVENT_RESPONSE_LOCALS
private keyword DAMAGE_EVENT_MODIFICATION_RESPONSE_LOCALS
private keyword DAMAGE_EVENT_ARCHETYPE_RESPONSE_LOCALS
private keyword DAMAGE_EVENT_UNIT_MODIFICATION_RESPONSE_LOCALS
private keyword DAMAGE_EVENT_RESPONSE_BEFORE
private keyword DAMAGE_EVENT_MODIFICATION_RESPONSE_BEFORE
private keyword DAMAGE_EVENT_ARCHETYPE_RESPONSE_BEFORE
private keyword DAMAGE_EVENT_UNIT_MODIFICATION_RESPONSE_BEFORE
private keyword DAMAGE_EVENT_RESPONSE
private keyword DAMAGE_EVENT_MODIFICATION_RESPONSE
private keyword DAMAGE_EVENT_ARCHETYPE_RESPONSE
private keyword DAMAGE_EVENT_UNIT_MODIFICATION_RESPONSE
private keyword DAMAGE_EVENT_RESPONSE_AFTER
private keyword DAMAGE_EVENT_MODIFICATION_RESPONSE_AFTER
private keyword DAMAGE_EVENT_ARCHETYPE_RESPONSE_AFTER
private keyword DAMAGE_EVENT_UNIT_MODIFICATION_RESPONSE_AFTER
private keyword DAMAGE_EVENT_RESPONSE_CLEANUP
private keyword DAMAGE_EVENT_MODIFICATION_RESPONSE_CLEANUP
private keyword DAMAGE_EVENT_ARCHETYPE_RESPONSE_CLEANUP
private keyword DAMAGE_EVENT_UNIT_MODIFICATION_RESPONSE_CLEANUP
private keyword DAMAGE_EVENT_INTERFACE
private keyword DAMAGE_EVENT_MODIFICATION_INTERFACE
private keyword DAMAGE_EVENT_ARCHETYPE_INTERFACE
private keyword DAMAGE_EVENT_UNIT_MODIFICATION_INTERFACE
private keyword DAMAGE_EVENT_INIT
private keyword DAMAGE_EVENT_MODIFICATION_INIT
private keyword DAMAGE_EVENT_ARCHETYPE_INIT
private keyword DAMAGE_EVENT_UNIT_MODIFICATION_INIT
//! runtextmacro optional DAMAGE_EVENT_CODE()
//! runtextmacro optional DAMAGE_EVENT_MODIFICATION_CODE()
//! runtextmacro optional DAMAGE_EVENT_ARCHETYPE_CODE()
//! runtextmacro optional DAMAGE_EVENT_UNIT_MODIFICATION_CODE()
private keyword DDS_onDamage
struct DDS extends array
method operator enabled takes nothing returns boolean
return IsTriggerEnabled(Trigger(this).parent.trigger)
endmethod
static if not ENABLED_EXISTS then
method operator enabled= takes boolean b returns nothing
if (b) then
call EnableTrigger(Trigger(this).parent.trigger)
else
call DisableTrigger(Trigger(this).parent.trigger)
endif
endmethod
else
implement optional DAMAGE_EVENT_ENABLE
endif
implement optional DAMAGE_EVENT_API
implement optional DAMAGE_EVENT_MODIFICATION_API
implement optional DAMAGE_EVENT_ARCHETYPE_API
implement optional DAMAGE_EVENT_UNIT_MODIFICATION_API
static method DDS_onDamage takes nothing returns nothing
implement optional DAMAGE_EVENT_RESPONSE_LOCALS
implement optional DAMAGE_EVENT_MODIFICATION_RESPONSE_LOCALS
implement optional DAMAGE_EVENT_ARCHETYPE_RESPONSE_LOCALS
implement optional DAMAGE_EVENT_UNIT_MODIFICATION_RESPONSE_LOCALS
implement optional DAMAGE_EVENT_RESPONSE_BEFORE
implement optional DAMAGE_EVENT_MODIFICATION_RESPONSE_BEFORE
implement optional DAMAGE_EVENT_ARCHETYPE_RESPONSE_BEFORE
implement optional DAMAGE_EVENT_UNIT_MODIFICATION_RESPONSE_BEFORE
implement optional DAMAGE_EVENT_RESPONSE
implement optional DAMAGE_EVENT_MODIFICATION_RESPONSE
implement optional DAMAGE_EVENT_ARCHETYPE_RESPONSE
implement optional DAMAGE_EVENT_UNIT_MODIFICATION_RESPONSE
implement optional DAMAGE_EVENT_RESPONSE_AFTER
implement optional DAMAGE_EVENT_MODIFICATION_RESPONSE_AFTER
implement optional DAMAGE_EVENT_ARCHETYPE_RESPONSE_AFTER
implement optional DAMAGE_EVENT_UNIT_MODIFICATION_RESPONSE_AFTER
implement optional DAMAGE_EVENT_RESPONSE_CLEANUP
implement optional DAMAGE_EVENT_MODIFICATION_RESPONSE_CLEANUP
implement optional DAMAGE_EVENT_ARCHETYPE_RESPONSE_CLEANUP
implement optional DAMAGE_EVENT_UNIT_MODIFICATION_RESPONSE_CLEANUP
endmethod
endstruct
module DDS
private static delegate DDS dds = 0
implement optional DAMAGE_EVENT_INTERFACE
implement optional DAMAGE_EVENT_MODIFICATION_INTERFACE
implement optional DAMAGE_EVENT_ARCHETYPE_INTERFACE
implement optional DAMAGE_EVENT_UNIT_MODIFICATION_INTERFACE
endmodule
//! runtextmacro TRIGGER_REFRESH("TRIGGER_SIZE", "EVENT_UNIT_DAMAGED", "function DDS.DDS_onDamage")
private module DDS_Init_Module
private static method onInit takes nothing returns nothing
implement optional DAMAGE_EVENT_INIT
implement optional DAMAGE_EVENT_MODIFICATION_INIT
implement optional DAMAGE_EVENT_ARCHETYPE_INIT
implement optional DAMAGE_EVENT_UNIT_MODIFICATION_INIT
endmethod
endmodule
private struct DDS_Init extends array
implement DDS_Init_Module
endstruct
endlibrary
//TESH.scrollpos=0
//TESH.alwaysfold=0
library DamageEvent /* v1.0.0.11
*************************************************************************************
*
* Damage Event plugin for DDS
*
*************************************************************************************
*
* */uses/*
*
* */ DDS /* hiveworkshop.com/forums/spells-569/framework-dds-damage-detection-system-231238/
* */ optional PriorityEvent /* hiveworkshop.com/forums/jass-resources-412/snippet-priority-event-213573/
*
*************************************************************************************
*
* API
*
* readonly static PriorityEvent ANY
* readonly static Event ANY
* - the PriorityEvent version is used if PriorityEvent library in map
* - run whenever a unit is damaged
*
* readony static real damage
* - amount of damage dealt
*
* readonly static unit target
* readonly static UnitIndex targetId
* - damaged unit
*
* readonly static unit source
* readonly static UnitIndex sourceId
* - unit that dealt damage
*
* readonly static player sourcePlayer
* - owner of source
*
*************************************************************************************
*
* Interface
*
* (optional) private static constant integer PRIORITY defaults 0
* - only used if PriorityEvent library is in map
* - range is -2147483648 to 2147483647
* - the higher the priority, the earlier the module runs compared to other modules
*
* (optional) private static method onDamage takes nothing returns nothing defaults nothing
* - is run whenever a unit is damaged
*
*************************************************************************************
*
* Plugin Information (can only be used by other plugins)
*
* static UnitIndex targetId_p
* static UnitIndex sourceId_p
*
* static real damage_p
*
* static player sourcePlayer_p
*
*************************************************************************************/
//! textmacro DAMAGE_EVENT_CODE
private keyword damage_p
private keyword targetId_p
private keyword sourceId_p
private keyword sourcePlayer_p
scope DamageEvent
/*
* DDS API
*
* DDS.ANY
* DDS.target
* DDS.source
* DDS.amount
*
*/
private keyword damageEventInit
module DAMAGE_EVENT_API
static if LIBRARY_PriorityEvent then
readonly static PriorityEvent ANY
else
readonly static Event ANY
endif
static UnitIndex targetId_p = 0
static UnitIndex sourceId_p = 0
static real damage_p = 0
static player sourcePlayer_p = null
static method operator targetId takes nothing returns UnitIndex
return targetId_p
endmethod
static method operator target takes nothing returns unit
return targetId.unit
endmethod
static method operator sourceId takes nothing returns UnitIndex
return sourceId_p
endmethod
static method operator source takes nothing returns unit
return sourceId.unit
endmethod
static method operator damage takes nothing returns real
return damage_p
endmethod
static method operator sourcePlayer takes nothing returns player
return sourcePlayer_p
endmethod
static method damageEventInit takes nothing returns nothing
static if LIBRARY_PriorityEvent then
set ANY = PriorityEvent.create()
else
set ANY = Event.create()
endif
endmethod
endmodule
module DAMAGE_EVENT_INIT
call DDS.damageEventInit()
endmodule
/*
* DDS Interface
*
* (optional) private static constant ineger PRIORITY defaults 0
* (optional) private static method onDamage takes nothing defaults nothing
*
*
*/
static if LIBRARY_PriorityEvent then
private struct DamageEventPriority extends array
readonly static constant integer PRIORITY = 0
endstruct
endif
module DAMAGE_EVENT_INTERFACE
static if LIBRARY_PriorityEvent then
private static delegate DamageEventPriority priority = 0
endif
static if thistype.onDamage.exists then
private static method init takes code c returns nothing
static if LIBRARY_PriorityEvent then
call ANY.register(Condition(c), PRIORITY)
else
call ANY.register(Condition(c))
endif
return
endmethod
private static method onInit takes nothing returns nothing
call init(function thistype.onDamage)
endmethod
endif
endmodule
/*
* DDS Event Handling
*/
module DAMAGE_EVENT_RESPONSE_LOCALS
local UnitIndex prevTarget = targetId_p
local UnitIndex prevSource = sourceId_p
local real prevDamage = damage_p
endmodule
module DAMAGE_EVENT_RESPONSE_BEFORE
if (0 == GetEventDamage()) then
return
endif
set targetId_p = GetUnitUserData(GetTriggerUnit())
set sourceId_p = GetUnitUserData(GetEventDamageSource())
set damage_p = GetEventDamage()
set sourcePlayer_p = GetOwningPlayer(sourceId_p.unit)
endmodule
module DAMAGE_EVENT_RESPONSE
call ANY.fire()
endmodule
module DAMAGE_EVENT_RESPONSE_AFTER
endmodule
module DAMAGE_EVENT_RESPONSE_CLEANUP
set targetId_p = prevTarget
set sourceId_p = prevSource
set damage_p = prevDamage
set sourcePlayer_p = GetOwningPlayer(sourceId_p.unit)
endmodule
endscope
//! endtextmacro
endlibrary
//TESH.scrollpos=0
//TESH.alwaysfold=0
library DamageEventModification /* v1.0.2.2
*************************************************************************************
*
* Damage Event Modification plugin for DDS
*
*************************************************************************************
*
* */uses/*
*
* */ DDS /* hiveworkshop.com/forums/spells-569/framework-dds-damage-detection-system-231238/
* */ DamageEvent /* hiveworkshop.com/forums/jass-resources-412/dds-plugin-damage-event-231172/
* */ RegisterPlayerUnitEvent /* hiveworkshop.com/forums/jass-resources-412/snippet-registerplayerunitevent-203338/
* */ LifeSaver /* hiveworkshop.com/forums/submissions-414/snippet-life-saver-234347/
*
*************************************************************************************
*
* API
*
* static real damage
* - may now be changed
* readonly static real damageOriginal
* - result of GetEventDamage()
* readonly static real damageModifiedAmount
* - how much the damage variable was changed
*
* readonly static real life
* - how much life the target unit has
*
*************************************************************************************
*
* Plugin Information (can only be used by other plugins)
*
* GLOBALS
*
* boolean array saved
* - does the unit have life bonus
*
* LOCALS
*
* real life
* - life of target unit
*
* unit u
* - stores target, improved speed
*
*************************************************************************************/
//! textmacro DAMAGE_EVENT_MODIFICATION_CODE
private keyword saved
scope DamageEventModification
globals
private timer afterDamageTimer = CreateTimer()
boolean array saved
private UnitIndex array id
private integer array index
private integer stackCount = 0
private unit killUnit
endglobals
private function OnAfterDamage takes nothing returns nothing
local integer i = stackCount
local integer u
loop
set i = i - 1
set u = id[i]
call RemoveMaxLife(u)
set saved[u] = false
exitwhen 0 == i
endloop
set stackCount = 0
endfunction
private function AddAfterDamage takes UnitIndex whichUnit returns nothing
if (not saved[whichUnit]) then
set saved[whichUnit] = true
set id[stackCount] = whichUnit
set index[whichUnit] = stackCount
set stackCount = stackCount + 1
call TimerStart(afterDamageTimer, 0, false, function OnAfterDamage)
call ApplyMaxLife(whichUnit)
endif
endfunction
private function RemoveAfterDamage takes UnitIndex whichUnit returns nothing
if (saved[whichUnit]) then
set saved[whichUnit] = false
call RemoveMaxLife(whichUnit)
set stackCount = stackCount - 1
set id[index[whichUnit]] = id[stackCount]
set index[id[stackCount]] = index[whichUnit]
if (stackCount == 0) then
call PauseTimer(afterDamageTimer)
endif
endif
endfunction
/*
* DDS API
*
* DDS.damage Can Now Be Set
* DDS.damageOriginal
* DDS.damageModifiedAmount
*
*/
module DAMAGE_EVENT_MODIFICATION_API
readonly static real damageOriginal = 0
static method operator damage= takes real newDamage returns nothing
set damage_p = newDamage
endmethod
static method operator damageModifiedAmount takes nothing returns real
return damage_p - damageOriginal
endmethod
static method operator life takes nothing returns real
return GetUnitLife(targetId_p)
endmethod
endmodule
module DAMAGE_EVENT_MODIFICATION_INIT
set UnitIndexer.enabled = false
set killUnit = CreateUnit(Player(15), 'hfoo', WorldBounds.maxX - 128, WorldBounds.maxY - 128, 0)
set UnitIndexer.enabled = true
call UnitAddAbility(killUnit, 'Aloc')
call UnitAddAbility(killUnit, 'Avul')
call ShowUnit(killUnit, false)
call PauseUnit(killUnit, true)
endmodule
/*
* DDS Interface
*/
module DAMAGE_EVENT_MODIFICATION_INTERFACE
endmodule
/*
* DDS Event Handling
*/
module DAMAGE_EVENT_MODIFICATION_RESPONSE_LOCALS
local real actualDamage
local real prevDamageOriginal = damageOriginal
local real life
local unit u
endmodule
module DAMAGE_EVENT_MODIFICATION_RESPONSE_BEFORE
set actualDamage = damage_p
set damageOriginal = actualDamage //original damage as seen by user
set u = targetId_p.unit
endmodule
module DAMAGE_EVENT_MODIFICATION_RESPONSE
endmodule
module DAMAGE_EVENT_MODIFICATION_RESPONSE_AFTER
set life = GetUnitLife(targetId_p)
if (life - damage_p < .4051) then
call RemoveAfterDamage(targetId_p)
if (actualDamage < 0) then
set DDS[targetId_p].enabled = false
call SetUnitX(killUnit, GetUnitX(u))
call SetUnitY(killUnit, GetUnitY(u))
call SetUnitOwner(killUnit, sourcePlayer_p, false)
call SetWidgetLife(u, damageOriginal)
call UnitDamageTarget(killUnit, u, damageOriginal*100, true, false, null, DAMAGE_TYPE_UNIVERSAL, null)
call SetWidgetLife(u, damageOriginal)
call UnitDamageTarget(killUnit, u, damageOriginal*100, true, false, null, DAMAGE_TYPE_NORMAL, null)
set DDS[targetId_p].enabled = true
else
call SetWidgetLife(u, actualDamage)
endif
elseif (saved[targetId_p]) then
call AddUnitTargetLife(targetId_p, -damage_p)
if (actualDamage > 0) then
call SetWidgetLife(u, GetWidgetLife(u) + actualDamage)
endif
elseif (actualDamage < 0) then
if (life + actualDamage - damage_p < .406) then
call AddAfterDamage(targetId_p)
call AddUnitTargetLife(targetId_p, -damage_p)
else
call SetWidgetLife(u, life + actualDamage - damage_p)
endif
else
if (life + actualDamage - damage_p > GetUnitState(u, UNIT_STATE_MAX_LIFE)) then
call AddAfterDamage(targetId_p)
call AddUnitTargetLife(targetId_p, -damage_p)
call SetWidgetLife(u, GetWidgetLife(u) + actualDamage)
else
call SetWidgetLife(u, life + actualDamage - damage_p)
endif
endif
endmodule
module DAMAGE_EVENT_MODIFICATION_RESPONSE_CLEANUP
set damageOriginal = prevDamageOriginal
set u = null
endmodule
private module Init
private static method onInit takes nothing returns nothing
call init()
endmethod
endmodule
private struct OnDeath extends array
private static method onDeath takes nothing returns nothing
call RemoveAfterDamage(GetUnitUserData(GetTriggerUnit()))
endmethod
private static method init takes nothing returns nothing
call RegisterPlayerUnitEvent(EVENT_PLAYER_UNIT_DEATH, function thistype.onDeath)
endmethod
implement Init
endstruct
private struct Deindex extends array
private method deindex takes nothing returns nothing
call RemoveAfterDamage(this)
endmethod
implement UnitIndexStruct
endstruct
endscope
//! endtextmacro
endlibrary
//TESH.scrollpos=160
//TESH.alwaysfold=0
library DamageEventArchetype /* v1.0.1.1
*************************************************************************************
*
* Damage Event Archetype plugin for DDS
*
*
* Notes
* --------------
*
* - Must invert Damage Return Factor for Locust Swarm based abilities
*
* - Must invert healing portion of Life Drain based abilities
*
*************************************************************************************
*
* */uses/*
*
* */ DDS /* hiveworkshop.com/forums/spells-569/framework-dds-damage-detection-system-231238/
* */ DamageEventModification /* hiveworkshop.com/forums/jass-resources-412/dds-plugin-damage-event-modification-231176/
*
************************************************************************************
*
* SETTINGS
*/
globals
/*************************************************************************************
*
* Configure to spell reduction ability type id
*
*************************************************************************************/
constant integer DAMAGE_EVENT_ARCHETYPE_PLUGIN_ABILITY = 'A002'
endglobals
/*
*************************************************************************************
*
* API
*
* static constant integer Archetype.SPELL
* static constant integer Archetype.PHYSICAL
* static constant integer Archetype.CODE
*
* readonly static integer archetype
* - type of damage source damage came from: SPELL, PHYSICAL, CODE
*
* static UnitIndex damageCode
* - set this to the unit that will be damaged with code
*
* seals (can no longer be overwritten)
*
* boolean enabled (from DDS Framework)
*
*************************************************************************************/
//! textmacro DAMAGE_EVENT_ARCHETYPE_CODE
globals
private constant boolean ENABLED_EXISTS = true
private real scale
endglobals
scope Archetype
private struct DamageEventArchtype extends array
static constant integer SPELL = 0
static constant integer PHYSICAL = 1
static constant integer CODE = 2
endstruct
/*
* DDS API
*
* DDS.Archetype.SPELL
* DDS.Archetype.PHYSICAL
* DDS.Archetype.CODE
* DDS.archetype
* DDS.damageCode
*
*/
private keyword archetype_p
private keyword damageEventArchetypeInit
private keyword damageCode_p
module DAMAGE_EVENT_ARCHETYPE_API
readonly static DamageEventArchtype Archetype = 0
static integer archetype_p = 0
static UnitIndex damageCode_p = 0
static method operator damageCode= takes UnitIndex u returns nothing
set damageCode_p = u
endmethod
static method operator damageCode takes nothing returns UnitIndex
return damageCode_p
endmethod
static method operator archetype takes nothing returns integer
return archetype_p
endmethod
private static method onIndex takes nothing returns boolean
call UnitAddAbility(GetIndexedUnit(), DAMAGE_EVENT_ARCHETYPE_PLUGIN_ABILITY)
call UnitMakeAbilityPermanent(GetIndexedUnit(), true, DAMAGE_EVENT_ARCHETYPE_PLUGIN_ABILITY)
return false
endmethod
static method damageEventArchetypeInit takes nothing returns nothing
local integer playerId
set playerId = 15
loop
call SetPlayerAbilityAvailable(Player(playerId), DAMAGE_EVENT_ARCHETYPE_PLUGIN_ABILITY, false)
exitwhen 0 == playerId
set playerId = playerId - 1
endloop
call RegisterUnitIndexEvent(Condition(function thistype.onIndex), UnitIndexer.INDEX)
endmethod
endmodule
module DAMAGE_EVENT_ENABLE
method operator enabled= takes boolean b returns nothing
if (b) then
call EnableTrigger(Trigger(this).parent.trigger)
call UnitAddAbility(UnitIndex(this).unit, DAMAGE_EVENT_ARCHETYPE_PLUGIN_ABILITY)
call UnitMakeAbilityPermanent(UnitIndex(this).unit, true, DAMAGE_EVENT_ARCHETYPE_PLUGIN_ABILITY)
else
call DisableTrigger(Trigger(this).parent.trigger)
call UnitRemoveAbility(UnitIndex(this).unit, DAMAGE_EVENT_ARCHETYPE_PLUGIN_ABILITY)
endif
endmethod
endmodule
module DAMAGE_EVENT_ARCHETYPE_INIT
call DDS.damageEventArchetypeInit()
endmodule
/*
* DDS Interface
*/
module DAMAGE_EVENT_ARCHETYPE_INTERFACE
endmodule
/*
* DDS Event Handling
*/
module DAMAGE_EVENT_ARCHETYPE_RESPONSE_LOCALS
local integer prevArchetype = archetype_p
endmodule
module DAMAGE_EVENT_ARCHETYPE_RESPONSE_BEFORE
if (damage_p < 0) then
set archetype_p = Archetype.SPELL
/*
* Calculate spell resistance
*/
call DisableTrigger(Trigger(targetId_p).parent.trigger)
set life = GetWidgetLife(u)
set scale = GetUnitState(u, UNIT_STATE_MAX_LIFE)
call SetWidgetLife(u, scale)
call UnitDamageTarget(u, u, -scale/2, false, false, null, DAMAGE_TYPE_UNIVERSAL, null)
set scale = 2*(scale - GetWidgetLife(u))/scale
if (scale > 1) then
set damageOriginal = -damageOriginal*scale
else
set damageOriginal = -damageOriginal
endif
call SetWidgetLife(u, life)
call EnableTrigger(Trigger(targetId_p).parent.trigger)
set damage_p = damageOriginal
else
set archetype_p = Archetype.PHYSICAL
endif
if (damageCode_p != 0) then
set archetype_p = Archetype.CODE
set damageCode_p = 0
endif
endmodule
module DAMAGE_EVENT_ARCHETYPE_RESPONSE
endmodule
module DAMAGE_EVENT_ARCHETYPE_RESPONSE_AFTER
endmodule
module DAMAGE_EVENT_ARCHETYPE_RESPONSE_CLEANUP
set archetype_p = prevArchetype
endmodule
endscope
//! endtextmacro
endlibrary
//TESH.scrollpos=117
//TESH.alwaysfold=0
library DamageEventUnitModification /* v1.0.0.0
*************************************************************************************
*
* Damage Event Unit Modification plugin for DDS
*
*************************************************************************************
*
* */uses/*
*
* */ DDS /* hiveworkshop.com/forums/submissions-414/framework-dds-damage-detection-system-231169/
* */ DamageEventModification /* hiveworkshop.com/forums/jass-resources-412/dds-plugin-damage-event-modification-231176/
* */ Type /* hiveworkshop.com/forums/jass-resources-412/snippet-type-231221/
*
************************************************************************************
*
* SETTINGS
*/
globals
/*************************************************************************************
*
*
*
*************************************************************************************/
endglobals
/*
*************************************************************************************
*
* API
*
*
*
*************************************************************************************
*
* Interface
*
*
*
*************************************************************************************/
//! textmacro DAMAGE_EVENT_UNIT_MODIFICATION_CODE
/*
* DDS API
*
*
*
*/
private struct DirectionType extends array
public static constant boolean INCOMING = true
public static constant boolean OUTGIONG = false
endstruct
private keyword DamageEventUnitModificationInit
private module DAMAGE_EVENT_UNIT_MODIFICATION_API
static if LIBRARY_PriorityEvent then
readonly static PriorityEvent INCOMING
readonly static PriorityEvent OUTGOING
else
readonly static Event INCOMING
readonly static Event OUTGOING
endif
static method operator DirectionType takes nothing returns DirectionType
return 0
endmethod
static method DamageEventUnitModificationInit takes nothing returns nothing
static if LIBRARY_PriorityEvent then
set INCOMING = PriorityEvent.create()
set OUTGOING = PriorityEvent.create()
else
set INCOMING = Event.create()
set OUTGOING = Event.create()
endif
endmethod
endmodule
module DAMAGE_EVENT_UNIT_MODIFICATION_INIT
call DDS.DamageEventUnitModificationInit()
endmodule
/*
* DDS Interface
*
*
*
*
*/
static if LIBRARY_PriorityEvent then
private struct DamageEventUnitModificationPriority extends array
readonly static constant integer PRIORITY_INCOMING = 0
readonly static constant integer PRIORITY_OUTGOING = 0
endstruct
endif
private module ModuleCode
private static delegate DamageEventUnitModificationPriority priority = 0
static if thistype.onDamageOutgoing.exists then
private thistype nextOutgoing
private thistype prevOutgoing
private static method onDamageOutgoing_P takes nothing returns boolean
return false
endmethod
endif
static if thistype.onDamageIncoming.exists then
private thistype firstIncoming //first on list
private thistype nextIncoming //list.next, recycler
private thistype prevIncoming //list.prev
private static integer countIncoming = 0 //instance count
private static method allocateIncoming takes nothing returns thistype
local thistype node = thistype(0).nextIncoming
if (0 == this) then
set this = countIncoming + 1
set countIncoming = this
else
set thistype(0).nextIncoming = nextIncoming
endif
return this
endmethod
private method addIncoming takes nothing returns thistype
local thistype node = allocateIncoming()
set node.next = 0
set node.prev = prev
if (0 == prev) then
set next = node
else
set prev.next = node
endif
set prev = node
set node.head = this
return this
endmethod
private method removeIncoming takes nothing returns nothing
endmethod
private static method onDamageIncoming_P takes nothing returns boolean
return false
endmethod
endif
static method apply takes UnitIndex u, DirectionType direction returns thistype
return 0
endmethod
private static method init takes nothing returns nothing
static if thistype.onDamageOutgoing.exists then
static if LIBRARY_PriorityEvent then
call OUTGOING.register(Condition(function thistype.onDamageOutgoing_P), PRIORITY_OUTGOING)
else
call OUTGOING.register(Condition(function thistype.onDamageOutgoing_P))
endif
endif
static if thistype.onDamageIncoming.exists then
static if LIBRARY_PriorityEvent then
call INCOMING.register(Condition(function thistype.onDamageIncoming_P), PRIORITY_INCOMING)
else
call INCOMING.register(Condition(function thistype.onDamageIncoming_P))
endif
endif
return
endmethod
private static method onInit takes nothing returns nothing
call init()
endmethod
endmodule
module DAMAGE_EVENT_UNIT_MODIFICATION_INTERFACE
static if thistype.onDamageOutgoing.exists then
implement ModuleCode
elseif thistype.onDamageIncoming.exists then
implement ModuleCode
endif
endmodule
/*
* DDS Event Handling
*/
module DAMAGE_EVENT_UNIT_MODIFICATION_RESPONSE_LOCALS
endmodule
module DAMAGE_EVENT_UNIT_MODIFICATION_RESPONSE_BEFORE
endmodule
module DAMAGE_EVENT_UNIT_MODIFICATION_RESPONSE
endmodule
module DAMAGE_EVENT_UNIT_MODIFICATION_RESPONSE_AFTER
endmodule
module DAMAGE_EVENT_UNIT_MODIFICATION_RESPONSE_CLEANUP
endmodule
//! endtextmacro
endlibrary
//TESH.scrollpos=0
//TESH.alwaysfold=0
library UnitIndexerSettings
globals
constant integer ABILITIES_UNIT_INDEXER = 'A000'
endglobals
endlibrary
library UnitIndexer uses WorldBounds, Event, UnitIndexerSettings
globals
private trigger q=CreateTrigger()
private trigger l=CreateTrigger()
private unit array e
private integer r=0
private integer y=0
private integer o=0
private boolean a=false
private integer array n
private integer array p
private integer array lc
endglobals
function GetIndexedUnitId takes nothing returns integer
return o
endfunction
function GetIndexedUnit takes nothing returns unit
return e[o]
endfunction
//! runtextmacro optional UNIT_LIST_LIB()
private struct PreLoader extends array
public static method run takes nothing returns nothing
call DestroyTimer(GetExpiredTimer())
set a=true
endmethod
public static method eval takes trigger t returns nothing
local integer f=n[0]
local integer d=o
loop
exitwhen 0==f
if (IsTriggerEnabled(t)) then
set o=f
if (TriggerEvaluate(t)) then
call TriggerExecute(t)
endif
else
exitwhen true
endif
set f=n[f]
endloop
set o=d
endmethod
public static method evalb takes boolexpr c returns nothing
local trigger t=CreateTrigger()
local thistype f=n[0]
local integer d=o
call TriggerAddCondition(t,c)
loop
exitwhen 0==f
set o=f
call TriggerEvaluate(t)
set f=n[f]
endloop
call DestroyTrigger(t)
set t=null
set o=d
endmethod
endstruct
//! runtextmacro optional UNIT_EVENT_MACRO()
private module UnitIndexerInit
private static method onInit takes nothing returns nothing
local integer i=15
local boolexpr bc=Condition(function thistype.onLeave)
local boolexpr bc2=Condition(function thistype.onEnter)
local group g=CreateGroup()
local player p
set INDEX=CreateEvent()
set DEINDEX=CreateEvent()
call TriggerRegisterEnterRegion(q,WorldBounds.worldRegion,bc2)
loop
set p=Player(i)
call TriggerRegisterPlayerUnitEvent(l,p,EVENT_PLAYER_UNIT_ISSUED_ORDER,bc)
call SetPlayerAbilityAvailable(p,ABILITIES_UNIT_INDEXER,false)
call GroupEnumUnitsOfPlayer(g,p,bc2)
exitwhen 0==i
set i=i-1
endloop
call DestroyGroup(g)
set bc=null
set g=null
set bc2=null
set p=null
call TimerStart(CreateTimer(),0,false,function PreLoader.run)
endmethod
endmodule
struct UnitIndex extends array
method operator locks takes nothing returns integer
return lc[this]
endmethod
method operator locks= takes integer v returns nothing
set lc[this] = v
endmethod
method lock takes nothing returns nothing
debug if (null!=e[this]) then
set lc[this]=lc[this]+1
debug else
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,"UNIT INDEXER ERROR: ATTEMPT TO LOCK NULL INDEX")
debug endif
endmethod
method unlock takes nothing returns nothing
debug if (0<lc[this]) then
set lc[this]=lc[this]-1
if (0==lc[this] and null==e[this]) then
set n[this]=y
set y=this
endif
debug else
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,"UNIT INDEXER ERROR: ATTEMPT TO UNLOCK UNLOCKED INDEX")
debug endif
endmethod
method operator unit takes nothing returns unit
return e[this]
endmethod
static method operator [] takes unit whichUnit returns thistype
return GetUnitUserData(whichUnit)
endmethod
endstruct
struct UnitIndexer extends array
readonly static Event INDEX
readonly static Event DEINDEX
static boolean enabled = true
private static method onEnter takes nothing returns boolean
local unit Q=GetFilterUnit()
local integer i
local integer d=o
if (enabled and Q!=e[GetUnitUserData(Q)] and 0==GetUnitUserData(Q)) then
if (0==y) then
set r=r+1
set i=r
else
set i=y
set y=n[y]
endif
call UnitAddAbility(Q,ABILITIES_UNIT_INDEXER)
call UnitMakeAbilityPermanent(Q,true,ABILITIES_UNIT_INDEXER)
call SetUnitUserData(Q,i)
set e[i]=Q
static if not LIBRARY_UnitList then
if (not a)then
set p[i]=p[0]
set n[p[0]]=i
set n[i]=0
set p[0]=i
endif
else
set p[i]=p[0]
set n[p[0]]=i
set n[i]=0
set p[0]=i
call GroupAddUnit(g,e[i])
endif
set o=i
call FireEvent(INDEX)
set o=d
endif
set Q=null
return false
endmethod
private static method onLeave takes nothing returns boolean
static if LIBRARY_UnitEvent then
implement optional UnitEventModule
else
local unit u=GetFilterUnit()
local integer i=GetUnitUserData(u)
local integer d=o
if (0==GetUnitAbilityLevel(u,ABILITIES_UNIT_INDEXER) and u==e[i]) then
static if not LIBRARY_UnitList then
if (not a)then
set n[p[i]]=n[i]
set p[n[i]]=p[i]
endif
else
set n[p[i]]=n[i]
set p[n[i]]=p[i]
call GroupRemoveUnit(g,e[i])
endif
set o=i
call FireEvent(DEINDEX)
set o=d
if (0==lc[i]) then
set n[i]=y
set y=i
endif
set e[i]=null
endif
set u=null
endif
return false
endmethod
implement UnitIndexerInit
endstruct
//! runtextmacro optional UNIT_EVENT_MACRO_2()
function RegisterUnitIndexEvent takes boolexpr c,integer ev returns nothing
call RegisterEvent(c, ev)
if (not a and ev==UnitIndexer.INDEX and 0!=n[0]) then
call PreLoader.evalb(c)
endif
endfunction
function TriggerRegisterUnitIndexEvent takes trigger t,integer ev returns nothing
call TriggerRegisterEvent(t,ev)
if (not a and ev == UnitIndexer.INDEX and 0!=n[0]) then
call PreLoader.eval(t)
endif
endfunction
function GetUnitById takes integer W returns unit
return e[W]
endfunction
function GetUnitId takes unit u returns integer
return GetUnitUserData(u)
endfunction
function IsUnitIndexed takes unit u returns boolean
return u==e[GetUnitUserData(u)]
endfunction
function IsUnitDeindexing takes unit u returns boolean
return IsUnitIndexed(u) and 0==GetUnitAbilityLevel(u,ABILITIES_UNIT_INDEXER)
endfunction
module UnitIndexStructMethods
static method operator [] takes unit u returns thistype
return GetUnitUserData(u)
endmethod
method operator unit takes nothing returns unit
return e[this]
endmethod
endmodule
module UnitIndexStruct
implement UnitIndexStructMethods
static if thistype.filter.exists then
static if thistype.index.exists then
static if thistype.deindex.exists then
readonly boolean allocated
else
method operator allocated takes nothing returns boolean
return filter(e[this])
endmethod
endif
else
method operator allocated takes nothing returns boolean
return filter(e[this])
endmethod
endif
elseif (thistype.index.exists) then
static if thistype.deindex.exists then
readonly boolean allocated
else
method operator allocated takes nothing returns boolean
return this==GetUnitUserData(e[this])
endmethod
endif
else
method operator allocated takes nothing returns boolean
return this==GetUnitUserData(e[this])
endmethod
endif
static if thistype.index.exists then
private static method onIndexEvent takes nothing returns boolean
static if thistype.filter.exists then
if (filter(e[o])) then
static if thistype.deindex.exists then
set thistype(o).allocated=true
endif
call thistype(o).index()
endif
else
static if thistype.deindex.exists then
set thistype(o).allocated=true
endif
call thistype(o).index()
endif
return false
endmethod
endif
static if thistype.deindex.exists then
private static method onDeindexEvent takes nothing returns boolean
static if thistype.filter.exists then
static if thistype.index.exists then
if (thistype(o).allocated) then
set thistype(o).allocated=false
call thistype(o).deindex()
endif
else
if (filter(e[o])) then
call thistype(o).deindex()
endif
endif
else
static if thistype.index.exists then
set thistype(o).allocated=false
endif
call thistype(o).deindex()
endif
return false
endmethod
endif
static if thistype.index.exists then
static if thistype.deindex.exists then
private static method onInit takes nothing returns nothing
call RegisterUnitIndexEvent(Condition(function thistype.onIndexEvent),UnitIndexer.INDEX)
call RegisterUnitIndexEvent(Condition(function thistype.onDeindexEvent),UnitIndexer.DEINDEX)
endmethod
else
private static method onInit takes nothing returns nothing
call RegisterUnitIndexEvent(Condition(function thistype.onIndexEvent),UnitIndexer.INDEX)
endmethod
endif
elseif thistype.deindex.exists then
private static method onInit takes nothing returns nothing
call RegisterUnitIndexEvent(Condition(function thistype.onDeindexEvent),UnitIndexer.DEINDEX)
endmethod
endif
endmodule
endlibrary
//TESH.scrollpos=0
//TESH.alwaysfold=0
library LifeSaver /* v1.0.1.1
*************************************************************************************
*
* Applies very large life bonus to a unit, maintaining scale
*
* Removes bonus on unit death/deindex
*
*************************************************************************************
*
* */uses/*
*
*/ UnitIndexer /* hiveworkshop.com/forums/jass-functions-413/unit-indexer-172090/
* */ RegisterPlayerUnitEvent /* hiveworkshop.com/forums/jass-resources-412/snippet-registerplayerunitevent-203338/
*
************************************************************************************
*
* SETTINGS
*/
globals
/*************************************************************************************
*
* Configure to life bonus ability type id
*
*************************************************************************************/
constant integer LIFE_SAVER_ABILITY_ID = 'A001'
endglobals
/*
*************************************************************************************
*
* function ApplyMaxLife takes UnitIndex whichUnit returns nothing
* - adds 10 million health to unit and creates background value with unit's regular life
* function RemoveMaxLife takes UnitIndex whichUnit returns nothing
* - removes bonus and sets unit's life to background value
* function GetUnitLife takes UnitIndex whichUnit returns real
* - returns widget life with no bonus, or background value with bonus
* function AddUnitLife takes UnitIndex whichUnit, real r returns nothing
* - adds to widget life
* function AddUnitTargetLife takes UnitIndex whichUnit, real r returns nothing
* - adds to background value
*
*************************************************************************************/
globals
private real array currentLife
private real life
private real scale
endglobals
function ApplyMaxLife takes UnitIndex whichUnit returns nothing
set currentLife[whichUnit] = GetWidgetLife(whichUnit.unit)
set scale = currentLife[whichUnit]/GetUnitState(whichUnit.unit, UNIT_STATE_MAX_LIFE)
if (scale < .1) then
set scale = .1
endif
call UnitAddAbility(whichUnit.unit, LIFE_SAVER_ABILITY_ID)
call UnitMakeAbilityPermanent(whichUnit.unit, true, LIFE_SAVER_ABILITY_ID)
call SetWidgetLife(whichUnit.unit, GetUnitState(whichUnit.unit, UNIT_STATE_MAX_LIFE)*scale)
endfunction
function RemoveMaxLife takes UnitIndex whichUnit returns nothing
call UnitRemoveAbility(whichUnit.unit, LIFE_SAVER_ABILITY_ID)
call SetWidgetLife(whichUnit.unit, currentLife[whichUnit])
set currentLife[whichUnit] = -1
endfunction
function GetUnitLife takes UnitIndex whichUnit returns real
if (currentLife[whichUnit] == -1) then
return GetWidgetLife(whichUnit.unit)
endif
return currentLife[whichUnit]
endfunction
function AddUnitLife takes UnitIndex whichUnit, real r returns nothing
call SetWidgetLife(whichUnit.unit, GetWidgetLife(whichUnit.unit) + r)
endfunction
function AddUnitTargetLife takes UnitIndex whichUnit, real r returns nothing
set currentLife[whichUnit] = currentLife[whichUnit] + r
endfunction
private function OnDeath takes nothing returns nothing
call UnitRemoveAbility(GetTriggerUnit(), LIFE_SAVER_ABILITY_ID)
set currentLife[GetUnitUserData(GetTriggerUnit())] = -1
endfunction
private module Init
private static method onInit takes nothing returns nothing
call init()
endmethod
endmodule
private struct Index extends array
private static method init takes nothing returns nothing
call RegisterPlayerUnitEvent(EVENT_PLAYER_UNIT_DEATH, function OnDeath)
endmethod
implement Init
private method index takes nothing returns nothing
set currentLife[this] = -1
endmethod
implement UnitIndexStruct
endstruct
endlibrary
//TESH.scrollpos=0
//TESH.alwaysfold=0
/**************************************************************
*
* RegisterPlayerUnitEvent
* v5.1.0.1
* By Magtheridon96
*
* I would like to give a special thanks to Bribe, azlier
* and BBQ for improving this library. For modularity, it only
* supports player unit events.
*
* Functions passed to RegisterPlayerUnitEvent must either
* return a boolean (false) or nothing. (Which is a Pro)
*
* Warning:
* --------
*
* - Don't use TriggerSleepAction inside registered code.
* - Don't destroy a trigger unless you really know what you're doing.
*
* API:
* ----
*
* - function RegisterPlayerUnitEvent takes playerunitevent whichEvent, code whichFunction returns nothing
* - Registers code that will execute when an event fires.
* - function RegisterPlayerUnitEventForPlayer takes playerunitevent whichEvent, code whichFunction, player whichPlayer returns nothing
* - Registers code that will execute when an event fires for a certain player.
* - function GetPlayerUnitEventTrigger takes playerunitevent whichEvent returns trigger
* - Returns the trigger corresponding to ALL functions of a playerunitevent.
*
**************************************************************/
library RegisterPlayerUnitEvent // Special Thanks to Bribe and azlier
globals
private trigger array t
endglobals
function RegisterPlayerUnitEvent takes playerunitevent p, code c returns nothing
local integer i = GetHandleId(p)
local integer k = 15
if t[i] == null then
set t[i] = CreateTrigger()
loop
call TriggerRegisterPlayerUnitEvent(t[i], Player(k), p, null)
exitwhen k == 0
set k = k - 1
endloop
endif
call TriggerAddCondition(t[i], Filter(c))
endfunction
function RegisterPlayerUnitEventForPlayer takes playerunitevent p, code c, player pl returns nothing
local integer i = 16 * GetHandleId(p) + GetPlayerId(pl)
if t[i] == null then
set t[i] = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(t[i], pl, p, null)
endif
call TriggerAddCondition(t[i], Filter(c))
endfunction
function GetPlayerUnitEventTrigger takes playerunitevent p returns trigger
return t[GetHandleId(p)]
endfunction
endlibrary
//TESH.scrollpos=0
//TESH.alwaysfold=0
library Type /* v1.0.0.0
*************************************************************************************
*
* Type checking
*
*************************************************************************************
*
* struct Type extends array
*
* static method create takes Type parent returns Type
* - Creates a new type given a parent
*
* method extends takes Type type returns boolean
* - A.extends(B) checks if A extends B (B parent of A)
* method isParent takes Type type returns boolean
* - A.isParent(B) checks if A is a parent of B (B extends A)
*
*************************************************************************************/
struct Type extends array
private static integer instanceCount = 0
private static hashtable parentTable = InitHashtable()
private Type parent
static method create takes Type parent returns Type
local thistype this = instanceCount + 1
set instanceCount = this
call SaveBoolean(parentTable, this, this, true)
call SaveBoolean(parentTable, this, 0, true)
set this.parent = parent
loop
exitwhen parent == 0
call SaveBoolean(parentTable, this, parent, true)
set parent = thistype(parent).parent
endloop
return instanceCount
endmethod
method extends takes Type t returns boolean
return HaveSavedBoolean(parentTable, this, t)
endmethod
method isParent takes Type t returns boolean
return HaveSavedBoolean(parentTable, t, this)
endmethod
endstruct
endlibrary
//TESH.scrollpos=0
//TESH.alwaysfold=0
library Table /* made by Bribe, special thanks to Vexorian & Nestharus, version 3.1.0.1
One map, one hashtable. Welcome to NewTable 3.1
This library was originally called NewTable so it didn't conflict with
the API of Table by Vexorian. However, the damage is done and it's too
late to change the library name now. To help with damage control, I
have provided an extension library called TableBC, which bridges all
the functionality of Vexorian's Table except for 2-D string arrays &
the ".flush(integer)" method. I use ".flush()" to flush a child hash-
table, because I wanted the API in NewTable to reflect the API of real
hashtables (I thought this would be more intuitive).
API
------------
struct Table
| static method create takes nothing returns Table
| create a new Table
|
| method destroy takes nothing returns nothing
| destroy it
|
| method flush takes nothing returns nothing
| flush all stored values inside of it
|
| method remove takes integer key returns nothing
| remove the value at index "key"
|
| method operator []= takes integer key, $TYPE$ value returns nothing
| assign "value" to index "key"
|
| method operator [] takes integer key returns $TYPE$
| load the value at index "key"
|
| method has takes integer key returns boolean
| whether or not the key was assigned
|
----------------
struct TableArray
| static method operator [] takes integer array_size returns TableArray
| create a new array of Tables of size "array_size"
|
| method destroy takes nothing returns nothing
| destroy it
|
| method flush takes nothing returns nothing
| flush and destroy it
|
| method operator size takes nothing returns integer
| returns the size of the TableArray
|
| method operator [] takes integer key returns Table
| returns a Table accessible exclusively to index "key"
*/
globals
private integer less = 0 //Index generation for TableArrays (below 0).
private integer more = 8190 //Index generation for Tables.
//Configure it if you use more than 8190 "key" variables in your map (this will never happen though).
private hashtable ht = InitHashtable()
private key sizeK
private key listK
endglobals
private struct dex extends array
static method operator size takes nothing returns Table
return sizeK
endmethod
static method operator list takes nothing returns Table
return listK
endmethod
endstruct
private struct handles extends array
method has takes integer key returns boolean
return HaveSavedHandle(ht, this, key)
endmethod
method remove takes integer key returns nothing
call RemoveSavedHandle(ht, this, key)
endmethod
endstruct
private struct agents extends array
method operator []= takes integer key, agent value returns nothing
call SaveAgentHandle(ht, this, key, value)
endmethod
endstruct
//! textmacro NEW_ARRAY_BASIC takes SUPER, FUNC, TYPE
private struct $TYPE$s extends array
method operator [] takes integer key returns $TYPE$
return Load$FUNC$(ht, this, key)
endmethod
method operator []= takes integer key, $TYPE$ value returns nothing
call Save$FUNC$(ht, this, key, value)
endmethod
method has takes integer key returns boolean
return HaveSaved$SUPER$(ht, this, key)
endmethod
method remove takes integer key returns nothing
call RemoveSaved$SUPER$(ht, this, key)
endmethod
endstruct
private module $TYPE$m
method operator $TYPE$ takes nothing returns $TYPE$s
return this
endmethod
endmodule
//! endtextmacro
//! textmacro NEW_ARRAY takes FUNC, TYPE
private struct $TYPE$s extends array
method operator [] takes integer key returns $TYPE$
return Load$FUNC$Handle(ht, this, key)
endmethod
method operator []= takes integer key, $TYPE$ value returns nothing
call Save$FUNC$Handle(ht, this, key, value)
endmethod
endstruct
private module $TYPE$m
method operator $TYPE$ takes nothing returns $TYPE$s
return this
endmethod
endmodule
//! endtextmacro
//Run these textmacros to include the entire hashtable API as wrappers.
//Don't be intimidated by the number of macros - Vexorian's map optimizer is
//supposed to kill functions which inline (all of these functions inline).
//! runtextmacro NEW_ARRAY_BASIC("Real", "Real", "real")
//! runtextmacro NEW_ARRAY_BASIC("Boolean", "Boolean", "boolean")
//! runtextmacro NEW_ARRAY_BASIC("String", "Str", "string")
//! runtextmacro NEW_ARRAY("Player", "player")
//! runtextmacro NEW_ARRAY("Widget", "widget")
//! runtextmacro NEW_ARRAY("Destructable", "destructable")
//! runtextmacro NEW_ARRAY("Item", "item")
//! runtextmacro NEW_ARRAY("Unit", "unit")
//! runtextmacro NEW_ARRAY("Ability", "ability")
//! runtextmacro NEW_ARRAY("Timer", "timer")
//! runtextmacro NEW_ARRAY("Trigger", "trigger")
//! runtextmacro NEW_ARRAY("TriggerCondition", "triggercondition")
//! runtextmacro NEW_ARRAY("TriggerAction", "triggeraction")
//! runtextmacro NEW_ARRAY("TriggerEvent", "event")
//! runtextmacro NEW_ARRAY("Force", "force")
//! runtextmacro NEW_ARRAY("Group", "group")
//! runtextmacro NEW_ARRAY("Location", "location")
//! runtextmacro NEW_ARRAY("Rect", "rect")
//! runtextmacro NEW_ARRAY("BooleanExpr", "boolexpr")
//! runtextmacro NEW_ARRAY("Sound", "sound")
//! runtextmacro NEW_ARRAY("Effect", "effect")
//! runtextmacro NEW_ARRAY("UnitPool", "unitpool")
//! runtextmacro NEW_ARRAY("ItemPool", "itempool")
//! runtextmacro NEW_ARRAY("Quest", "quest")
//! runtextmacro NEW_ARRAY("QuestItem", "questitem")
//! runtextmacro NEW_ARRAY("DefeatCondition", "defeatcondition")
//! runtextmacro NEW_ARRAY("TimerDialog", "timerdialog")
//! runtextmacro NEW_ARRAY("Leaderboard", "leaderboard")
//! runtextmacro NEW_ARRAY("Multiboard", "multiboard")
//! runtextmacro NEW_ARRAY("MultiboardItem", "multiboarditem")
//! runtextmacro NEW_ARRAY("Trackable", "trackable")
//! runtextmacro NEW_ARRAY("Dialog", "dialog")
//! runtextmacro NEW_ARRAY("Button", "button")
//! runtextmacro NEW_ARRAY("TextTag", "texttag")
//! runtextmacro NEW_ARRAY("Lightning", "lightning")
//! runtextmacro NEW_ARRAY("Image", "image")
//! runtextmacro NEW_ARRAY("Ubersplat", "ubersplat")
//! runtextmacro NEW_ARRAY("Region", "region")
//! runtextmacro NEW_ARRAY("FogState", "fogstate")
//! runtextmacro NEW_ARRAY("FogModifier", "fogmodifier")
//! runtextmacro NEW_ARRAY("Hashtable", "hashtable")
struct Table extends array
// Implement modules for intuitive syntax (tb.handle; tb.unit; etc.)
implement realm
implement booleanm
implement stringm
implement playerm
implement widgetm
implement destructablem
implement itemm
implement unitm
implement abilitym
implement timerm
implement triggerm
implement triggerconditionm
implement triggeractionm
implement eventm
implement forcem
implement groupm
implement locationm
implement rectm
implement boolexprm
implement soundm
implement effectm
implement unitpoolm
implement itempoolm
implement questm
implement questitemm
implement defeatconditionm
implement timerdialogm
implement leaderboardm
implement multiboardm
implement multiboarditemm
implement trackablem
implement dialogm
implement buttonm
implement texttagm
implement lightningm
implement imagem
implement ubersplatm
implement regionm
implement fogstatem
implement fogmodifierm
implement hashtablem
method operator handle takes nothing returns handles
return this
endmethod
method operator agent takes nothing returns agents
return this
endmethod
//set this = tb[GetSpellAbilityId()]
method operator [] takes integer key returns Table
return LoadInteger(ht, this, key)
endmethod
//set tb[389034] = 8192
method operator []= takes integer key, Table tb returns nothing
call SaveInteger(ht, this, key, tb)
endmethod
//set b = tb.has(2493223)
method has takes integer key returns boolean
return HaveSavedInteger(ht, this, key)
endmethod
//call tb.remove(294080)
method remove takes integer key returns nothing
call RemoveSavedInteger(ht, this, key)
endmethod
//Remove all data from a Table instance
method flush takes nothing returns nothing
call FlushChildHashtable(ht, this)
endmethod
//local Table tb = Table.create()
static method create takes nothing returns Table
local Table this = dex.list[0]
if this == 0 then
set this = more + 1
set more = this
else
set dex.list[0] = dex.list[this]
call dex.list.remove(this) //Clear hashed memory
endif
debug set dex.list[this] = -1
return this
endmethod
// Removes all data from a Table instance and recycles its index.
//
// call tb.destroy()
//
method destroy takes nothing returns nothing
debug if dex.list[this] != -1 then
debug call BJDebugMsg("Table Error: Tried to double-free instance: " + I2S(this))
debug return
debug endif
call this.flush()
set dex.list[this] = dex.list[0]
set dex.list[0] = this
endmethod
//! runtextmacro optional TABLE_BC_METHODS()
endstruct
//! runtextmacro optional TABLE_BC_STRUCTS()
struct TableArray extends array
//Returns a new TableArray to do your bidding. Simply use:
//
// local TableArray ta = TableArray[array_size]
//
static method operator [] takes integer array_size returns TableArray
local Table tb = dex.size[array_size] //Get the unique recycle list for this array size
local TableArray this = tb[0] //The last-destroyed TableArray that had this array size
debug if array_size <= 0 then
debug call BJDebugMsg("TypeError: Invalid specified TableArray size: " + I2S(array_size))
debug return 0
debug endif
if this == 0 then
set this = less - array_size
set less = this
else
set tb[0] = tb[this] //Set the last destroyed to the last-last destroyed
call tb.remove(this) //Clear hashed memory
endif
set dex.size[this] = array_size //This remembers the array size
return this
endmethod
//Returns the size of the TableArray
method operator size takes nothing returns integer
return dex.size[this]
endmethod
//This magic method enables two-dimensional[array][syntax] for Tables,
//similar to the two-dimensional utility provided by hashtables them-
//selves.
//
//ta[integer a].unit[integer b] = unit u
//ta[integer a][integer c] = integer d
//
//Inline-friendly when not running in debug mode
//
method operator [] takes integer key returns Table
static if DEBUG_MODE then
local integer i = this.size
if i == 0 then
call BJDebugMsg("IndexError: Tried to get key from invalid TableArray instance: " + I2S(this))
return 0
elseif key < 0 or key >= i then
call BJDebugMsg("IndexError: Tried to get key [" + I2S(key) + "] from outside TableArray bounds: " + I2S(i))
return 0
endif
endif
return this + key
endmethod
//Destroys a TableArray without flushing it; I assume you call .flush()
//if you want it flushed too. This is a public method so that you don't
//have to loop through all TableArray indices to flush them if you don't
//need to (ie. if you were flushing all child-keys as you used them).
//
method destroy takes nothing returns nothing
local Table tb = dex.size[this.size]
debug if this.size == 0 then
debug call BJDebugMsg("TypeError: Tried to destroy an invalid TableArray: " + I2S(this))
debug return
debug endif
if tb == 0 then
//Create a Table to index recycled instances with their array size
set tb = Table.create()
set dex.size[this.size] = tb
endif
call dex.size.remove(this) //Clear the array size from hash memory
set tb[this] = tb[0]
set tb[0] = this
endmethod
private static Table tempTable
private static integer tempEnd
//Avoids hitting the op limit
private static method clean takes nothing returns nothing
local Table tb = .tempTable
local integer end = tb + 0x1000
if end < .tempEnd then
set .tempTable = end
call ForForce(bj_FORCE_PLAYER[0], function thistype.clean)
else
set end = .tempEnd
endif
loop
call tb.flush()
set tb = tb + 1
exitwhen tb == end
endloop
endmethod
//Flushes the TableArray and also destroys it. Doesn't get any more
//similar to the FlushParentHashtable native than this.
//
method flush takes nothing returns nothing
debug if this.size == 0 then
debug call BJDebugMsg("TypeError: Tried to flush an invalid TableArray instance: " + I2S(this))
debug return
debug endif
set .tempTable = this
set .tempEnd = this + this.size
call ForForce(bj_FORCE_PLAYER[0], function thistype.clean)
call this.destroy()
endmethod
endstruct
endlibrary
//TESH.scrollpos=0
//TESH.alwaysfold=0
library AVL /* v1.1.0.6
*************************************************************************************
*
* An AVL Tree where all nodes are connected by an AVL tree, a linked list, and
* are referenced by a hashtable.
*
*************************************************************************************
*
* */uses/*
*
* */ Table /* hiveworkshop.com/forums/jass-functions-413/snippet-new-table-188084/
*
************************************************************************************
*
* module AVLTree
*
* Interface:
* method lessThan takes thistype value returns boolean
* method greaterThan takes thistype value returns boolean
*
* readonly thistype tree
* - Tree pointer. Accessible from any node on the tree.
* readonly thistype root
* - Root of two children (if root is 0, it's the tree's root)
* readonly thistype left
* readonly thistype right
* readonly thistype down (tree pointer only)
* - The tree has only 1 child, the root
*
* readonly thistype next
* readonly thistype prev
* readonly boolean head
*
* readonly thistype value
* - Value stored in node
*
* static method create takes nothing returns thistype
* method destroy takes nothing returns nothing
*
* method search takes thistype value returns thistype
* - Returns the node containing the value
* - If the value didn't exist, it will return 0
* method searchClose takes thistype value, boolean low returns thistype
* - Searches for the best match to the value.
* -
* - Low = True
* - Search for the closest value <= to the target value
* -
* - Low = False
* - Search for the closest value >= to the target value
*
* method has takes thistype value returns boolean
* - Returns true if a node contains the value
*
* method add takes thistype value returns thistype
* - Returns new node containing added value. If the value
* - was already in the tree, it returns the node that already
* - contained that value.
* method delete takes nothing returns nothing
* - Deletes node
*
* -> Delete the value 15 from the tree if it exists
* -> call search(15).delete()
*
* method clear takes nothing returns thistype
* - Clears the tree of all nodes
* - Returns tree pointer (just in case some node in the tree was passed in rather than the tree)
*
************************************************************************************/
module AVL
private static Table array table //for O(1) searches on specific values
private static thistype c=0 //instance count
private static thistype array b //root
private static thistype array l //left
private static thistype array r //right
private static integer array h //height
private static thistype array p //parent
private static thistype array v //value
private static integer array nn //next node
private static integer array pn //prev node
private static integer array ro //root
method operator tree takes nothing returns thistype
return ro[this]
endmethod
method operator root takes nothing returns thistype
return p[this]
endmethod
method operator down takes nothing returns thistype
return b[this]
endmethod
method operator left takes nothing returns thistype
return l[this]
endmethod
method operator right takes nothing returns thistype
return r[this]
endmethod
method operator value takes nothing returns thistype
return v[this]
endmethod
method operator next takes nothing returns thistype
return nn[this]
endmethod
method operator prev takes nothing returns thistype
return pn[this]
endmethod
method operator head takes nothing returns boolean
return 0==p[this]
endmethod
private method getHeight takes nothing returns integer
//return the bigger leaf height
if (h[l[this]]>h[r[this]]) then
return h[l[this]]+1
endif
return h[r[this]]+1
endmethod
private method updateParent takes integer n returns nothing
//only update the parent of a target leaf if that leaf isn't the original leaf
if (n!=this) then
//update the parent point to
//first leaf
if (0==p[p[this]]) then
set b[p[this]]=n
//left
elseif (l[p[this]]==this) then
set l[p[this]]=n
//right
else
set r[p[this]]=n
endif
//update the leaf point back
//if the leaf isn't null, update the leaf's parent
if (0!=n) then
set p[n]=p[this]
endif
endif
endmethod
private method finishRotate takes thistype n returns nothing
//this code is identical in rotateLeft and rotateRight, so it has
//been abstracted to a method
call updateParent(n)
set p[this]=n
set h[this]=getHeight()
set h[n]=n.getHeight()
endmethod
private method rotateLeft takes nothing returns thistype
local thistype n=r[this]
set r[this]=l[n]
set p[l[n]]=this
set l[n]=this
call finishRotate(n)
return n
endmethod
private method rotateRight takes nothing returns thistype
local thistype n=l[this]
set l[this]=r[n]
set p[r[n]]=this
set r[n]=this
call finishRotate(n)
return n
endmethod
//return the difference between the left and right leaf heights
private method getBalanceFactor takes nothing returns integer
return h[l[this]]-h[r[this]]
endmethod
private static method allocate takes nothing returns thistype
local integer n
if (0==nn[0]) then
set n=c+1
set c=n
else
set n=nn[0] //notice that the recycler uses the next pointer
//the reason it is used is for fast clear/destroy and to save
//a variable
set nn[0]=nn[n]
endif
set l[n]=0 //left leaf
set r[n]=0 //right leaf
set b[n]=0 //down leaf (first node of tree)
set h[n]=1 //height (a node will always have at least a height of 1 for itself)
return n
endmethod
static method create takes nothing returns thistype
local integer n=allocate()
set p[n]=0 //the parent of the tree node is 0
//initialize tree next and prev
set nn[n]=n
set pn[n]=n
//tree value table for O(1) searches on specific values
set table[n]=Table.create()
//tree root is itself (allows one to pass any node from the tree into the methods)
set ro[n]=n
return n
endmethod
//balance from the current node up to the root O(log n)
//balancing is rotations wherever rotations need to be done
private method balance takes nothing returns nothing
local integer f
loop
exitwhen 0==p[this]
set h[this]=getHeight()
set f=getBalanceFactor()
if (2==f) then
if (-1==l[this].getBalanceFactor()) then
call l[this].rotateLeft()
endif
set this=rotateRight()
return
elseif (-2==f) then
if (1==r[this].getBalanceFactor()) then
call r[this].rotateRight()
endif
set this=rotateLeft()
return
endif
set this=p[this]
endloop
endmethod
//goes to the very bottom of a node (for deletion)
private method getBottom takes nothing returns thistype
if (0!=r[this]) then
if (0!=l[this]) then
set this=r[this]
loop
exitwhen 0==l[this]
set this=l[this]
endloop
return this
else
return r[this]
endif
elseif (0!=l[this]) then
return l[this]
endif
return this
endmethod
method search takes thistype val returns thistype
return table[ro[this]][val]
endmethod
method has takes thistype val returns boolean
return table[ro[this]].has(val)
endmethod
method searchClose takes thistype val, boolean low returns thistype
local thistype n
//retrieve tree
set this=ro[this]
//if tree is empty, return 0
if (0==b[this]) then
return 0
endif
//check to see if the node exists in the tree and return it if it does
set n=table[this][val]
if (0!=n) then
return n
endif
//perform a standard tree search for the value to the bottom of the tree
//will always be at most 1 off from the best match
set this=b[this]
loop
if (val.lessThan(v[this])) then
exitwhen 0==l[this]
set this=l[this]
else
exitwhen 0==r[this]
set this=r[this]
endif
endloop
//look at the found value's neighbors on the linked list
if (low) then
//shift down if greater than
if (v[this].greaterThan(val)) then
set this=prev
endif
//return 0 if node wasn't found
if (0==p[this] or v[this].greaterThan(val)) then
return 0
endif
else
//shift up if less than
if (v[this].lessThan(val)) then
set this=next
endif
//return 0 if node wasn't found
if (0==p[this] or v[this].lessThan(val)) then
return 0
endif
endif
return this
endmethod
method add takes thistype val returns thistype
local thistype n
//check if the tree already has the value in it
set this=ro[this]
set n=table[this][val]
//if the tree doesn't have the value in it, add the value
if (0==n) then
set n=this
set this=allocate()
set ro[this]=n //store tree into leaf
set table[n][val]=this //store leaf into value table
set v[this]=val //store value into leaf
//if the tree is empty
if (0==b[n]) then
set b[n]=this //place as first node
set p[this]=n //parent of first node is tree
//add to list
set nn[this]=n
set pn[this]=n
set nn[n]=this
set pn[n]=this
else
//go to the first node in the tree
set n=b[n]
//go to the bottom of the tree with search algorithm
loop
if (val.lessThan(v[n])) then
exitwhen 0==l[n]
set n=l[n]
else
exitwhen 0==r[n]
set n=r[n]
endif
endloop
//add leaf to tree
set p[this]=n
if (val.lessThan(v[n])) then
set l[n]=this
else
set r[n]=this
endif
//update the height of the parent
set h[n]=n.getHeight()
//balance from the parent upwards
call p[n].balance()
//add leaf to list
if (v[n].greaterThan(v[this])) then
set n=pn[n]
endif
set nn[this]=nn[n]
set pn[this]=n
set pn[nn[n]]=this
set nn[n]=this
endif
return this
endif
return n
endmethod
method delete takes nothing returns nothing
local thistype n
local thistype y
//if the leaf to be deleted isn't 0 and the leaf isn't the tree
if (0 != this and 0 != p[this]) then
//remove the leaf from the value table
call table[ro[this]].remove(v[this])
set n=getBottom() //retrieve the bottom leaf
set y=p[n] //store the parent here for balancing later
//move the found leaf into the deleted leaf's position
call n.updateParent(0)
call updateParent(n)
if (this!=n) then
set l[n]=l[this]
set p[l[n]]=n
set r[n]=r[this]
set p[r[n]]=n
set p[n]=p[this]
set h[n]=h[this]
endif
//balance from the found leaf's old parent upwards
call y.balance()
//remove deleted leaf from list
set nn[pn[this]]=nn[this]
set pn[nn[this]]=pn[this]
set nn[this]=nn[0]
set nn[0]=this
endif
endmethod
method clear takes nothing returns thistype
//quick clear
set this=ro[this]
if (nn[this] != this) then
set nn[pn[this]]=nn[0]
set nn[0]=nn[this]
set nn[this]=this
set pn[this]=this
set b[this] = 0
call table[this].flush()
endif
return this
endmethod
method destroy takes nothing returns nothing
//quick destroy
set this=ro[this]
set nn[pn[this]]=nn[0]
set nn[0]=this
call table[this].destroy()
endmethod
endmodule
endlibrary
//TESH.scrollpos=63
//TESH.alwaysfold=0
library PriorityEvent /* v2.0.0.1
*************************************************************************************
*
* Creates events that fire given a priority. A higher priority means that those
* events will fire first. A priority of 0 means that those events will fire last.
*
* Priority events can only be created at map init
* Code can only be registered to priority events at map init
*
*************************************************************************************
*
* */uses/*
*
* */ AVL /* hiveworkshop.com/forums/jass-resources-412/snippet-avl-tree-203168/
*
************************************************************************************
*
* struct PriorityEvent extends array
*
* static method create takes nothing returns thistype
* method register takes boolexpr func, integer priority returns nothing
* method fire takes nothing returns nothing
*
************************************************************************************/
private struct PriorityEventTree extends array
method lessThan takes thistype value returns boolean
return integer(this) < integer(value)
endmethod
method greaterThan takes thistype value returns boolean
return integer(this) > integer(value)
endmethod
implement AVL
endstruct
private module PriorityEventMod
private static integer instanceCount = 0
/*
* A queue of code registered with the same priority
*/
private thistype next_p
private thistype last_p
private thistype first_p
/*
* The priorities are stored in the tree list
*/
/*
* Iterate from 0 to count to go over all created events
*/
private static PriorityEventTree count = 0
private static PriorityEventTree array tree
/*
* This is a temporary trigger to store all code of the same priority
* Once the game has started, all code will be merged on to one trigger
*/
private trigger event
/*
* Need to store the code in order to merge all it all on to one trigger
*/
private boolexpr code
/*
* All code is merged on this
*/
private trigger allEvent
/*
* Has the code all been merged?
*/
private static boolean merged = false
static method create takes nothing returns thistype
local thistype this
debug if (merged) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Priority Event Error: Can Only Create Events On Game Init")
debug set this = 1/0
debug endif
/*
* Allocate new event
*/
set this = PriorityEventTree.create()
/*
* Add to array for merging later
*/
set tree[count] = this
set count = count + 1
/*
* Create the merging trigger
*/
set thistype(count).allEvent = CreateTrigger()
return count
endmethod
method register takes boolexpr func, integer priority returns nothing
local thistype node
debug if (merged) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Priority Event Error: Can Only Register Code On Game Init")
debug set node = 1/0
debug endif
/*
* Allocate a new node to store the function
*/
set node = instanceCount + 1
set instanceCount = node
set node.code = func
/*
* Retrieve the priority. This will act as the pointer to
* the queue that the node will be added to.
*/
set this = PriorityEventTree(this).add(priority)
if (null == event) then
/*
* If the queue hasn't been created yet, create it
*/
set event = CreateTrigger()
set first_p = node
set last_p = node
else
/*
* Add node to queue
*/
set last_p.next_p = node
set last_p = node
endif
call TriggerAddCondition(event, func)
endmethod
method fire takes nothing returns nothing
if (merged) then
/*
* If the code has all been merged (game started), evaluate the trigger that contains all code
*/
call TriggerEvaluate(allEvent)
else
/*
* If the code hasn't been merged yet, evaluate all of the triggers along the priority queue
*/
loop
set this = PriorityEventTree(this).prev
exitwhen PriorityEventTree(this).head
call TriggerEvaluate(event)
endloop
endif
endmethod
/*
* This is called when the game starts. It merges all of the registered code
* for each event on to single triggers to improve performance
*/
private static method merge takes nothing returns nothing
local thistype this
local integer current = count
local PriorityEventTree priority
local thistype node
set merged = true
/*
* Iterate over all events
*/
loop
exitwhen 0 == current
set current = current - 1
set this = tree[current]
/*
* Iterate over all priorities
*/
set priority = this
loop
set priority = priority.prev
exitwhen priority.head
/*
* Clean up temporary priority event trigger
*/
call TriggerClearConditions(thistype(priority).event)
call DestroyTrigger(thistype(priority).event)
set thistype(priority).event = null
/*
* Iterate over all registered code on the priority trigger
*/
set node = thistype(priority).first_p
loop
exitwhen 0 == node
/*
* Add to main trigger
*/
call TriggerAddCondition(allEvent, node.code)
set node = node.next_p
endloop
endloop
endloop
call DestroyTimer(GetExpiredTimer())
endmethod
private static method onInit takes nothing returns nothing
call TimerStart(CreateTimer(), 0, false, function thistype.merge)
endmethod
endmodule
struct PriorityEvent extends array
implement PriorityEventMod
endstruct
endlibrary
//TESH.scrollpos=39
//TESH.alwaysfold=0
library AbilityPreload
//===========================================================================
// Information:
//==============
//
// Preloading removes the noticeable delay the first time an ability
// is loaded in a game. If an ability was not already on a pre-placed unit
// or a unit that was created during initialization, preloading is needed
// to prevent a delay.
//
//===========================================================================
// AbilityPreload API:
//=====================
//
// AbilityPreload(abilityid) :
// Call this before any time has elapsed to preload a specific
// ability. If debug mode is enabled, you will see an error message
// if you call this after initialization, or if you try to preload
// an ability that does not exist. Will inline to a UnitAddAbility
// call if debug mode is disabled.
//
// AbilityRangePreload(start, end) :
// Same as AbilityPreload, but preloads a range of abilities.
// It will iterates between the two rawcode values and preload
// every ability along the way. It will not show an error message
// for non-existent abilities.
//
//===========================================================================
// Configuration:
//================
globals
private constant integer PreloadUnitRawcode = 'ncop'
//This is the rawcode for "Sammy!". It is never used and has no model,
//which makes an ideal preloading unit. Change it if you want to.
endglobals
//===========================================================================
globals
private unit PreloadUnit
endglobals
function AbilityPreload takes integer abilityid returns nothing
static if DEBUG_MODE then
if GetUnitTypeId(PreloadUnit) == 0 then
call BJDebugMsg("AbilityPreload error: Can't preload an ability after initialization")
return
endif
endif
call UnitAddAbility(PreloadUnit, abilityid)
static if DEBUG_MODE then
if GetUnitAbilityLevel(PreloadUnit, abilityid) == 0 then
call BJDebugMsg("AbilityPreload error: Attempted to preload a non-existent ability")
endif
endif
endfunction
function AbilityRangePreload takes integer start, integer end returns nothing
local integer i = 1
static if DEBUG_MODE then
if GetUnitTypeId(PreloadUnit) == 0 then
call BJDebugMsg("AbilityPreload error: Can't preload an ability after initialization")
return
endif
endif
if start > end then
set i = -1
endif
loop
exitwhen start > end
call UnitAddAbility(PreloadUnit, start)
set start = start + i
endloop
endfunction
//===========================================================================
private struct Init extends array
private static method onInit takes nothing returns nothing
set PreloadUnit = CreateUnit(Player(15), PreloadUnitRawcode, 0., 0., 0.)
call UnitApplyTimedLife(PreloadUnit, 0, .001)
call ShowUnit(PreloadUnit, false)
call UnitAddAbility(PreloadUnit, 'Aloc')
endmethod
endstruct
endlibrary
//TESH.scrollpos=182
//TESH.alwaysfold=0
globals
constant integer MODE_UNKNOWN = -1
constant integer MODE_TEST = 0
constant integer MODE_NORMAL = 1
constant integer MODE_ALLPICK = 2
constant integer MODE_ALLRANDOM = 3
constant integer MODE_ALLSAME = 4
constant integer MAX_GAME_LEVEL = 15
constant integer GAME_PHASE_INITIALIZE = 0
constant integer GAME_PHASE_READY = 1
constant integer GAME_PHASE_START = 2
constant integer GAME_PHASE_END = 3
integer GameMode
integer GameLevel
integer GamePhase
integer GameTime
hashtable Info_Ht
group spiritBottomLeft
group spiritTopLeft
group spiritTopRight
group spiritBottomRight
constant integer KILL_NUMBER_KEY = 0
constant integer DIE_NUMBER_KEY = 1
constant integer MULTIBOARD_ROW_KEY = 2
constant integer STREAK_NUMBER_KEY = 3
constant integer ASSIST_NUMBER_KEY = 4
constant integer REVENGE_UNIT_KEY = 5
constant real ETHEREAL_BONUS = 1.5
unit TIDE_HUNTER
endglobals
scope MapInitialization initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant real MIN_TIME = 0.0 //Minimum game time
private constant real MAX_TIME = 24.0 //Maximum game time
private constant real SHOP_TEXT_SIZE = 8.0 //Text size
private constant real SHOP_TEXT_HEIGHT = 50.0 //Text height
private constant string SHOP_NORTH_TEXT = "Selling attack speed, move speed, agility, and armor items."
private constant string SHOP_EAST_TEXT = "Selling life, life regeneration, stats and strength items."
private constant string SHOP_SOUTH_TEXT = "Selling mana, mana regeneration, magic damage and intelligence items."
private constant string SHOP_WEST_TEXT = "Selling attack damage items."
private constant string SHOP_POWER_PILLAR_TEXT = "Selling potions, ward and gem.\n|cff00ff00Follow color to upgrade items|r"
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local integer i = 0
local player p = null
local integer display = 0
if(GamePhase == GAME_PHASE_INITIALIZE or GamePhase == GAME_PHASE_READY) then
set GameTime = GameTime - 1
elseif(GamePhase == GAME_PHASE_START) then
set GameTime = GameTime + 1
endif
set display = ModuloInteger(GameTime, 60)
loop
exitwhen(i >= 8)
set p = Player(i)
call SetPlayerState(p, PLAYER_STATE_RESOURCE_LUMBER, display)
set i = i + 1
endloop
set p = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger PhaseGameTrg = CreateTrigger()
local real randomTime = GetRandomReal(MIN_TIME, MAX_TIME)
local real x = GetRectCenterX(gg_rct_Hero_Rune)
local real y = GetRectCenterY(gg_rct_Hero_Rune)
local integer i = 0
local player p = null
local texttag tt = null
local real shift = 0.0
call TriggerRegisterTimerEventPeriodic(PhaseGameTrg, 1.0)
call TriggerAddAction(PhaseGameTrg, function Actions)
set GameMode = MODE_UNKNOWN
set GameLevel = 1
set GamePhase = GAME_PHASE_INITIALIZE
set GameTime = 14
set Info_Ht = InitHashtable()
set TIDE_HUNTER = gg_unit_npng_0058
set spiritBottomLeft = CreateGroup()
call GroupAddUnit(spiritBottomLeft, gg_unit_nshe_0026)
call GroupAddUnit(spiritBottomLeft, gg_unit_nshe_0130)
call GroupAddUnit(spiritBottomLeft, gg_unit_nshe_0128)
call GroupAddUnit(spiritBottomLeft, gg_unit_nshe_0129)
set spiritTopLeft = CreateGroup()
call GroupAddUnit(spiritTopLeft, gg_unit_nshe_0132)
call GroupAddUnit(spiritTopLeft, gg_unit_nshe_0131)
call GroupAddUnit(spiritTopLeft, gg_unit_nshe_0029)
call GroupAddUnit(spiritTopLeft, gg_unit_nshe_0133)
set spiritTopRight = CreateGroup()
call GroupAddUnit(spiritTopRight, gg_unit_nshe_0134)
call GroupAddUnit(spiritTopRight, gg_unit_nshe_0135)
call GroupAddUnit(spiritTopRight, gg_unit_nshe_0027)
call GroupAddUnit(spiritTopRight, gg_unit_nshe_0136)
set spiritBottomRight = CreateGroup()
call GroupAddUnit(spiritBottomRight, gg_unit_nshe_0028)
call GroupAddUnit(spiritBottomRight, gg_unit_nshe_0127)
call GroupAddUnit(spiritBottomRight, gg_unit_nshe_0126)
call GroupAddUnit(spiritBottomRight, gg_unit_nshe_0125)
set i = 0
loop
exitwhen(i >= bj_MAX_PLAYERS)
set p = Player(i)
if(GetLocalPlayer() == p) then
call PanCameraToTimed(x, y, 0.0)
endif
call CreateFogModifierRect(p, FOG_OF_WAR_VISIBLE, gg_rct_Temple_Main_Center, true, false)
call CreateFogModifierRect(p, FOG_OF_WAR_VISIBLE, gg_rct_Warlock, true, false)
set i = i + 1
endloop
call SetFloatGameState(GAME_STATE_TIME_OF_DAY, 6.0)
set tt = CreateTextTag()
set shift = RMinBJ(StringLength(SHOP_NORTH_TEXT) * 5.5, 200.0)
call SetTextTagText(tt, SHOP_NORTH_TEXT, SHOP_TEXT_SIZE * 0.023 / 10)
call SetTextTagColor(tt, 255, 255, 255, 255)
call SetTextTagPos(tt, GetRectCenterX(gg_rct_Luminous_Shop_North_Text) - shift, GetRectCenterY(gg_rct_Luminous_Shop_North_Text), SHOP_TEXT_HEIGHT)
call SetTextTagPermanent(tt, true)
set tt = CreateTextTag()
set shift = RMinBJ(StringLength(SHOP_EAST_TEXT) * 5.5, 200.0)
call SetTextTagText(tt, SHOP_EAST_TEXT, SHOP_TEXT_SIZE * 0.023 / 10)
call SetTextTagColor(tt, 255, 255, 255, 255)
call SetTextTagPos(tt, GetRectCenterX(gg_rct_Luminous_Shop_East_Text) - shift, GetRectCenterY(gg_rct_Luminous_Shop_East_Text), SHOP_TEXT_HEIGHT)
call SetTextTagPermanent(tt, true)
set tt = CreateTextTag()
set shift = RMinBJ(StringLength(SHOP_SOUTH_TEXT) * 5.5, 200.0)
call SetTextTagText(tt, SHOP_SOUTH_TEXT, SHOP_TEXT_SIZE * 0.023 / 10)
call SetTextTagColor(tt, 255, 255, 255, 255)
call SetTextTagPos(tt, GetRectCenterX(gg_rct_Luminous_Shop_South_Text) - shift, GetRectCenterY(gg_rct_Luminous_Shop_South_Text), SHOP_TEXT_HEIGHT)
call SetTextTagPermanent(tt, true)
set tt = CreateTextTag()
set shift = RMinBJ(StringLength(SHOP_WEST_TEXT) * 5.5, 200.0)
call SetTextTagText(tt, SHOP_WEST_TEXT, SHOP_TEXT_SIZE * 0.023 / 10)
call SetTextTagColor(tt, 255, 255, 255, 255)
call SetTextTagPos(tt, GetRectCenterX(gg_rct_Luminous_Shop_West_Text) - shift, GetRectCenterY(gg_rct_Luminous_Shop_West_Text), SHOP_TEXT_HEIGHT)
call SetTextTagPermanent(tt, true)
set tt = CreateTextTag()
set shift = RMinBJ(StringLength(SHOP_POWER_PILLAR_TEXT) * 5.5, 200.0)
call SetTextTagText(tt, SHOP_POWER_PILLAR_TEXT, SHOP_TEXT_SIZE * 0.023 / 10)
call SetTextTagColor(tt, 255, 255, 255, 255)
call SetTextTagPos(tt, GetRectCenterX(gg_rct_Luminous_Shop_Center_Text) - shift, GetRectCenterY(gg_rct_Luminous_Shop_Center_Text), SHOP_TEXT_HEIGHT)
call SetTextTagPermanent(tt, true)
set tt = CreateTextTag()
set shift = RMinBJ(StringLength(SHOP_NORTH_TEXT) * 5.5, 200.0)
call SetTextTagText(tt, SHOP_NORTH_TEXT, SHOP_TEXT_SIZE * 0.023 / 10)
call SetTextTagColor(tt, 255, 255, 255, 255)
call SetTextTagPos(tt, GetRectCenterX(gg_rct_Overcast_Shop_North_Text) - shift, GetRectCenterY(gg_rct_Overcast_Shop_North_Text), SHOP_TEXT_HEIGHT)
call SetTextTagPermanent(tt, true)
set tt = CreateTextTag()
set shift = RMinBJ(StringLength(SHOP_EAST_TEXT) * 5.5, 200.0)
call SetTextTagText(tt, SHOP_EAST_TEXT, SHOP_TEXT_SIZE * 0.023 / 10)
call SetTextTagColor(tt, 255, 255, 255, 255)
call SetTextTagPos(tt, GetRectCenterX(gg_rct_Overcast_Shop_East_Text) - shift, GetRectCenterY(gg_rct_Overcast_Shop_East_Text), SHOP_TEXT_HEIGHT)
call SetTextTagPermanent(tt, true)
set tt = CreateTextTag()
set shift = RMinBJ(StringLength(SHOP_SOUTH_TEXT) * 5.5, 200.0)
call SetTextTagText(tt, SHOP_SOUTH_TEXT, SHOP_TEXT_SIZE * 0.023 / 10)
call SetTextTagColor(tt, 255, 255, 255, 255)
call SetTextTagPos(tt, GetRectCenterX(gg_rct_Overcast_Shop_South_Text) - shift, GetRectCenterY(gg_rct_Overcast_Shop_South_Text), SHOP_TEXT_HEIGHT)
call SetTextTagPermanent(tt, true)
set tt = CreateTextTag()
set shift = RMinBJ(StringLength(SHOP_WEST_TEXT) * 5.5, 200.0)
call SetTextTagText(tt, SHOP_WEST_TEXT, SHOP_TEXT_SIZE * 0.023 / 10)
call SetTextTagColor(tt, 255, 255, 255, 255)
call SetTextTagPos(tt, GetRectCenterX(gg_rct_Overcast_Shop_West_Text) - shift, GetRectCenterY(gg_rct_Overcast_Shop_West_Text), SHOP_TEXT_HEIGHT)
call SetTextTagPermanent(tt, true)
set tt = CreateTextTag()
set shift = RMinBJ(StringLength(SHOP_POWER_PILLAR_TEXT) * 5.5, 200.0)
call SetTextTagText(tt, SHOP_POWER_PILLAR_TEXT, SHOP_TEXT_SIZE * 0.023 / 10)
call SetTextTagColor(tt, 255, 255, 255, 255)
call SetTextTagPos(tt, GetRectCenterX(gg_rct_Overcast_Shop_Center_Text) - shift, GetRectCenterY(gg_rct_Overcast_Shop_Center_Text), SHOP_TEXT_HEIGHT)
call SetTextTagPermanent(tt, true)
set p = null
set tt = null
endfunction
//----------------------------------------------------------------
function CopyGroup takes group g returns group
set bj_groupAddGroupDest = CreateGroup()
call ForGroup(g, function GroupAddGroupEnum)
return bj_groupAddGroupDest
endfunction
endscope
//TESH.scrollpos=27
//TESH.alwaysfold=0
scope Quest initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
//Main objectives
private constant string MAIN_OBJ_TITLE = "Main Objective"
private constant string MAIN_OBJ_DESC = "Your team objective is to get the |cffffff00Omnipower|r by killing a |cff00ff00Relic Revenant|r which is located inside the temple (|cff00ffffcenter|r of the map).\n" + /*
*/"However, the |cff00ff00Relic Revenant|r has |cffffff0015 lives|r. When it dies, the game level increases which makes |cff00ff00skeletons and towers|r |cffffff00stronger|r.\n" + /*
*/"As a |cff00ff00Conqueror|r who kills the |cff00ff00Relic Revenant|r, you must |cff00ffffsurvive|r inside the temple for a duration to achieve the |cff00ffffvictory|r.\n" + /*
*/"The duration starts at 120 seconds but decreases 30 seconds for the next countdown.\n" + /*
*/"At 15th level, if your hero, the |cff00ff00Conqueror|r |cff00ffffdies|r, |cff00ffffRelic Revenant|r will revive and the countdown is |cffffff00aborted|r.\n\n"
private constant string MAIN_OBJ_ICON = "ReplaceableTextures\\CommandButtons\\BTNDeepLordRevenant.blp"
//Credit
private constant string CREDIT_TITLE = "Main Credit"
private constant string CREDIT_DESC = "|cffffff00ftr (Testing and Suggestions), Ninie (Support and Donation), Minesky.X Kidal (Testing and Suggestions), Smileysme (Suggestions), Azreen (Donation), Zar (Donation)|r"
private constant string CREDIT_ICON = "ReplaceableTextures\\CommandButtons\\BTNDevotion.blp"
//Modes
private constant string MODE_TITLE = "Modes"
private constant string MODE_DESC = "|cff00ffffWait 15 seconds|r for |cff00ff00Normal|r mode.\n" + /*
*/"|cff00ffffType -ap|r for |cff00ff00All Pick|r mode.\n" + /*
*/"|cff00ffffType -ar|r for |cff00ff00All Random|r mode.\n" + /*
*/"|cff00ffffType -as|r for |cff00ff00All Same|r mode.\n" + /*
*/"|cff00ffffType -test|r for |cff00ff00Test|r mode.\n\n" + /*
*/"|cff00ffffNormal mode|r : only choose a hero of your force (Luminous or Overcast).\n" + /*
*/"|cff00ffffAll Pick mode|r : may choose any hero avaialable.\n" + /*
*/"|cff00ffffAll Random mode|r : random hero will be given to all players.\n" + /*
*/"|cff00ffffAll Same mode|r : all players receive the same hero picked by Player 1.\n" + /*
*/"|cff00ffffTest mode|r : similar pick as all pick. Type '-' to restore health and press 'ESC' to increase level.\n"
private constant string MODE_ICON = "ReplaceableTextures\\CommandButtons\\PASBTNEngineeringUpgrade.blp"
//Commands
private constant string COMMAND_TITLE = "Commands"
private constant string COMMAND_DESC = "|cff00ffff-clear|r : clear displaying text.\n" + /*
*/"|cff00ffff-ah|r : display players that can view all through maps.\n" + /*
*/"|cff00ffff-ma|r : display enemy heroes' name.\n" + /*
*/"|cff00ffff-ms|r : display your hero speed.\n" + /*
*/"|cff00ffff-zoom ####|r : change your viewing distance (min 500, max 3000).\n" + /*
*/"Game settings (including camera setting) is at your boat.\n"
private constant string COMMAND_ICON = "ReplaceableTextures\\CommandButtons\\BTNGnollCommandAura.blp"
//Tips
private constant string TIPS_TITLE = "Tips"
private constant string TIPS_DESC = "\n"
private constant string TIPS_ICON = "ReplaceableTextures\\CommandButtons\\BTNPenguin.blp"
//Contact
private constant string CONTACT_TITLE = "Contact and Version"
private constant string CONTACT_DESC = "You can email me at |[email protected]|r.\n" + /*
*/"Visit |cffffff00Hiveworkshop|r to get project description details.\n" + /*
*/"|cffff8000PayPal|r : |[email protected]|r" + /*
*/"Current version is |cffffff003.2l|r"
private constant string CONTACT_ICON = "ReplaceableTextures\\CommandButtons\\BTNSpy.blp"
//Weather
private constant string WEATHER_TITLE = "Weather"
private constant string WEATHER_DESC = "There are currently 4 type of weathers.\n" + /*
*/"|cff00ff00Sky clear|r : nothing is happening outside the temple.\n" + /*
*/"|cff00ff00Monsoon|r : thunder strikes heroes outside the temple.\n" + /*
*/"|cff00ff00Rain fall|r : trees grow outside the temple.\n" + /*
*/"|cff00ff00Tornado|r : tornado outside the temple slows units.\n"
private constant string WEATHER_ICON = "ReplaceableTextures\\CommandButtons\\BTNTranquility.blp"
//Phenomenon
private constant string PHENOMENON_TITLE = "Phenomenon"
private constant string PHENOMENON_DESC = "There are currently 4 type of phenomenons.\n" + /*
*/"|cff00ff00Void phenomenon|r : nothing is happening inside the temple.\n" + /*
*/"|cff00ff00Earthquake|r : causes temple to collapse that would damage the unit inside.\n" + /*
*/"|cff00ff00Blight|r : strengthen skeleton and Relic Revenant inside the temple.\n" + /*
*/"|cff00ff00Hindrance|r : creates wall that hinders unit from entering the temple and close crypts' gates.\n"
private constant string PHENOMENON_ICON = "ReplaceableTextures\\CommandButtons\\BTNWellSpring.blp"
//Crypt and Power Tower
private constant string CRYPT_TITLE = "Crypt and Power Tower"
private constant string CRYPT_DESC = "There are 4 Crypt guarded by its Power Tower.\n" + /*
*/"Killing the Power Tower will give you alliance with the Crypt and its skeletons.\n"
private constant string CRYPT_ICON = "ReplaceableTextures\\CommandButtons\\BTNHumanArcaneTower.blp"
//Power Runes
private constant string RUNE_TITLE = "Power Runes"
private constant string RUNE_DESC = "There are 5 types of Power Runes.\n" + /*
*/"When taken by your ally hero, the effect will spread globally.\n" + /*
*/"|cff00ff00Power of Abyss|r : makes heroes invisible.\n" + /*
*/"|cff00ff00Power of Velocity|r : makes heroes fast movement speed (cannot be slowed).\n" + /*
*/"|cff00ff00Power of Destruction|r : makes heroes attack twice of damage.\n" + /*
*/"|cff00ff00Power of Soul|r : restores heroes instantly.\n" + /*
*/"|cff00ff00Power of Omniforce|r : makes heroes invulnerable for 8 seconds.\n"
private constant string RUNE_ICON = "ReplaceableTextures\\CommandButtons\\BTNRune.blp"
//Wield of Rectify
private constant string WIELD_RECTIFY_TITLE = "Wield of Rectify"
private constant string WIELD_RECTIFY_DESC = "Wield of Rectify unlocks extra or special effect to abilities from having specific item.\n" + /*
*/"You can read the description from your boat.\n" + /*
*/"But you need to have a hero first.\n" + /*
*/"The effect is stacking when it is not mentioning (non-stacking).\n"
private constant string WIELD_RECTIFY_ICON = "ReplaceableTextures\\CommandButtons\\BTNBlood&GhostKey.blp"
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set bj_lastCreatedQuest = CreateQuest()
call QuestSetTitle(bj_lastCreatedQuest, MAIN_OBJ_TITLE)
call QuestSetDescription(bj_lastCreatedQuest, MAIN_OBJ_DESC)
call QuestSetIconPath(bj_lastCreatedQuest, MAIN_OBJ_ICON)
call QuestSetDiscovered(bj_lastCreatedQuest, true)
call QuestSetRequired(bj_lastCreatedQuest, true)
call QuestSetCompleted(bj_lastCreatedQuest, false)
set bj_lastCreatedQuest = CreateQuest()
call QuestSetTitle(bj_lastCreatedQuest, CREDIT_TITLE)
call QuestSetDescription(bj_lastCreatedQuest, CREDIT_DESC)
call QuestSetIconPath(bj_lastCreatedQuest, CREDIT_ICON)
call QuestSetDiscovered(bj_lastCreatedQuest, true)
call QuestSetRequired(bj_lastCreatedQuest, true)
call QuestSetCompleted(bj_lastCreatedQuest, false)
set bj_lastCreatedQuest = CreateQuest()
call QuestSetTitle(bj_lastCreatedQuest, MODE_TITLE)
call QuestSetDescription(bj_lastCreatedQuest, MODE_DESC)
call QuestSetIconPath(bj_lastCreatedQuest, MODE_ICON)
call QuestSetDiscovered(bj_lastCreatedQuest, true)
call QuestSetRequired(bj_lastCreatedQuest, true)
call QuestSetCompleted(bj_lastCreatedQuest, false)
set bj_lastCreatedQuest = CreateQuest()
call QuestSetTitle(bj_lastCreatedQuest, COMMAND_TITLE)
call QuestSetDescription(bj_lastCreatedQuest, COMMAND_DESC)
call QuestSetIconPath(bj_lastCreatedQuest, COMMAND_ICON)
call QuestSetDiscovered(bj_lastCreatedQuest, true)
call QuestSetRequired(bj_lastCreatedQuest, true)
call QuestSetCompleted(bj_lastCreatedQuest, false)
set bj_lastCreatedQuest = CreateQuest()
call QuestSetTitle(bj_lastCreatedQuest, TIPS_TITLE)
call QuestSetDescription(bj_lastCreatedQuest, TIPS_DESC)
call QuestSetIconPath(bj_lastCreatedQuest, TIPS_ICON)
call QuestSetDiscovered(bj_lastCreatedQuest, true)
call QuestSetRequired(bj_lastCreatedQuest, true)
call QuestSetCompleted(bj_lastCreatedQuest, false)
set bj_lastCreatedQuest = CreateQuest()
call QuestSetTitle(bj_lastCreatedQuest, CONTACT_TITLE)
call QuestSetDescription(bj_lastCreatedQuest, CONTACT_DESC)
call QuestSetIconPath(bj_lastCreatedQuest, CONTACT_ICON)
call QuestSetDiscovered(bj_lastCreatedQuest, true)
call QuestSetRequired(bj_lastCreatedQuest, true)
call QuestSetCompleted(bj_lastCreatedQuest, false)
set bj_lastCreatedQuest = CreateQuest()
call QuestSetTitle(bj_lastCreatedQuest, WEATHER_TITLE)
call QuestSetDescription(bj_lastCreatedQuest, WEATHER_DESC)
call QuestSetIconPath(bj_lastCreatedQuest, WEATHER_ICON)
call QuestSetDiscovered(bj_lastCreatedQuest, true)
call QuestSetRequired(bj_lastCreatedQuest, false)
call QuestSetCompleted(bj_lastCreatedQuest, false)
set bj_lastCreatedQuest = CreateQuest()
call QuestSetTitle(bj_lastCreatedQuest, PHENOMENON_TITLE)
call QuestSetDescription(bj_lastCreatedQuest, PHENOMENON_DESC)
call QuestSetIconPath(bj_lastCreatedQuest, PHENOMENON_ICON)
call QuestSetDiscovered(bj_lastCreatedQuest, true)
call QuestSetRequired(bj_lastCreatedQuest, false)
call QuestSetCompleted(bj_lastCreatedQuest, false)
set bj_lastCreatedQuest = CreateQuest()
call QuestSetTitle(bj_lastCreatedQuest, CRYPT_TITLE)
call QuestSetDescription(bj_lastCreatedQuest, CRYPT_DESC)
call QuestSetIconPath(bj_lastCreatedQuest, CRYPT_ICON)
call QuestSetDiscovered(bj_lastCreatedQuest, true)
call QuestSetRequired(bj_lastCreatedQuest, false)
call QuestSetCompleted(bj_lastCreatedQuest, false)
set bj_lastCreatedQuest = CreateQuest()
call QuestSetTitle(bj_lastCreatedQuest, RUNE_TITLE)
call QuestSetDescription(bj_lastCreatedQuest, RUNE_DESC)
call QuestSetIconPath(bj_lastCreatedQuest, RUNE_ICON)
call QuestSetDiscovered(bj_lastCreatedQuest, true)
call QuestSetRequired(bj_lastCreatedQuest, false)
call QuestSetCompleted(bj_lastCreatedQuest, false)
set bj_lastCreatedQuest = CreateQuest()
call QuestSetTitle(bj_lastCreatedQuest, WIELD_RECTIFY_TITLE)
call QuestSetDescription(bj_lastCreatedQuest, WIELD_RECTIFY_DESC)
call QuestSetIconPath(bj_lastCreatedQuest, WIELD_RECTIFY_ICON)
call QuestSetDiscovered(bj_lastCreatedQuest, true)
call QuestSetRequired(bj_lastCreatedQuest, false)
call QuestSetCompleted(bj_lastCreatedQuest, false)
endfunction
endscope
//TESH.scrollpos=1
//TESH.alwaysfold=0
scope FriendlyFire initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant real THRESHOLD = 0.5
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit attacked = GetTriggerUnit()
if(IsUnitType(attacked, UNIT_TYPE_HERO)) then
call IssueTargetOrder(GetAttacker(), "move", GetTriggerUnit())
elseif(GetUnitState(attacked, UNIT_STATE_LIFE) >= THRESHOLD * GetUnitState(attacked, UNIT_STATE_MAX_LIFE)) then
call IssueTargetOrder(GetAttacker(), "move", GetTriggerUnit())
endif
set attacked = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit attacker = GetAttacker()
local unit attacked = GetTriggerUnit()
local player ownerAttacked = GetOwningPlayer(attacked)
local player passive = Player(PLAYER_NEUTRAL_PASSIVE)
local boolean okey = IsUnitAlly(attacker, ownerAttacked) and /*
*/(ownerAttacked != passive)
set attacker = null
set attacked = null
set ownerAttacked = null
set passive = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger FriendlyFireTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(FriendlyFireTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(FriendlyFireTrg, Condition(function Conditions))
call TriggerAddAction(FriendlyFireTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope Dead initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant real DEATH_POINT = 0.0 //Widget death reaching point
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
function IsUnitDead takes unit u returns boolean
local boolean okey = GetWidgetLife(u) <= DEATH_POINT or IsUnitType(u, UNIT_TYPE_DEAD) or GetUnitState(u, UNIT_STATE_LIFE) <= DEATH_POINT
set u = null
return okey
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit dying = GetTriggerUnit()
call TriggerSleepAction(0.5)
call RemoveUnit(dying)
set dying = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit dying = GetTriggerUnit()
local boolean okey = (IsUnitType(dying, UNIT_TYPE_MECHANICAL) and /*
*/(GetUnitAbilityLevel(dying, 'Aloc') > 0)) or /*
*/(IsUnitType(dying, UNIT_TYPE_SUMMONED)) or /*
*/(IsUnitIllusion(dying))
set dying = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger DeathTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(DeathTrg, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(DeathTrg, Condition(function Conditions))
call TriggerAddAction(DeathTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope SpecialEffect initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct SpecialEffect_Data
effect e //Effect
real t //Time remain
endstruct
//----------------------------------------------------------------
globals
private SpecialEffect_Data array Ar[1000]
private integer Total
private timer Tim
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local SpecialEffect_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t > 0) then
set sd.t = sd.t - Interval()
else
call DestroyEffect(sd.e)
set sd.e = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
function Timed_AddSpecialEffect takes string s, real x, real y, real t returns nothing
local SpecialEffect_Data sd = SpecialEffect_Data.create()
set sd.e = AddSpecialEffect(s, x, y)
set sd.t = t
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set s = null
endfunction
//----------------------------------------------------------------
function Timed_AddSpecialEffectTarget takes string s, unit u, string a, real t returns nothing
local SpecialEffect_Data sd = SpecialEffect_Data.create()
set sd.e = AddSpecialEffectTarget(s, u, a)
set sd.t = t
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set s = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//setting globals
set Total = 0
set Tim = CreateTimer()
endfunction
endscope
//TESH.scrollpos=3
//TESH.alwaysfold=0
scope Cast initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer DUMMY_ID = 'n000' //Unit Dummy rawcode
private constant integer TIMING_END = 5 //End of timing
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private unit array dummy[1000]
private integer Total
endglobals
//----------------------------------------------------------------
function ImmediateCast takes player owner, real x, real y, real duration, integer spell_id, integer level, string order1, integer order2 returns nothing
local boolean cast = false
local integer timing = 0
set dummy[Total] = CreateUnit(owner, DUMMY_ID, x, y, bj_UNIT_FACING)
call UnitAddAbility(dummy[Total], spell_id)
call SetUnitAbilityLevel(dummy[Total], spell_id, level)
loop
if(order1 == "" or order1 == null) then
set cast = IssueImmediateOrderById(dummy[Total], order2)
else
set cast = IssueImmediateOrder(dummy[Total], order1)
endif
exitwhen(cast or timing > TIMING_END)
set timing = timing + 1
if(cast or timing > TIMING_END) then
call UnitApplyTimedLife(dummy[Total], 'BTLF', duration)
endif
endloop
set Total = Total + 1
endfunction
//----------------------------------------------------------------
function TargetCast takes player owner, real x, real y, real duration, integer spell_id, integer level, string order1, integer order2, unit target returns nothing
local unit dummy = null
local boolean cast = false
local integer timing = 0
set dummy[Total] = CreateUnit(owner, DUMMY_ID, x, y, bj_UNIT_FACING )
call UnitAddAbility(dummy[Total], spell_id)
call SetUnitAbilityLevel(dummy[Total], spell_id, level)
loop
if(order1 == "" or order1 == null) then
call IssueTargetOrderById(dummy[Total], order2, target)
else
call IssueTargetOrder(dummy[Total], order1, target)
endif
exitwhen(cast or timing > TIMING_END)
set timing = timing + 1
if(cast or timing > TIMING_END) then
call UnitApplyTimedLife(dummy[Total], 'BTLF', duration)
endif
endloop
set Total = Total + 1
endfunction
//----------------------------------------------------------------
function DummyTargetCast takes integer id, player owner, real x, real y, real duration, integer spell_id, integer level, string order1, integer order2, unit target returns nothing
local unit dummy = null
local boolean cast = false
local integer timing = 0
set dummy[Total] = CreateUnit(owner, id, x, y, bj_UNIT_FACING )
call UnitAddAbility(dummy[Total], spell_id)
call SetUnitAbilityLevel(dummy[Total], spell_id, level)
loop
if(order1 == "" or order1 == null) then
call IssueTargetOrderById(dummy[Total], order2, target)
else
call IssueTargetOrder(dummy[Total], order1, target)
endif
exitwhen(cast or timing > TIMING_END)
set timing = timing + 1
if(cast or timing > TIMING_END) then
call UnitApplyTimedLife(dummy[Total], 'BTLF', duration)
endif
endloop
set Total = Total + 1
endfunction
//----------------------------------------------------------------
function TargetCast_Upgrade takes player owner, real x, real y, real duration, integer spell_id, integer level, string order1, integer order2, unit target returns nothing
local unit dummy = null
local boolean cast = false
local integer timing = 0
set dummy[Total] = CreateUnit(owner, DUMMY_ID, x, y, bj_UNIT_FACING )
call UnitAddAbility(dummy[Total], spell_id)
call SetUnitAbilityLevel(dummy[Total], spell_id, level)
loop
if(order1 == "" or order1 == null) then
call IssueTargetOrderById(dummy[Total], order2, target)
else
call IssueTargetOrder(dummy[Total], order1, target)
endif
exitwhen(cast or timing > TIMING_END)
set timing = timing + 1
if(cast or timing > TIMING_END) then
call UnitApplyTimedLife(dummy[Total], 'BTLF', duration)
endif
endloop
set Total = Total + 1
endfunction
//----------------------------------------------------------------
function PointCast takes player owner, real x, real y, real duration, integer spell_id, integer level, string order1, integer order2, real targetX, real targetY returns nothing
local unit dummy = null
local boolean cast = false
local integer timing = 0
set dummy[Total] = CreateUnit(owner, DUMMY_ID, x, y, bj_UNIT_FACING )
call UnitAddAbility(dummy[Total], spell_id)
call SetUnitAbilityLevel(dummy[Total], spell_id, level)
loop
if(order1 == "" or order1 == null) then
call IssuePointOrderById(dummy[Total], order2, targetX, targetY)
else
call IssuePointOrder(dummy[Total], order1, targetX, targetY)
endif
exitwhen(cast or timing > TIMING_END)
set timing = timing + 1
if(cast or timing > TIMING_END) then
call UnitApplyTimedLife(dummy[Total], 'BTLF', duration)
endif
endloop
set Total = Total + 1
endfunction
//----------------------------------------------------------------
function DamageCast takes player owner, real x, real y, real duration, unit target, real damage, boolean attack, boolean ranged, attacktype at, damagetype dt, weapontype wt returns nothing
local unit dummy = null
set dummy[Total] = CreateUnit(owner, DUMMY_ID, x, y, bj_UNIT_FACING )
call UnitDamageTarget(dummy[Total], target, damage, attack, ranged, at, dt, wt)
call UnitApplyTimedLife(dummy[Total], 'BTLF', duration)
set Total = Total + 1
endfunction
//----------------------------------------------------------------
private function Kill_Actions takes nothing returns nothing
local unit dying = GetTriggerUnit()
local integer i = 0
local unit temp = null
set i = 0
loop
exitwhen(i >= Total)
if(dying == dummy[i]) then
set temp = dummy[i]
set dummy[i] = dummy[Total - 1]
set dummy[Total - 1] = temp
set Total = Total - 1
set i = Total
endif
set i = i + 1
endloop
call RemoveUnit(dying)
set dying = null
endfunction
//----------------------------------------------------------------
private function Kill_Conditions takes nothing returns boolean
return GetUnitTypeId(GetTriggerUnit()) == DUMMY_ID and (not IsUnitIllusion(GetTriggerUnit()))
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger DeathTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(DeathTrg, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(DeathTrg, Condition(function Kill_Conditions))
call TriggerAddAction(DeathTrg, function Kill_Actions)
//setting globals
set Total = 0
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
globals
constant integer TREE1_ID = 'ZTtw' //Ruins tree
constant integer TREE2_ID = 'ZTtc' //Ruins canopy tree
constant integer TREE3_ID = 'ATtr' //Ashenvale tree
real TREE_REVIVE_TIME = 90.0 //Time for tree to revive
endglobals
scope Tree initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer TOTAL_EXTRA_TREE = 4 //Maximum extra tree to create in a region
private constant real DISTANCE_OFFSET = 250.0 //Distance offset from center
endglobals
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
//----------------------------------------------------------------
struct Tree_Data
destructable d //Destructable
real t //Revive time
endstruct
//----------------------------------------------------------------
globals
private trigger RegrowTreeTrg
private real damage
private real fireDuration
private boolexpr bexpr
private timer Tim = CreateTimer()
private Tree_Data array Ar[100]
private integer Total = 0
private integer Total_Extra_Tree_Rect
private integer Count = 0
private rect array Extra_Tree_Rect[8]
private destructable array Extra_Tree[40]
endglobals
//----------------------------------------------------------------
private function FiltersTree takes nothing returns boolean
local destructable enumD = GetFilterDestructable()
local integer enumID = GetDestructableTypeId(enumD)
local boolean okey = (GetDestructableLife(enumD) > 0 and /*
*/((enumID == TREE1_ID) or /*
*/(enumID == TREE2_ID)))
set enumD = null
return okey
endfunction
//----------------------------------------------------------------
private function CountTree takes nothing returns nothing
set Count = Count + 1
endfunction
//----------------------------------------------------------------
private function KillTree takes nothing returns nothing
local destructable enumD = GetEnumDestructable()
local unit fire = null
call KillDestructable(enumD)
set enumD = null
set fire = null
endfunction
//----------------------------------------------------------------
private function DamageTree takes nothing returns nothing
local destructable enumD = GetEnumDestructable()
local unit fire = null
call SetDestructableAnimation(enumD, "stand, hit")
call SetDestructableLife(enumD, GetDestructableLife(enumD) - damage)
set enumD = null
set fire = null
endfunction
//----------------------------------------------------------------
function HitTree takes real x, real y, real r, real d, real f returns integer
local rect rt = Rect(x - r, y - r, x + r, y + r)
set damage = d
set fireDuration = f
if(damage > 0) then
call EnumDestructablesInRect(rt, bexpr, function DamageTree)
else
call EnumDestructablesInRect(rt, bexpr, function KillTree)
endif
call RemoveRect(rt)
set rt = null
set Count = 0
call EnumDestructablesInRect(rt, bexpr, function CountTree)
return Count
endfunction
//----------------------------------------------------------------
function ReviveAllTree takes nothing returns nothing
local Tree_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
set sd.t = 0.0
set i = i + 1
endloop
endfunction
//----------------------------------------------------------------
function CreateExtraTree takes nothing returns nothing
local integer i = 0
local integer j = 0
local real minX = 0.0
local real maxX = 0.0
local real minY = 0.0
local real maxY = 0.0
local real centerX = 0.0
local real centerY = 0.0
local real randomX = 0.0
local real randomY = 0.0
local real randomF = 0.0
local real randomS = 0.0
local integer randomV = 0
local real angle
local destructable d = null
local integer total = 0
loop
exitwhen(i >= Total_Extra_Tree_Rect)
set minX = GetRectMinX(Extra_Tree_Rect[i])
set maxX = GetRectMaxX(Extra_Tree_Rect[i])
set minY = GetRectMinY(Extra_Tree_Rect[i])
set maxY = GetRectMaxY(Extra_Tree_Rect[i])
set centerX = GetRectCenterX(Extra_Tree_Rect[i])
set centerY = GetRectCenterY(Extra_Tree_Rect[i])
set angle = 360.0/TOTAL_EXTRA_TREE
set j = 0
loop
exitwhen(j >= TOTAL_EXTRA_TREE)
//set randomX = GetRandomReal(minX, maxX)
//set randomY = GetRandomReal(minY, maxY)
//if(j == 0) then
//set randomX = centerX
//set randomY = centerY
//else
set randomX = centerX + DISTANCE_OFFSET * Cos(45 + (j * angle)*bj_DEGTORAD)
set randomY = centerY + DISTANCE_OFFSET * Sin(45 + (j * angle)*bj_DEGTORAD)
//endif
set randomF = I2R(GetRandomInt(0, 360))
set randomS = GetRandomReal(0.65, 1.05)
set randomV = GetRandomInt(0, 9)
set d = CreateDestructable(TREE1_ID, randomX, randomY, randomF, randomS, randomV)
call SetDestructableAnimation(d, "birth")
call SetDestructableAnimationSpeed(d, 12.0)
call TriggerRegisterDeathEvent(RegrowTreeTrg, d)
set Extra_Tree[total] = d
set total = total + 1
set j = j + 1
endloop
set i = i + 1
endloop
set d = null
endfunction
//----------------------------------------------------------------
function KillExtraTree takes nothing returns nothing
local integer i = 0
loop
exitwhen(i >= 60)
call SetDestructableAnimationSpeed(Extra_Tree[i], 1.0)
call KillDestructable(Extra_Tree[i])
set i = i + 1
endloop
endfunction
//----------------------------------------------------------------
function RemoveExtraTree takes nothing returns nothing
local integer i = 0
set i = 0
loop
exitwhen(i >= 60)
call RemoveDestructable(Extra_Tree[i])
set Extra_Tree[i] = null
set i = i + 1
endloop
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Tree_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t > 0 and GetDestructableLife(sd.d) <= 0) then
set sd.t = sd.t - Interval()
else
call DestructableRestoreLife(sd.d, GetDestructableMaxLife(sd.d), true)
set sd.d = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Tree_Data sd = Tree_Data.create()
local destructable des = GetDyingDestructable()
set sd.d = des
set sd.t = TREE_REVIVE_TIME
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set des = null
endfunction
//----------------------------------------------------------------
private function All_Trees takes nothing returns nothing
call TriggerRegisterDeathEvent(RegrowTreeTrg, GetEnumDestructable())
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set RegrowTreeTrg = CreateTrigger()
set bexpr = Condition(function FiltersTree)
call EnumDestructablesInRect(GetWorldBounds(), bexpr, function All_Trees)
call TriggerAddAction(RegrowTreeTrg, function Actions)
//Setting globals
set Total_Extra_Tree_Rect = 12
set Extra_Tree_Rect[0] = gg_rct_Overgrow_1
set Extra_Tree_Rect[1] = gg_rct_Overgrow_2
set Extra_Tree_Rect[2] = gg_rct_Overgrow_3
set Extra_Tree_Rect[3] = gg_rct_Overgrow_4
set Extra_Tree_Rect[4] = gg_rct_Overgrow_5
set Extra_Tree_Rect[5] = gg_rct_Overgrow_6
set Extra_Tree_Rect[6] = gg_rct_Overgrow_7
set Extra_Tree_Rect[7] = gg_rct_Overgrow_8
set Extra_Tree_Rect[8] = gg_rct_Overgrow_9
set Extra_Tree_Rect[9] = gg_rct_Overgrow_10
set Extra_Tree_Rect[10] = gg_rct_Overgrow_11
set Extra_Tree_Rect[11] = gg_rct_Overgrow_12
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope Blocker initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer BLOCKER_ID = 'YTpb' //Destructable ground blocker
private constant integer GATE1_ID = 'ZTg1' //Gate north
private constant integer GATE2_ID = 'ZTg3' //Gate west
private constant integer GATE3_ID = 'B000' //Gate south
private constant integer GATE4_ID = 'B001' //Gate east
private constant integer WALL1_ID = 'Dofv' //Wall
private constant integer WALL2_ID = 'Dofw' //Wall straight
private constant integer BARREL_ID = 'hwtw' //Barrel
private constant real WALL_RADIUS_INCREMENT = 150.0 //???
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
//Destructable filter
private function FiltersGate takes nothing returns boolean
local destructable enumD = GetFilterDestructable()
local integer enumDID = GetDestructableTypeId(enumD)
local boolean okey = ((enumDID == BLOCKER_ID or/*
*/ (enumDID == GATE1_ID or /*
*/ enumDID == GATE2_ID or /*
*/ enumDID == GATE3_ID or /*
*/ enumDID == GATE4_ID) or /*
*/(enumDID == WALL1_ID or /*
*/ enumDID == WALL2_ID)) and /*
*/ GetWidgetLife(enumD) > 0)
set enumD = null
return okey
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(GetUnitTypeId(target) == BARREL_ID)
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private boolexpr bexprGate
private group all
private boolexpr bexprUnit
private integer num
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Count takes nothing returns nothing
set num = num + 1
endfunction
//----------------------------------------------------------------
function IsWall takes real x, real y, real radius returns boolean
local rect rct = Rect(x - radius, y - radius, x + radius, y + radius)
local unit f = null
set num = 0
call EnumDestructablesInRect(rct, bexprGate, function Count)
call GroupEnumUnitsInRange(all, x, y, radius, bexprUnit)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
set num = num + 1
endloop
set rct = null
set f = null
if(num > 0) then
return true
else
return false
endif
endfunction
//----------------------------------------------------------------
function IsBarrel takes unit walker, real x, real y, real radius returns boolean
local player owner = GetOwningPlayer(walker)
local rect rct = Rect(x - radius, y - radius, x + radius, y + radius)
local unit f = null
set num = 0
call GroupEnumUnitsInRange(all, x, y, radius, bexprUnit)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(not IsUnitEnemy(f, owner)) then
set num = num + 1
endif
endloop
set walker = null
set rct = null
set owner = null
set f = null
if(num > 0) then
return true
else
return false
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set bexprGate = Condition(function FiltersGate)
set all = CreateGroup()
set bexprUnit = Condition(function Pick)
endfunction
endscope
//TESH.scrollpos=6
//TESH.alwaysfold=0
scope TextTag initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct TextTag_Data
texttag t //Text tag
real r //Time remain
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private TextTag_Data array Ar[1000]
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local TextTag_Data td
local integer i = 0
loop
exitwhen(i >= Total)
set td = Ar[i]
if(td.r > 0) then
set td.r = td.r - Interval()
else
call SetTextTagAge(td.t, 0.0)
call DestroyTextTag(td.t)
set td.t = null
set td.t = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call td.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
function TextTag_AttachUnit takes string text, real size, unit u, real hOff, integer red, integer green, integer blue, integer alpha, real xvel, real yvel, boolean permanent, real lifespan, real fadepoint returns nothing
local TextTag_Data td = TextTag_Data.create()
set td.t = CreateTextTag()
set td.r = lifespan * 2
call SetTextTagText(td.t, text, size)
call SetTextTagPosUnit(td.t, u, hOff)
call SetTextTagColor(td.t, red, green, blue, alpha)
call SetTextTagVelocity(td.t, xvel, yvel)
call SetTextTagPermanent(td.t, permanent)
call SetTextTagLifespan(td.t, lifespan)
call SetTextTagFadepoint(td.t, fadepoint)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = td
set text = null
set u = null
endfunction
//----------------------------------------------------------------
function TextTag_Center takes string text, real size, real x, real y, real hOff, integer red, integer green, integer blue, integer alpha, real xvel, real yvel, boolean permanent, real lifespan, real fadepoint returns nothing
local TextTag_Data td = TextTag_Data.create()
local real shift = RMinBJ(StringLength(text)*5.5, 200.0)
set td.t = CreateTextTag()
set td.r = lifespan * 2
call SetTextTagText(td.t, text, size)
call SetTextTagPos(td.t, x - shift, y, hOff)
call SetTextTagColor(td.t, red, green, blue, alpha)
call SetTextTagVelocity(td.t, xvel, yvel)
call SetTextTagPermanent(td.t, permanent)
call SetTextTagLifespan(td.t, lifespan)
call SetTextTagFadepoint(td.t, fadepoint)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = td
set text = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//setting globals
set Tim = CreateTimer()
set Total = 0
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope Shop initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer UNIT1_ID = 'ngme'
private constant integer UNIT2_ID = 'ngad'
private constant integer UNIT3_ID = 'ntav'
private constant integer UNIT4_ID = 'nmrk'
private constant real SHOP_TEXT_SIZE = 8.0 //Text size
private constant real SHOP_TEXT_HEIGHT = 50.0 //Text height
private constant string SHOP_ATOK_TEXT = "Able to request Weather of Phenomenon.\nAlso provides Tome of Retraining|r."
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
endglobals
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit target = GetTriggerUnit()
local player owner = GetTriggerPlayer()
call QueueUnitAnimation(target, "work")
call QueueUnitAnimation(target, "stand")
set target = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetUnitTypeId(GetTriggerUnit()) == UNIT1_ID or /*
*/GetUnitTypeId(GetTriggerUnit()) == UNIT2_ID or /*
*/GetUnitTypeId(GetTriggerUnit()) == UNIT3_ID or /*
*/GetUnitTypeId(GetTriggerUnit()) == UNIT4_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger ShopTrg = CreateTrigger()
local texttag tt = null
local real shift = 0.0
local integer i = 0
call TriggerRegisterPlayerSelectionEventBJ(ShopTrg, Player(0), true)
call TriggerRegisterPlayerSelectionEventBJ(ShopTrg, Player(1), true)
call TriggerRegisterPlayerSelectionEventBJ(ShopTrg, Player(2), true)
call TriggerRegisterPlayerSelectionEventBJ(ShopTrg, Player(3), true)
call TriggerRegisterPlayerSelectionEventBJ(ShopTrg, Player(4), true)
call TriggerRegisterPlayerSelectionEventBJ(ShopTrg, Player(5), true)
call TriggerRegisterPlayerSelectionEventBJ(ShopTrg, Player(6), true)
call TriggerRegisterPlayerSelectionEventBJ(ShopTrg, Player(7), true)
call TriggerAddCondition(ShopTrg, Condition(function Conditions))
call TriggerAddAction(ShopTrg, function Actions)
set tt = CreateTextTag()
set shift = RMinBJ(StringLength(SHOP_ATOK_TEXT) * 5.5, 200.0)
call SetTextTagText(tt, SHOP_ATOK_TEXT, SHOP_TEXT_SIZE * 0.023 / 10)
call SetTextTagColor(tt, 255, 255, 255, 255)
call SetTextTagPos(tt, GetRectCenterX(gg_rct_Warlock_Text) - shift, GetRectCenterY(gg_rct_Warlock_Text), SHOP_TEXT_HEIGHT)
call SetTextTagPermanent(tt, true)
set tt = null
endfunction
endscope
//TESH.scrollpos=111
//TESH.alwaysfold=0
scope Knockback
//----------------------------------------------------------------
struct Knockback_Data
unit u
real d1
real d2
real sin //Direction sin
real cos //Direction cos
real r //Hit tree
boolean p //Pause unit
boolean f //Finish
real d //Duration pathing
string s = "" //Effect to unit
effect e = null //Effect type
endstruct
//----------------------------------------------------------------
globals
private timer Tim = CreateTimer()
private Knockback_Data array KnockAr[500]
private integer KnockTotal = 0
endglobals
//----------------------------------------------------------------
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
private function Knockback_Execute takes nothing returns nothing
local Knockback_Data kd
local integer i = 0
local real x = 0.0
local real y = 0.0
local real uX = 0.0
local real uY = 0.0
loop
exitwhen(i >= KnockTotal)
set kd = KnockAr[i]
if(kd.d1 > 0) then
set uX = GetUnitX(kd.u)
set uY = GetUnitY(kd.u)
if(kd.s != null and kd.s != "") then
call DestroyEffect(AddSpecialEffect(kd.s, uX, uY))
endif
set x = uX + kd.d1 * kd.cos
set y = uY + kd.d1 * kd.sin
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
call SetUnitX(kd.u, x)
call SetUnitY(kd.u, y)
else
set kd.d1 = 0.0
endif
if(kd.r > 0) then
call HitTree(x, y, kd.r, 0.0, 0.0)
endif
set kd.d1 = kd.d1 - kd.d2
elseif(not kd.f) then
set kd.f = true
if kd.e != null then
call DestroyEffect(kd.e)
set kd.e = null
endif
if(kd.p) then
call PauseUnit(kd.u, false)
//call SetUnitPosition(kd.u, GetUnitX(kd.u), GetUnitY(kd.u))
endif
elseif(kd.d > 0.0) then
set kd.d = kd.d - Interval()
else
if kd.e != null then
call DestroyEffect(kd.e)
set kd.e = null
endif
set kd.s = null
call SetUnitPathing(kd.u, true)
call SetUnitPosition(kd.u, GetUnitX(kd.u), GetUnitY(kd.u))
set kd.u = null
set KnockAr[i] = KnockAr[KnockTotal - 1]
set KnockTotal = KnockTotal - 1
call kd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if KnockTotal == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
function KnockbackEx takes unit u, real d, real a, real w, real r, string s, boolean pause returns nothing
local Knockback_Data kd = Knockback_Data.create()
local integer q = R2I(w / Interval())
set kd.u = u
set kd.d1 = 2 * d / (q + 1)
set kd.d2 = kd.d1 / q
set kd.sin = Sin(a*bj_DEGTORAD)
set kd.cos = Cos(a*bj_DEGTORAD)
set kd.r = r
set kd.p = pause
set kd.f = false
set kd.d = 2.0
set kd.s = s
if(pause) then
call PauseUnit(u, true)
call SetUnitPosition(u, GetUnitX(u), GetUnitY(u))
endif
call UnitAddAbility(u, 'Arav')
call UnitRemoveAbility(u, 'Arav')
call SetUnitPathing(u, false )
if(KnockTotal <= 0) then
call TimerStart(Tim, Interval(), true, function Knockback_Execute)
endif
set KnockTotal = KnockTotal + 1
set KnockAr[KnockTotal - 1] = kd
set u = null
set s = null
endfunction
//----------------------------------------------------------------
function Knockback takes unit u, real d, real a, real w returns nothing
call KnockbackEx(u, d, a, w, 0, "", true)
endfunction
//----------------------------------------------------------------
function Knockback_NoPause takes unit u, real d, real a, real w returns nothing
call KnockbackEx(u, d, a, w, 0, "", false)
endfunction
//----------------------------------------------------------------
function Knockback_NoPause_Effect takes unit u, real d, real a, real w, string e returns nothing
call KnockbackEx(u, d, a, w, 0, e, false)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope Pather initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer UNIT_ID = 'n01J' //Unit Pather rawcode
endglobals
//Interval
private function Interval takes nothing returns real
return 0.5
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Pather_Data
unit u //Unit caster
player o //Player passive
real t //Time remain
boolean ok //Okey
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Load_Data array Ar[100]
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Pather_Data sd
local integer i = 0
local integer j = 0
local real x = 0.0
local real y = 0.0
local real tX = 0.0
local real tY = 0.0
local real face = 0.0
local boolean pathable = false
local real randomDistance = 0.0
local real randomAngle = 0.0
local real rad = 0.0
local unit dummy = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t > 0.0) then
set sd.t = sd.t - Interval()
else
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
set face = GetUnitFacing(sd.u)
set rad = face * bj_DEGTORAD
set tX = x + 100.0 * Cos(rad)
set tY = y + 100.0 * Sin(rad)
/*set pathable = false
set j = 0
loop
exitwhen(j >= 100 and pathable)
set randomDistance = I2R(GetRandomInt(0, 50))
set randomAngle = I2R(GetRandomInt(0, 360))
set rad = randomAngle * bj_DEGTORAD
set x = tX + randomDistance * Cos(rad)
set y = tY + randomDistance * Sin(rad)
set pathable = IsTerrainPathable(x, y, PATHING_TYPE_WALKABILITY)
set j = j + 1
endloop
if(pathable) then
call SetUnitPathing(sd.u, true)
call SetUnitPosition(sd.u, x, y)
//call SetUnitPosition(sd.u, GetUnitX(sd.u), GetUnitY(sd.u))
else
set j = 0
loop
exitwhen(j >= 100 and pathable)
set randomDistance = I2R(GetRandomInt(50, 250))
set randomAngle = I2R(GetRandomInt(0, 360))
set rad = randomAngle * bj_DEGTORAD
set x = tX + randomDistance * Cos(rad)
set y = tY + randomDistance * Sin(rad)
set pathable = (not IsTerrainPathable(x, y, PATHING_TYPE_WALKABILITY))
set j = j + 1
endloop
if(pathable) then
call SetUnitPathing(sd.u, true)
call SetUnitPosition(sd.u, x, y)
endif
endif*/
call SetUnitX(sd.u, tX)
call SetUnitY(sd.u, tY)
set dummy = CreateUnit(sd.o, UNIT_ID, x, y, 0.0)
//call UnitApplyTimedLife(dummy, 'BTLF', 2.0)
call SetUnitPathing(dummy, true)
call SetUnitX(dummy, x)
call SetUnitY(dummy, y)
call SetUnitPosition(dummy, GetUnitX(dummy), GetUnitY(dummy))
//call SetUnitPosition(sd.u, x, y)
call SetUnitPathing(sd.u, true)
call SetUnitX(sd.u, GetUnitX(dummy))
call SetUnitY(sd.u, GetUnitY(dummy))
call RemoveUnit(dummy)
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if(Total == 0) then
call PauseTimer(Tim)
endif
set dummy = null
endfunction
//----------------------------------------------------------------
function Pather takes unit u, real t returns nothing
local Pather_Data sd = Pather_Data.create()
set sd.u = u
set sd.o = Player(PLAYER_NEUTRAL_PASSIVE)
set sd.t = t
set sd.ok = false
call UnitAddAbility(u, 'Arav')
call UnitRemoveAbility(u, 'Arav')
call SetUnitPathing(u, false)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set u = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//setting globals
set Tim = CreateTimer()
set Total = 0
endfunction
endscope
//TESH.scrollpos=72
//TESH.alwaysfold=0
scope AttackBuffer initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A00N' //Spell Forest Arisen rawcode
private constant string SPELL_EFFECT = "Objects\\Spawnmodels\\NightElf\\EntBirthTarget\\EntBirthTarget.mdl" //Death effect
endglobals
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.5
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct AttackBuffer_Data
unit u //Unit caster
unit t //Unit target
integer s //Spell id
real d //Duration
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private AttackBuffer_Data array Ar[1000]
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
return Targets(GetFilterUnit())
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local AttackBuffer_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.d > 0.0) then
set sd.d = sd.d - Interval()
else
call UnitRemoveAbility(sd.t, sd.s)
call sd.destroy()
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
function BuffAttack takes unit attacker, unit attacked, integer dummyAbility, real time returns nothing
local AttackBuffer_Data sd
local integer i = 0
local boolean exist = false
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == attacker and sd.t == attacked and sd.s == dummyAbility) then
set exist = true
set sd.d = time
set i = Total
endif
set i = i + 1
endloop
if(not exist) then
set sd = AttackBuffer_Data.create()
set sd.u = attacker
set sd.t = attacked
set sd.s = dummyAbility
set sd.d = time
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//setting globals
set Tim = CreateTimer()
set Total = 0
endfunction
endscope
//TESH.scrollpos=270
//TESH.alwaysfold=0
globals
integer array Heroes_Luminous[14]
boolean array Allow_Heroes_Luminous[14]
integer Total_Luminous_Heroes
integer array Heroes_Overcast[12]
boolean array Allow_Heroes_Overcast[12]
integer Total_Overcast_Heroes
integer array All_Heroes[100]
boolean array Allow_Heroes[100]
integer Total_Heroes
integer array Hero_Selected_Player[8]
group Heroes
hashtable Heroes_Ht = InitHashtable()
constant integer HERO_SOUND_KEY = 0
constant integer HERO_UPGRADE_ULTIMATE_KEY = 1
constant integer HERO_MAGIC_DAMAGE_KEY = 2
constant integer LIGHT_BRINGER_ID = 'Hpal'
constant integer ARCANE_WIZARD_ID = 'Hamg'
constant integer KING_TEMPEST_ID = 'Hmkg'
constant integer PYROMANCER_ID = 'Hblm'
constant integer ARCHSLAYER_ID = 'Obla'
constant integer SPIRIT_CALLER_ID = 'Ofar'
constant integer GRANDTAUR_ID = 'Otch'
constant integer OCCULT_SAGE_ID = 'Oshd'
constant integer DEATH_LEGION_ID = 'Udea'
constant integer SKELETON_WITCH_ID = 'Ulic'
constant integer MORTAL_PREDATOR_ID = 'Udre'
constant integer SWARM_TITAN_ID = 'Ucrl'
constant integer GUARDIAN_NATURE_ID = 'Ekee'
constant integer CELESTIAL_PRINCESS_ID = 'Emoo'
constant integer DEMON_HALF_ID = 'Edem'
constant integer SHADOW_ASSASSIN_ID = 'Ewar'
constant integer DAMNED_AMOK_ID = 'Ogrh'
constant integer LONE_RANGER_ID = 'Hvwd'
constant integer BRUTE_LORD_ID = 'Ubal'
constant integer SORCERESS_ID = 'Hjai'
constant integer BLACK_ARCHER_ID = 'Usyl'
constant integer SKY_WANDERER_ID = 'Efur'
constant integer BEAST_HUNTER_ID = 'Nbst'
constant integer SNAKE_WIDOW_ID = 'Hvsh'
constant integer FIRST_CONJURER_ID = 'Naka'
constant integer VOLCANIC_CORE_ID = 'Nfir'
endglobals
scope LightHeroes initializer Init
//----------------------------------------------------------------
globals
private group copy
endglobals
//----------------------------------------------------------------
function GetHero takes player p returns unit
local unit f = null
local boolean exist = false
local unit u = null
set exist = false
set copy = CopyGroup(Heroes)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not exist) then
if(GetOwningPlayer(f) == p) then
set u = f
set exist = true
endif
endif
endloop
set p = null
set f = null
return u
endfunction
//----------------------------------------------------------------
function GetHeroIndex takes unit u returns integer
local integer unitType = GetUnitTypeId(u)
local integer i = 0
local integer index = -1
if(unitType == LIGHT_BRINGER_ID) then
set index = 0
elseif(unitType == ARCANE_WIZARD_ID) then
set index = 1
elseif(unitType == KING_TEMPEST_ID or /*
*/unitType == 'H002' or /*
*/unitType == 'H001') then
set index = 2
elseif(unitType == PYROMANCER_ID) then
set index = 3
elseif(unitType == ARCHSLAYER_ID) then
set index = 4
elseif(unitType == SPIRIT_CALLER_ID) then
set index = 5
elseif(unitType == GRANDTAUR_ID) then
set index = 6
elseif(unitType == OCCULT_SAGE_ID) then
set index = 7
elseif(unitType == DEATH_LEGION_ID) then
set index = 8
elseif(unitType == SKELETON_WITCH_ID) then
set index = 9
elseif(unitType == MORTAL_PREDATOR_ID or unitType == 'U006' or unitType == 'U001') then
set index = 10
elseif(unitType == SWARM_TITAN_ID) then
set index = 11
elseif(unitType == GUARDIAN_NATURE_ID) then
set index = 12
elseif(unitType == CELESTIAL_PRINCESS_ID) then
set index = 13
elseif(unitType == DEMON_HALF_ID or unitType == 'Edmm') then
set index = 14
elseif(unitType == SHADOW_ASSASSIN_ID) then
set index = 15
elseif(unitType == DAMNED_AMOK_ID or unitType == 'Opgh') then
set index = 16
elseif(unitType == LONE_RANGER_ID) then
set index = 17
elseif(unitType == BRUTE_LORD_ID) then
set index = 18
elseif(unitType == SORCERESS_ID) then
set index = 19
elseif(unitType == BLACK_ARCHER_ID) then
set index = 20
elseif(unitType == SKY_WANDERER_ID) then
set index = 21
elseif(unitType == BEAST_HUNTER_ID) then
set index = 22
elseif(unitType == SNAKE_WIDOW_ID) then
set index = 23
elseif(unitType == FIRST_CONJURER_ID) then
set index = 24
elseif(unitType == VOLCANIC_CORE_ID) then
set index = 25
else
set index = -1
endif
set u = null
return index
endfunction
//----------------------------------------------------------------
function GetHeroIndexByType takes integer unitType returns integer
local integer index = -1
if(unitType == LIGHT_BRINGER_ID) then
set index = 0
elseif(unitType == ARCANE_WIZARD_ID) then
set index = 1
elseif(unitType == KING_TEMPEST_ID or /*
*/unitType == 'H002' or /*
*/unitType == 'H001') then
set index = 2
elseif(unitType == PYROMANCER_ID) then
set index = 3
elseif(unitType == ARCHSLAYER_ID) then
set index = 4
elseif(unitType == SPIRIT_CALLER_ID) then
set index = 5
elseif(unitType == GRANDTAUR_ID) then
set index = 6
elseif(unitType == OCCULT_SAGE_ID) then
set index = 7
elseif(unitType == DEATH_LEGION_ID) then
set index = 8
elseif(unitType == SKELETON_WITCH_ID) then
set index = 9
elseif(unitType == MORTAL_PREDATOR_ID or unitType == 'U006' or unitType == 'U001') then
set index = 10
elseif(unitType == SWARM_TITAN_ID) then
set index = 11
elseif(unitType == GUARDIAN_NATURE_ID) then
set index = 12
elseif(unitType == CELESTIAL_PRINCESS_ID) then
set index = 13
elseif(unitType == DEMON_HALF_ID or unitType == 'Edmm') then
set index = 14
elseif(unitType == SHADOW_ASSASSIN_ID) then
set index = 15
elseif(unitType == DAMNED_AMOK_ID or unitType == 'Opgh') then
set index = 16
elseif(unitType == LONE_RANGER_ID) then
set index = 17
elseif(unitType == BRUTE_LORD_ID) then
set index = 18
elseif(unitType == SORCERESS_ID) then
set index = 19
elseif(unitType == BLACK_ARCHER_ID) then
set index = 20
elseif(unitType == SKY_WANDERER_ID) then
set index = 21
elseif(unitType == BEAST_HUNTER_ID) then
set index = 22
elseif(unitType == SNAKE_WIDOW_ID) then
set index = 23
elseif(unitType == FIRST_CONJURER_ID) then
set index = 24
elseif(unitType == VOLCANIC_CORE_ID) then
set index = 25
else
set index = -1
endif
return index
endfunction
//----------------------------------------------------------------
function IsHeroLuminous takes unit u returns boolean
local integer uType = GetUnitTypeId(u)
local integer i = 0
local boolean exist = false
set i = 0
loop
exitwhen(i >= Total_Luminous_Heroes)
if(uType == Heroes_Luminous[i]) then
set exist = true
set i = Total_Luminous_Heroes
endif
set i = i + 1
endloop
set u = null
return exist
endfunction
//----------------------------------------------------------------
function GetHeroIndex_Luminous takes unit u returns integer
local integer uType = GetUnitTypeId(u)
local integer i = 0
local integer index = -1
set i = 0
loop
exitwhen(i >= Total_Luminous_Heroes)
if(uType == Heroes_Luminous[i]) then
set index = i
set i = Total_Luminous_Heroes
endif
set i = i + 1
endloop
set u = null
return index
endfunction
//----------------------------------------------------------------
function IsHeroOvercast takes unit u returns boolean
local integer uType = GetUnitTypeId(u)
local integer i = 0
local boolean exist = false
set i = 0
loop
exitwhen(i >= Total_Overcast_Heroes)
if(uType == Heroes_Overcast[i]) then
set exist = true
set i = Total_Overcast_Heroes
endif
set i = i + 1
endloop
set u = null
return exist
endfunction
//----------------------------------------------------------------
function GetHeroIndex_Overcast takes unit u returns integer
local integer uType = GetUnitTypeId(u)
local integer i = 0
local integer index = -1
set i = 0
loop
exitwhen(i >= Total_Overcast_Heroes)
if(uType == Heroes_Overcast[i]) then
set index = i
set i = Total_Overcast_Heroes
endif
set i = i + 1
endloop
set u = null
return index
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local integer i
set Total_Luminous_Heroes = 6
set Heroes_Luminous[0] = LIGHT_BRINGER_ID
set Heroes_Luminous[1] = ARCANE_WIZARD_ID
set Heroes_Luminous[2] = KING_TEMPEST_ID
set Heroes_Luminous[3] = SPIRIT_CALLER_ID
set Heroes_Luminous[4] = GRANDTAUR_ID
set Heroes_Luminous[5] = OCCULT_SAGE_ID
set Heroes_Luminous[6] = GUARDIAN_NATURE_ID
set Heroes_Luminous[7] = CELESTIAL_PRINCESS_ID
set Heroes_Luminous[8] = LONE_RANGER_ID
set Heroes_Luminous[9] = SORCERESS_ID
set Heroes_Luminous[10] = SKY_WANDERER_ID
set Heroes_Luminous[11] = BEAST_HUNTER_ID
set Heroes_Luminous[12] = FIRST_CONJURER_ID
set Heroes_Luminous[13] = VOLCANIC_CORE_ID
set Allow_Heroes_Luminous[0] = true
set Allow_Heroes_Luminous[1] = true
set Allow_Heroes_Luminous[2] = true
set Allow_Heroes_Luminous[3] = true
set Allow_Heroes_Luminous[4] = true
set Allow_Heroes_Luminous[5] = true
set Allow_Heroes_Luminous[6] = false
set Allow_Heroes_Luminous[7] = false
set Allow_Heroes_Luminous[8] = false
set Allow_Heroes_Luminous[9] = false
set Allow_Heroes_Luminous[10] = false
set Allow_Heroes_Luminous[11] = false
set Allow_Heroes_Luminous[12] = false
set Allow_Heroes_Luminous[13] = false
set Total_Overcast_Heroes = 6
set Heroes_Overcast[0] = PYROMANCER_ID
set Heroes_Overcast[1] = ARCHSLAYER_ID
set Heroes_Overcast[2] = DEATH_LEGION_ID
set Heroes_Overcast[3] = SKELETON_WITCH_ID
set Heroes_Overcast[4] = MORTAL_PREDATOR_ID
set Heroes_Overcast[5] = SWARM_TITAN_ID
set Heroes_Overcast[6] = DEMON_HALF_ID
set Heroes_Overcast[7] = SHADOW_ASSASSIN_ID
set Heroes_Overcast[8] = DAMNED_AMOK_ID
set Heroes_Overcast[9] = BRUTE_LORD_ID
set Heroes_Overcast[10] = BLACK_ARCHER_ID
set Heroes_Overcast[11] = SNAKE_WIDOW_ID
set Allow_Heroes_Overcast[0] = true
set Allow_Heroes_Overcast[1] = true
set Allow_Heroes_Overcast[2] = true
set Allow_Heroes_Overcast[3] = true
set Allow_Heroes_Overcast[4] = true
set Allow_Heroes_Overcast[5] = true
set Allow_Heroes_Overcast[6] = false
set Allow_Heroes_Overcast[7] = false
set Allow_Heroes_Overcast[8] = false
set Allow_Heroes_Overcast[9] = false
set Allow_Heroes_Overcast[10] = false
set Allow_Heroes_Overcast[11] = false
set Heroes = CreateGroup()
set Total_Heroes = Total_Luminous_Heroes + Total_Overcast_Heroes
set i = 0
loop
exitwhen(i >= Total_Luminous_Heroes)
set All_Heroes[i] = Heroes_Luminous[i]
set Allow_Heroes[i] = Allow_Heroes_Luminous[i]
set i = i + 1
endloop
set i = 0
loop
exitwhen(i >= Total_Overcast_Heroes)
set All_Heroes[Total_Luminous_Heroes + i] = Heroes_Overcast[i]
set Allow_Heroes[Total_Luminous_Heroes + i] = Allow_Heroes_Overcast[i]
set i = i + 1
endloop
set i = 0
loop
exitwhen(i >= 8)
set Hero_Selected_Player[i] = -1
set i = i + 1
endloop
set copy = CreateGroup()
endfunction
endscope
//TESH.scrollpos=9
//TESH.alwaysfold=0
scope HeroIcon
//----------------------------------------------------------------
function GetHeroIcon takes integer unitType returns string
if(unitType == LIGHT_BRINGER_ID) then
return "ReplaceableTextures\\CommandButtons\\BTNHeroPaladin.blp"
elseif(unitType == ARCANE_WIZARD_ID) then
return "ReplaceableTextures\\CommandButtons\\BTNHeroArchMage.blp"
elseif(unitType == KING_TEMPEST_ID) then
return "ReplaceableTextures\\CommandButtons\\BTNHeroMountainKing.blp"
elseif(unitType == PYROMANCER_ID) then
return "ReplaceableTextures\\CommandButtons\\BTNHeroBloodElfPrince.blp"
elseif(unitType == ARCHSLAYER_ID) then
return "ReplaceableTextures\\CommandButtons\\BTNChaosBlademaster.blp"
elseif(unitType == SPIRIT_CALLER_ID) then
return "ReplaceableTextures\\CommandButtons\\BTNHeroFarseer.blp"
elseif(unitType == GRANDTAUR_ID) then
return "ReplaceableTextures\\CommandButtons\\BTNHeroTaurenChieftain.blp"
elseif(unitType == OCCULT_SAGE_ID) then
return "ReplaceableTextures\\CommandButtons\\BTNShadowHunter.blp"
elseif(unitType == DEATH_LEGION_ID) then
return "ReplaceableTextures\\CommandButtons\\BTNHeroDeathKnight.blp"
elseif(unitType == SKELETON_WITCH_ID) then
return "ReplaceableTextures\\CommandButtons\\BTNLichVersion2.blp"
elseif(unitType == MORTAL_PREDATOR_ID) then
return "ReplaceableTextures\\CommandButtons\\BTNTichondrius.blp"
elseif(unitType == SWARM_TITAN_ID) then
return "ReplaceableTextures\\CommandButtons\\BTNHeroCryptLord.blp"
elseif(unitType == GUARDIAN_NATURE_ID) then
return "ReplaceableTextures\\CommandButtons\\BTNKeeperOfTheGrove.blp"
elseif(unitType == CELESTIAL_PRINCESS_ID) then
return "ReplaceableTextures\\CommandButtons\\BTNPriestessOfTheMoon.blp"
elseif(unitType == DEMON_HALF_ID) then
return "ReplaceableTextures\\CommandButtons\\BTNEvilIllidan.blp"
elseif(unitType == SHADOW_ASSASSIN_ID) then
return "ReplaceableTextures\\CommandButtons\\BTNHeroWarden.blp"
elseif(unitType == DAMNED_AMOK_ID) then
return "ReplaceableTextures\\CommandButtons\\BTNHellScream.blp"
elseif(unitType == LONE_RANGER_ID) then
return "ReplaceableTextures\\CommandButtons\\BTNSylvanusWindrunner.blp"
elseif(unitType == BRUTE_LORD_ID) then
return "ReplaceableTextures\\CommandButtons\\BTNKiljaedin.blp"
elseif(unitType == SORCERESS_ID) then
return "ReplaceableTextures\\CommandButtons\\BTNJaina.blp"
elseif(unitType == BLACK_ARCHER_ID) then
return "ReplaceableTextures\\CommandButtons\\BTNBansheeRanger.blp"
elseif(unitType == SKY_WANDERER_ID) then
return "ReplaceableTextures\\CommandButtons\\BTNFurion.blp"
elseif(unitType == BEAST_HUNTER_ID) then
return "ReplaceableTextures\\CommandButtons\\BTNBeastMaster.blp"
elseif(unitType == SNAKE_WIDOW_ID) then
return "ReplaceableTextures\\CommandButtons\\BTNNagaSeaWitch.blp"
elseif(unitType == FIRST_CONJURER_ID) then
return "ReplaceableTextures\\CommandButtons\\BTNDranaiAkama.blp"
elseif(unitType == VOLCANIC_CORE_ID) then
return "ReplaceableTextures\\CommandButtons\\BTNHeroAvatarOfFlame.blp"
else
return ""
endif
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope HeroAttribute
//----------------------------------------------------------------
function GetHeroAttribute takes integer unitType returns integer
if(unitType == LIGHT_BRINGER_ID) then
return 1
elseif(unitType == ARCANE_WIZARD_ID) then
return 3
elseif(unitType == KING_TEMPEST_ID) then
return 1
elseif(unitType == PYROMANCER_ID) then
return 3
elseif(unitType == ARCHSLAYER_ID) then
return 2
elseif(unitType == SPIRIT_CALLER_ID) then
return 3
elseif(unitType == GRANDTAUR_ID) then
return 1
elseif(unitType == OCCULT_SAGE_ID) then
return 2
elseif(unitType == DEATH_LEGION_ID) then
return 1
elseif(unitType == SKELETON_WITCH_ID) then
return 3
elseif(unitType == MORTAL_PREDATOR_ID) then
return 1
elseif(unitType == SWARM_TITAN_ID) then
return 1
elseif(unitType == GUARDIAN_NATURE_ID) then
return 3
elseif(unitType == CELESTIAL_PRINCESS_ID) then
return 2
elseif(unitType == DEMON_HALF_ID) then
return 2
elseif(unitType == SHADOW_ASSASSIN_ID) then
return 2
elseif(unitType == DAMNED_AMOK_ID) then
return 1
elseif(unitType == LONE_RANGER_ID) then
return 2
elseif(unitType == BRUTE_LORD_ID) then
return 2
elseif(unitType == SORCERESS_ID) then
return 3
elseif(unitType == BLACK_ARCHER_ID) then
return 2
elseif(unitType == SKY_WANDERER_ID) then
return 2
elseif(unitType == BEAST_HUNTER_ID) then
return 1
elseif(unitType == SNAKE_WIDOW_ID) then
return 3
elseif(unitType == FIRST_CONJURER_ID) then
return 2
elseif(unitType == VOLCANIC_CORE_ID) then
return 1
else
return 0
endif
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope HeroVictory
//----------------------------------------------------------------
function GetHeroVictoryAnimation takes integer unitType returns string
if(unitType == LIGHT_BRINGER_ID) then
return "victory"
elseif(unitType == ARCANE_WIZARD_ID) then
return "victory"
elseif(unitType == KING_TEMPEST_ID) then
return "morph, alternate"
elseif(unitType == PYROMANCER_ID) then
return "spell, channel"
elseif(unitType == ARCHSLAYER_ID) then
return "victory"
elseif(unitType == SPIRIT_CALLER_ID) then
return "spell"
elseif(unitType == GRANDTAUR_ID) then
return "victory"
elseif(unitType == OCCULT_SAGE_ID) then
return "victory"
elseif(unitType == DEATH_LEGION_ID) then
return "spell"
elseif(unitType == SKELETON_WITCH_ID) then
return "channel"
elseif(unitType == MORTAL_PREDATOR_ID) then
return "third"
elseif(unitType == SWARM_TITAN_ID) then
return "spell, throw"
elseif(unitType == GUARDIAN_NATURE_ID) then
return "victory"
elseif(unitType == CELESTIAL_PRINCESS_ID) then
return "spell"
elseif(unitType == DEMON_HALF_ID) then
return "spell"
elseif(unitType == SHADOW_ASSASSIN_ID) then
return "spell, slam"
elseif(unitType == DAMNED_AMOK_ID) then
return "stand, victory"
elseif(unitType == LONE_RANGER_ID) then
return "stand, victory"
elseif(unitType == BRUTE_LORD_ID) then
return "spell"
elseif(unitType == SORCERESS_ID) then
return "victory"
elseif(unitType == BLACK_ARCHER_ID) then
return "spell"
elseif(unitType == SKY_WANDERER_ID) then
return "spell"
elseif(unitType == BEAST_HUNTER_ID) then
return "slam"
elseif(unitType == SNAKE_WIDOW_ID) then
return "spell"
elseif(unitType == FIRST_CONJURER_ID) then
return "spell"
elseif(unitType == VOLCANIC_CORE_ID) then
return "channel"
else
return ""
endif
endfunction
endscope
//TESH.scrollpos=95
//TESH.alwaysfold=0
scope HeroSetup
//----------------------------------------------------------------
function HeroesSetup takes unit enum returns nothing
local integer enumID = GetUnitUserData(enum)
local player owner = GetOwningPlayer(enum)
local integer enumType = GetUnitTypeId(enum)
call SaveSoundHandle(Heroes_Ht, enumID, HERO_SOUND_KEY, null)
call SaveBoolean(Heroes_Ht, enumID, HERO_UPGRADE_ULTIMATE_KEY, false)
call SaveInteger(Heroes_Ht, enumID, HERO_MAGIC_DAMAGE_KEY, 0)
if(enumType == LIGHT_BRINGER_ID) then
call EnableTrigger(HolyLightTrg)
call EnableTrigger(HolyLightStopTrg)
call EnableTrigger(UnityBlessLearnTrg)
call EnableTrigger(AngelFlashTrg)
call EnableTrigger(GraceTrg)
call EnableTrigger(GraceCastTrg)
call EnableTrigger(DivineInterventionTrg)
elseif(enumType == ARCANE_WIZARD_ID) then
call EnableTrigger(ArcaneFallTrg)
call EnableTrigger(ArcaneFallStopTrg)
call EnableTrigger(EnergyRefluxTrg)
call EnableTrigger(EnergyRefluxLearnTrg)
call EnableTrigger(ImpotentTrg)
call EnableTrigger(EsotericFormTrg)
call EnableTrigger(EsotericFormAttackTrg)
call EnableTrigger(ForceNovaTrg)
call EnableTrigger(ForceNovaStopTrg)
elseif(enumType == KING_TEMPEST_ID) then
call EnableTrigger(StormHammerTrg)
call EnableTrigger(StormHammerJumpTrg)
call EnableTrigger(ThunderSmackTrg)
call EnableTrigger(BashAttackTrg)
call EnableTrigger(BashLearnTrg)
call EnableTrigger(LightningChargeTrg)
call EnableTrigger(AvatarWrathTrg)
elseif(enumType == PYROMANCER_ID) then
call EnableTrigger(FireBlastTrg)
call EnableTrigger(FireBlastLaunchTrg)
call EnableTrigger(IncinerateTrg)
call EnableTrigger(BloodEruptionTrg)
call EnableTrigger(BloodMeteorTrg)
call EnableTrigger(BurningOrbsTrg)
call EnableTrigger(BurningOrbsAttackTrg)
call EnableTrigger(ApocalypseTrg)
call EnableTrigger(ApocalypseStopTrg)
elseif(enumType == ARCHSLAYER_ID) then
call EnableTrigger(TorridStingTrg)
call EnableTrigger(SupremeTrg)
call EnableTrigger(FatalStrikeAttackTrg)
call EnableTrigger(FatalStrikeLearnTrg)
call EnableTrigger(ZealousTrg)
call EnableTrigger(ZealousStopTrg)
call EnableTrigger(WhirlingBladeTrg)
elseif(enumType == SPIRIT_CALLER_ID) then
call EnableTrigger(EarthTrembleTrg)
call EnableTrigger(TrackingSenseTrg)
call EnableTrigger(FireWallTrg)
call EnableTrigger(FireWallLearnTrg)
call EnableTrigger(FireWallAttackTrg)
call EnableTrigger(StormCalledTrg)
elseif(enumType == GRANDTAUR_ID) then
call EnableTrigger(PulverizeTrg)
call EnableTrigger(PulverizeStopTrg)
call EnableTrigger(EnduranceTrg)
call EnableTrigger(EnduranceStopTrg)
call EnableTrigger(VigorousAttackTrg)
call EnableTrigger(VigorousAttackLearnTrg)
call EnableTrigger(CrushingTrg)
call EnableTrigger(CrushingLearnTrg)
call EnableTrigger(TerraShockTrg)
elseif(enumType == OCCULT_SAGE_ID) then
call EnableTrigger(MysticWaveTrg)
call EnableTrigger(MysticWaveDieTrg)
call EnableTrigger(PalmFlipTrg)
call EnableTrigger(HexLearnTrg)
call EnableTrigger(TormentWardTrg)
call EnableTrigger(TormentWardDieTrg)
call EnableTrigger(TormentWardAttackTrg)
call EnableTrigger(VoodooTrg)
call EnableTrigger(VoodooStopTrg)
elseif(enumType == DEATH_LEGION_ID) then
call EnableTrigger(NecroDrawTrg)
call EnableTrigger(RisingDeadTrg)
call EnableTrigger(RisingDeadDieTrg)
call EnableTrigger(RisingDeadAttackTrg)
call EnableTrigger(SwordAbyssTrg)
call EnableTrigger(DeathPathTrg)
call EnableTrigger(EvilPactTrg)
call EnableTrigger(EvilPactStopTrg)
elseif(enumType == SKELETON_WITCH_ID) then
call EnableTrigger(FrostShattersTrg)
call EnableTrigger(FrostShattersAttackTrg)
call EnableTrigger(EssenceDrainTrg)
call EnableTrigger(EssenceDrainStopTrg)
call EnableTrigger(WickedPresenceLearnTrg)
call EnableTrigger(DarkVeilTrg)
call EnableTrigger(AtropyRitualTrg)
call EnableTrigger(AtropyRitualKillTrg)
elseif(enumType == MORTAL_PREDATOR_ID) then
call EnableTrigger(ClawAssaultTrg)
call EnableTrigger(IsolationTrg)
call EnableTrigger(IsolationIlluTrg)
call EnableTrigger(IsolationKillTrg)
call EnableTrigger(IsolationKillTrg2)
call EnableTrigger(ImmortalTrg)
call EnableTrigger(SoulPrisonTrg)
call EnableTrigger(FingerDreadTrg)
elseif(enumType == SWARM_TITAN_ID) then
call EnableTrigger(MassImpaleTrg)
call EnableTrigger(SpikingCarapaceTrg)
call EnableTrigger(SpawnDeceasedTrg)
call EnableTrigger(SpawnDeceasedAttackTrg)
call EnableTrigger(SpawnDeceasedKillTrg)
call EnableTrigger(SpawnDeceasedLearnTrg)
call EnableTrigger(SpawnDeceasedTimeTrg)
call EnableTrigger(LocustsAttackTrg)
call EnableTrigger(GroundBreakerTrg)
call EnableTrigger(GroundBreakerAttackTrg)
elseif(enumType == GUARDIAN_NATURE_ID) then
call EnableTrigger(VinesRootTrg)
call EnableTrigger(PollensDisperseTrg)
call EnableTrigger(PollensDisperseStopTrg)
call EnableTrigger(RazorLeavesTrg)
call EnableTrigger(BlendNatureLearnTrg)
call EnableTrigger(BlendNatureAttackedTrg)
call EnableTrigger(ForestArisenTrg)
elseif(enumType == CELESTIAL_PRINCESS_ID) then
call EnableTrigger(MultishotsTrg)
call EnableTrigger(MultishotsLearnTrg)
call EnableTrigger(TigerLeapTrg)
call EnableTrigger(LucentArrowTrg)
call EnableTrigger(LucentArrowLearnTrg)
call EnableTrigger(WatcherTrg)
call EnableTrigger(HeavensTwilightTrg)
elseif(enumType == DEMON_HALF_ID) then
call EnableTrigger(VorpalSlashTrg)
call EnableTrigger(VorpalSlashStopTrg)
call EnableTrigger(SwiftBladeTrg)
call EnableTrigger(InfiniteCrossTrg)
call EnableTrigger(InfiniteCrossLearnTrg)
call EnableTrigger(VoidImpulseTrg)
call EnableTrigger(VengeanceTrg)
call EnableTrigger(VengeanceStopTrg)
call EnableTrigger(VengeanceCancelTrg)
call EnableTrigger(VengeanceAttackTrg)
elseif(enumType == SHADOW_ASSASSIN_ID) then
call EnableTrigger(PhantomKnivesTrg)
call EnableTrigger(PhantomKnivesStopTrg)
call EnableTrigger(BlinkTrg)
call EnableTrigger(BlinkLearnTrg)
call EnableTrigger(PoisonGlaiveTrg)
call EnableTrigger(ShadowStabTrg)
call EnableTrigger(ShadowStabAttackTrg)
call EnableTrigger(ShadowStabLearnTrg)
call EnableTrigger(ShadeShiftTrg)
call EnableTrigger(ShadeShiftAttackTrg)
elseif(enumType == DAMNED_AMOK_ID) then
call EnableTrigger(BerserkTrg)
call EnableTrigger(MadnessTrg)
call EnableTrigger(EnrageLearnTrg)
call EnableTrigger(InfernalTrg)
call EnableTrigger(InfernalLearnTrg)
call EnableTrigger(OverkillTrg)
elseif(enumType == LONE_RANGER_ID) then
call EnableTrigger(SkyVolleyTrg)
call EnableTrigger(SkyVolleyStopTrg)
call EnableTrigger(StrideTrg)
call EnableTrigger(StrideStopTrg)
call EnableTrigger(MarksmanshipTrg)
call EnableTrigger(MarksmanshipLearnTrg)
call EnableTrigger(WingmateTrg)
call EnableTrigger(WingmateLearnTrg)
call EnableTrigger(WingmateGuardTrg)
call EnableTrigger(UltraboltTrg)
elseif(enumType == BRUTE_LORD_ID) then
call EnableTrigger(CrippleGrazeTrg)
call EnableTrigger(CrippleGrazeStopTrg)
call EnableTrigger(CrippleGrazeTrg)
call EnableTrigger(CrippleGrazeStopTrg)
call EnableTrigger(FeralWolvesTrg)
call EnableTrigger(FeralWolvesLearnTrg)
call EnableTrigger(FeralWolvesDieTrg)
call EnableTrigger(FeralWolvesDieTrg2)
call EnableTrigger(FeralWolvesAttackTrg)
call EnableTrigger(FeralWolvesAttackTrg2)
call EnableTrigger(FeralWolvesFollowTrg)
call EnableTrigger(FerociousMaulTrg)
call EnableTrigger(FerociousMaulLearnTrg)
call EnableTrigger(HowlTrg)
call EnableTrigger(HowlStopTrg)
call EnableTrigger(FrenzyTrg)
elseif(enumType == SORCERESS_ID) then
call EnableTrigger(TidalWaveTrg)
call EnableTrigger(PortalLearnTrg)
call EnableTrigger(PortalFirstTrg)
call EnableTrigger(PortalSecondTrg)
call EnableTrigger(PortalTrainTrg)
call EnableTrigger(AquashieldTrg)
call EnableTrigger(AdaptationTrg)
call EnableTrigger(WaterRemnantTrg)
elseif(enumType == BLACK_ARCHER_ID) then
call EnableTrigger(HauntTrg)
call EnableTrigger(GhostringTrg)
call EnableTrigger(ApparitionsTrg)
call EnableTrigger(ApparitionsCastTrg)
call EnableTrigger(WraithTrg)
call EnableTrigger(WraithAttackTrg)
call EnableTrigger(WraithJumpTrg)
call EnableTrigger(WraithLearnTrg)
elseif(enumType == SKY_WANDERER_ID) then
call EnableTrigger(GushTrg)
call EnableTrigger(GushStopTrg)
call EnableTrigger(WhirlblowTrg)
call EnableTrigger(WindEludeTrg)
call EnableTrigger(WindEludeLearnTrg)
call EnableTrigger(TurbineTrg)
call EnableTrigger(ColossalCycloneTrg)
elseif(enumType == BEAST_HUNTER_ID) then
call EnableTrigger(BeastUnleashedTrg)
call EnableTrigger(BeastUnleashedAttackTrg)
call EnableTrigger(SavageChargeTrg)
call EnableTrigger(SavageChargeCastTrg)
call EnableTrigger(BreakingAxeTrg)
call EnableTrigger(BreakingAxeLearnTrg)
call EnableTrigger(StampedeTrg)
call EnableTrigger(BattleRoarTrg)
elseif(enumType == SNAKE_WIDOW_ID) then
call EnableTrigger(ConstrictionsTrg)
call EnableTrigger(FanFangsTrg)
call EnableTrigger(GlideTrg)
call EnableTrigger(ReplenishTrg)
call EnableTrigger(ParalyzingGazeTrg)
elseif(enumType == FIRST_CONJURER_ID) then
call EnableTrigger(ConjuringImageTrg)
call EnableTrigger(ConjuringImageDieTrg)
call EnableTrigger(ConjuringImageLearnTrg)
call EnableTrigger(ConjuringImageCastTrg)
call EnableTrigger(DisappearanceTrg)
call EnableTrigger(JuxtaposeTrg)
call EnableTrigger(JuxtaposeStopTrg)
call EnableTrigger(GatesDeceptionTrg)
call EnableTrigger(GatesDeceptionOrderTrg)
elseif(enumType == VOLCANIC_CORE_ID) then
call EnableTrigger(StarRuptureTrg)
call EnableTrigger(StarRuptureCastTrg)
call EnableTrigger(LavaBirthTrg)
call EnableTrigger(LavaBirthLearnTrg)
call EnableTrigger(LavaBirthAttackTrg)
call EnableTrigger(ConsumeWarmthTrg)
call EnableTrigger(MoltenFlowTrg)
call EnableTrigger(MoltenFlowCastTrg)
call EnableTrigger(VolcanicEruptionTrg)
call EnableTrigger(VolcanicEruptionCastTrg)
call EnableTrigger(VolcanicEruptionLearnTrg)
else
endif
set enum = null
set owner = null
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope HeroRectify
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer ABILITY_ID = 'A0BB' //Ability Skill Rectify rawcode
private constant integer ABILITY1_ID = 'Amgl' //Ability 1st Skill Rectify rawcode
private constant integer ABILITY2_ID = 'Amgr' //Ability 2nd Skill Rectify rawcode
private constant integer ABILITY3_ID = 'A0B8' //Ability 3rd Skill Rectify rawcode
private constant integer ABILITY4_ID = 'A0B9' //Ability 4th Skill Rectify rawcode
private constant integer ABILITY5_ID = 'A0BA' //Ability 5th Skill Rectify rawcode
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
//----------------------------------------------------------------
function AddItemRectify takes unit u, integer unitType returns nothing
local integer index = GetHeroIndexByType(unitType)
call UnitAddAbility(u, ABILITY_ID)
if(index >= 0) then
call SetUnitAbilityLevel(u, ABILITY1_ID, index+1)
call SetUnitAbilityLevel(u, ABILITY2_ID, index+1)
call SetUnitAbilityLevel(u, ABILITY3_ID, index+1)
call SetUnitAbilityLevel(u, ABILITY4_ID, index+1)
call SetUnitAbilityLevel(u, ABILITY5_ID, index+1)
endif
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope Assist initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer BOUNTY_ASSIST = 50 //Bounty assist
private constant real ASSIST_TIME = 30.0 //Assist time
private constant string ASSIST_MESSAGE = "-Assist- " //Assist message
endglobals
//Interval
private function Interval takes nothing returns real
return 1.0
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
//----------------------------------------------------------------
struct Assist_Data
player o //Owner of assister
unit t //Target damaged
real r //Time asist remain
real d //Damage given
boolean s //Sound
endstruct
//----------------------------------------------------------------
globals
private Assist_Data array Ar[100]
private integer Total
private timer Tim
private group copy
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Assist_Data ad
local integer i = 0
loop
exitwhen(i >= Total)
set ad = Ar[i]
if(ad.r > 0) then
set ad.r = ad.r - Interval()
else
set ad.o = null
set ad.t = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call ad.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
function Find_Assist takes unit dying returns integer
local Assist_Data ad
local integer i = 0
local player ownerKiller = null
local real damage = 0.0
local integer num = 0
set i = 0
loop
exitwhen(i >= Total)
set ad = Ar[i]
if(IsUnitEnemy(dying, ad.o) and dying == ad.t) then
if(ownerKiller == null) then
set ownerKiller = ad.o
set damage = ad.d
else
if(damage < ad.d) then
set ownerKiller = ad.o
set damage = ad.d
endif
endif
endif
set i = i + 1
endloop
if(ownerKiller != null) then
set num = GetPlayerId(ownerKiller)
set ownerKiller = null
set dying = null
return num
else
set ownerKiller = null
set dying = null
return -1
endif
endfunction
//----------------------------------------------------------------
function Register_Assist takes unit attacker, unit attacked, real amount returns nothing
local Assist_Data ad
local player ownerAttacker = GetOwningPlayer(attacker)
local integer ownerAttackerId = GetPlayerId(ownerAttacker)
local integer i = 0
local boolean exist = false
if(ownerAttackerId < 8) then
set exist = false
loop
exitwhen(i >= Total)
set ad = Ar[i]
if(GetOwningPlayer(attacker) == ad.o and attacked == ad.t) then
set exist = true
set ad.r = ASSIST_TIME
set i = Total
endif
set i = i + 1
endloop
if(not exist) then
set ad = Assist_Data.create()
set ad.o = GetOwningPlayer(attacker)
set ad.t = attacked
set ad.r = ASSIST_TIME
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = ad
endif
endif
set ownerAttacker = null
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
function Assisted takes unit dying, unit killer, integer gold returns nothing
local Assist_Data ad
local integer i = 0
local player p = GetOwningPlayer(killer)
local integer id = 0
local multiboarditem mbItem = null
local integer position = 0
local integer as = 0
local integer idTeam = 0
local integer positionTeam = 0
local integer asTeam = 0
local boolean has = false
local string names = ""
local integer bounty = 0
local unit f = null
set has = false
set names = ""
set bounty = gold + BOUNTY_ASSIST
set i = 0
loop
exitwhen(i >= Total)
set ad = Ar[i]
if(IsPlayerAlly(ad.o, p) and dying == ad.t) then
if(ad.o != p) then
if(has) then
set names = names + ", "
endif
set has = true
set id = GetPlayerId(ad.o)
set position = LoadInteger(Info_Ht, id, MULTIBOARD_ROW_KEY)
set mbItem = MultiboardGetItem(MultiB, position, MULTIBOARD_PLAYER_ASSIST)
set as = LoadInteger(Info_Ht, id, ASSIST_NUMBER_KEY)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_ASSIST_COLOR_CODE+I2S(as + 1)+"|r")
call SaveInteger(Info_Ht, id, ASSIST_NUMBER_KEY, as + 1)
call SetPlayerState(ad.o, PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(ad.o, PLAYER_STATE_RESOURCE_GOLD) + bounty)
if(IsPlayerInForce(ad.o, Players_Luminous)) then
set idTeam = 13
elseif(IsPlayerInForce(ad.o, Players_Overcast)) then
set idTeam = 14
endif
set positionTeam = LoadInteger(Info_Ht, idTeam, MULTIBOARD_ROW_KEY)
set mbItem = MultiboardGetItem(MultiB, positionTeam, MULTIBOARD_PLAYER_ASSIST)
set asTeam = LoadInteger(Info_Ht, idTeam, ASSIST_NUMBER_KEY)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_ASSIST_COLOR_CODE+I2S(asTeam + 1)+"|r")
call SaveInteger(Info_Ht, idTeam, ASSIST_NUMBER_KEY, asTeam + 1)
set copy = CopyGroup(Heroes)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == ad.o) then
call TextTag_AttachUnit("+" + I2S(bounty), 13.0 * 0.023 / 10.0, f, 30.0, /*
*/255, 255, 0, R2I(100.0 * 255.0 * 0.01), /*
*/0.01, 0.01,/*
*/false, 2.00, 1.0)
endif
endloop
set names = names + Player_Name[GetPlayerId(ad.o)]
endif
set ad.r = 0.0
endif
set i = i + 1
endloop
if(has) then
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, ASSIST_MESSAGE + names)
endif
endif
set i = i + 1
endloop
endif
set dying = null
set killer = null
set p = null
set mbItem = null
set names = null
set f = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//setting globals
set Total = 0
set Tim = CreateTimer()
set copy = CreateGroup()
endfunction
endscope
//TESH.scrollpos=213
//TESH.alwaysfold=0
globals
integer array Revive_Time[8]
endglobals
scope HeroKill initializer Init
//----------------------------------------------------------------
globals
private constant integer MIN_SPAWN_TIME = 15 //Minimum spawn time
private constant integer MIN_SPAWN_FACTOR = 5 //Minimun spawn factor
private constant integer MAX_SPAWN_TIME = 60 //Maximum spawn time
private constant real TIME_START = 30.0 //Time taken for multiple kill
private constant string KILL_EFFECT = "Abilities\\Spells\\Other\\Levelup\\LevelupCaster.mdl" //Effect kill
private constant integer KILL_EXP = 50 //Kill gain exp
private constant real DISTANCE_EXP_SHARE = 1000 //Distance exp share to ally
private constant string KILL_TIPS = " -Kills- " //Message kill tips
private constant string BOUNTY_KILL_TIPS = " |cffffff00+$" //Bounty kill tips
private constant string REVENGE_MESSAGE = " -Revenge- |cffffff00+$50|r." //Revenge message
private constant string FIRST_BLOOD_MESSAGE = " -First Blood- |cffffff00+$100|r." //First blood message
private constant string KILL_TEAMMATE_MESSAGE = " -Team Kills-, " //Kill friend message
private constant string SUICIDE_MESSAGE = " -Has Suicide-." //Suicide message
private constant string NEUTRAL_KILL_MESSAGE = " -Killed By- " //Killed by neutral hostile message
private constant string END = " -Ends- " //Streak end
private constant string STREAK = "!" //Streak
private constant string IS = " *" //Is
private constant integer FIRST_BLOOD_GOLD_AWARD = 100 //First blood bounty
private constant integer REVENGE_GOLD_AWARD = 50 //Revenge gold bounty
private constant integer KILL_GOLD_AWARD = 50 //Kill gold bounty
private constant integer BREAK_STREAK_GOLD_AWARD_FACTOR = 100 //Break streak factor
private constant integer HOSTILE_GOLD_AWARD = 50 //Hostile kill bounty
private constant real MULTIKILL_DELAY = 1.0 //Multikill delay for kills
private constant integer ITEM_ID = 'gold' //Gold item
private constant integer SOUND_VOLUME = 200 //Sound volume
endglobals
//Interval
private function Interval takes nothing returns real
return 1.0
endfunction
//----------------------------------------------------------------
struct HeroKill_Data
unit u //Unit killer
player o //Owner of killer
integer oId //Player number
real t //Time remain
integer k //Amount of kill
real i //Interval play sound
boolean p //Play sound
endstruct
//----------------------------------------------------------------
struct Revive_Data
unit u //Reviving unit
player o //Owner of reviving unit
integer oId //Player number
integer ht //Hero type
integer t //Time left
endstruct
//----------------------------------------------------------------
globals
private trigger HeroKillTrg
private timer Tim
private integer Total
private HeroKill_Data array Ar[8]
private timer Revive_Tim
private integer Revive_Total
private Revive_Data array Revive_Ar[8]
private boolean FirstBlood
private sound array Multikill_Sound[5]
private string array Multikill_Message[5]
private integer array Multikill_Bounty[5]
private integer totalSound
private group copy
private sound array Streakkill_Sound[8]
private string array Streakkill_Message[8]
private integer array Streakkill_Bounty[8]
private integer array Streakend_Bounty[8]
private integer totalStreak
private sound killSound
private rect rct
endglobals
//----------------------------------------------------------------
private function Refresh_Hero takes unit u returns nothing
local integer unitType = GetUnitTypeId( u)
local integer num
set u = null
endfunction
//----------------------------------------------------------------
private function Revive_Actions_Execute takes nothing returns nothing
local Revive_Data rd
local integer i = 0
local integer j = 0
local integer heroNum = 0
local multiboarditem mbItem = null
local integer playerNum = 0
local integer position = 0
local unit boat = null
local real x = 0
local real y = 0
local unit f = null
loop
exitwhen(i >= Revive_Total)
set rd = Revive_Ar[i]
if(rd.t > 0) then
set rd.t = rd.t - R2I(Interval())
set playerNum = GetPlayerId(rd.o)
set position = LoadInteger(Info_Ht, playerNum, MULTIBOARD_ROW_KEY)
set mbItem = MultiboardGetItem(MultiB, position, MULTIBOARD_PLAYER_REVIVE)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_REVIVE_COLOR_CODE + I2S(rd.t) + "|r")
set Revive_Time[rd.oId] = rd.t
else
if(not Cinematic_Start) then
if(IsUnitDead(rd.u)) then
set copy = CopyGroup(Boats)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(rd.o == GetOwningPlayer(f)) then
set boat = f
endif
endloop
if(boat != null) then
set x = GetUnitX(boat)
set y = GetUnitY(boat)
else
set x = GetRectCenterX(gg_rct_Hero_Rune)
set y = GetRectCenterY(gg_rct_Hero_Rune)
endif
call ReviveHero(rd.u, x, y, true)
if(boat != null) then
call IssueTargetOrder(boat, "load", rd.u)
endif
else
set playerNum = GetPlayerId(rd.o)
set position = LoadInteger(Info_Ht, playerNum, MULTIBOARD_ROW_KEY)
set mbItem = MultiboardGetItem(MultiB, position, MULTIBOARD_PLAYER_REVIVE)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_REVIVE_COLOR_CODE + "0|r")
set Revive_Time[rd.oId] = 0
set rd.u = null
set rd.o = null
set Revive_Ar[i] = Revive_Ar[Revive_Total - 1]
set Revive_Total = Revive_Total - 1
call rd.destroy()
set i = i - 1
endif
endif
endif
set i = i + 1
endloop
if Revive_Total == 0 then
call PauseTimer(Revive_Tim)
endif
set mbItem = null
set boat = null
set f = null
endfunction
//----------------------------------------------------------------
private function Revive takes unit hero, integer time returns nothing
local Revive_Data rd = Revive_Data.create()
local player p = GetOwningPlayer(hero)
set rd.u = hero
set rd.o = p
set rd.oId = GetPlayerId(p)
set rd.ht = GetUnitTypeId(rd.u)
set rd.t = time
if(Revive_Total <= 0) then
call TimerStart(Revive_Tim, Interval(), true, function Revive_Actions_Execute)
endif
set Revive_Total = Revive_Total + 1
set Revive_Ar[Revive_Total - 1] = rd
set hero = null
set p = null
endfunction
//----------------------------------------------------------------
private function Buy_Revive_Actions takes nothing returns nothing
local Revive_Data rd
local unit revive = GetTriggerUnit()
local integer i = 0
local integer j = 0
local multiboarditem mbItem = null
local integer playerNum = 0
local integer position = 0
local unit boat = null
local real x = 0
local real y = 0
local unit f = null
local player p = null
loop
exitwhen(i >= Revive_Total)
set rd = Revive_Ar[i]
if(rd.u == revive) then
set copy = CopyGroup(Boats)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(rd.o == GetOwningPlayer(f)) then
set boat = f
endif
endloop
if(boat != null) then
set x = GetUnitX(boat)
set y = GetUnitY(boat)
else
set x = GetRectCenterX(gg_rct_Hero_Rune)
set y = GetRectCenterY(gg_rct_Hero_Rune)
endif
call SetUnitPosition(rd.u, x, y)
call SetUnitState(rd.u, UNIT_STATE_LIFE, GetUnitState(rd.u, UNIT_STATE_MAX_LIFE))
call SetUnitState(rd.u, UNIT_STATE_MANA, GetUnitState(rd.u, UNIT_STATE_MAX_MANA))
set playerNum = GetPlayerId(rd.o)
set position = LoadInteger(Info_Ht, playerNum, MULTIBOARD_ROW_KEY)
set mbItem = MultiboardGetItem(MultiB, position, MULTIBOARD_PLAYER_REVIVE)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_REVIVE_COLOR_CODE + "0|r")
set Revive_Time[rd.oId] = 0
if(GetLocalPlayer() == rd.o) then
call PanCameraToTimed(x, y, 1.0)
endif
if(GetLocalPlayer() == rd.o) then
call ClearSelection()
call SelectUnit(rd.u, true)
endif
call Refresh_Hero(rd.u)
set rd.u = null
set rd.o = null
set Revive_Ar[i] = Revive_Ar[Revive_Total - 1]
set Revive_Total = Revive_Total - 1
call rd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
set revive = null
set mbItem = null
set boat = null
set f = null
set p = null
endfunction
//----------------------------------------------------------------
private function Buy_Revive_Conditions takes nothing returns boolean
local Revive_Data rd
local integer i = 0
local boolean exist = false
loop
exitwhen(i >= Revive_Total)
set rd = Revive_Ar[i]
if(rd.u == GetTriggerUnit()) then
set exist = true
set i = Revive_Total
endif
set i = i + 1
endloop
return exist
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local HeroKill_Data hd
local integer i = 0
local integer j = 0
local player p = null
loop
exitwhen(i >= Total)
set hd = Ar[i]
if(hd.t > 0 and (not IsUnitDead(hd.u))) then
set hd.t = hd.t - Interval()
if(hd.p) then
if(hd.i > 0) then
set hd.i = hd.i - Interval()
else
set hd.p = false
if(hd.k >= 2) then
if(hd.k - 2 < totalSound) then
if(Multikill_Sound[hd.k - 2] != null) then
call StartSound(Multikill_Sound[hd.k - 2])
set j = 0
loop
exitwhen(j >= 8)
set p = Player(j)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, Player_Name[hd.oId] + Multikill_Message[hd.k - 2])
endif
endif
set j = j + 1
endloop
endif
else
if(Multikill_Sound[totalSound - 1] != null) then
call StartSound(Multikill_Sound[totalSound - 1])
set j = 0
loop
exitwhen(j >= 8)
set p = Player(j)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, Player_Name[hd.oId] + Multikill_Message[totalSound - 1])
endif
endif
set j = j + 1
endloop
endif
endif
endif
endif
endif
else
set hd.u = null
set hd.o = null
call hd.destroy()
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set p = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit killer = GetKillingUnit()
local integer killerType = GetUnitTypeId(killer)
local player ownerKiller = GetOwningPlayer(killer)
local integer numOwnerKiller = GetPlayerId(ownerKiller)
local integer numOwnerKillerTeam = -1
local integer killerGold = GetPlayerState(ownerKiller, PLAYER_STATE_RESOURCE_GOLD)
local integer totalKillerGold = 0
local integer killerKill = LoadInteger(Info_Ht, numOwnerKiller, KILL_NUMBER_KEY) + 1
local integer killerStreak = IMinBJ(LoadInteger(Info_Ht, numOwnerKiller, STREAK_NUMBER_KEY) + 1, totalStreak + 2)
local unit killerRevenge = LoadUnitHandle(Info_Ht, numOwnerKiller, REVENGE_UNIT_KEY)
local integer killerKillTeam = -1
local unit dying = GetDyingUnit()
local real dyingX = GetUnitX(dying)
local real dyingY = GetUnitY(dying)
local player ownerDying = GetOwningPlayer(dying)
local integer numOwnerDying = GetPlayerId(ownerDying)
local integer numOwnerDyingTeam = -1
local integer dyingGold = GetPlayerState(ownerDying, PLAYER_STATE_RESOURCE_GOLD)
local integer totalDyingGold = 0
local integer dyingDie = LoadInteger(Info_Ht, numOwnerDying, DIE_NUMBER_KEY)
local integer dyingKill = LoadInteger(Info_Ht, numOwnerDying, KILL_NUMBER_KEY)
local integer dyingStreak = IMinBJ(LoadInteger(Info_Ht, numOwnerDying, STREAK_NUMBER_KEY), totalStreak + 2)
local integer dyingDieTeam = -1
local sound s = gg_snd_Death
local HeroKill_Data hd
local integer positionKiller = -1
local integer positionKillerTeam = -1
local integer positionDying = -1
local integer positionDyingTeam = -1
local boolean alive = false
local integer i = 0
local integer j = 0
local boolean exist = false
local boolean playSound = false
local multiboarditem mbItem = null
local player p = null
local unit f = null
local real angle = 0.0
local integer spawn = IMinBJ(IMaxBJ(GetHeroLevel(dying)*2 + dyingStreak * 2 + 2 + (dyingKill - dyingDie) * 2, MIN_SPAWN_FACTOR * GameLevel), MAX_SPAWN_TIME)
local boolean enemyKill = false
local player ownerAssister = null
local integer totalAssistGold = 0
local string crypter = ""
local integer count = 0
local integer exp = 0
local integer num = 0
if(numOwnerKiller < 8) then
if(HaveSavedInteger(Info_Ht, numOwnerKiller, MULTIBOARD_ROW_KEY)) then
set positionKiller = LoadInteger(Info_Ht, numOwnerKiller, MULTIBOARD_ROW_KEY)
if(IsPlayerInForce(ownerKiller, Players_Luminous)) then
set numOwnerKillerTeam = 13
elseif(IsPlayerInForce(ownerKiller, Players_Overcast)) then
set numOwnerKillerTeam = 14
endif
set positionKillerTeam = LoadInteger(Info_Ht, numOwnerKillerTeam, MULTIBOARD_ROW_KEY)
set killerKillTeam = LoadInteger(Info_Ht, numOwnerKillerTeam, KILL_NUMBER_KEY)
endif
endif
if(HaveSavedInteger(Info_Ht, numOwnerDying, MULTIBOARD_ROW_KEY)) then
set positionDying = LoadInteger(Info_Ht, numOwnerDying, MULTIBOARD_ROW_KEY)
if(IsPlayerInForce(ownerDying, Players_Luminous)) then
set numOwnerDyingTeam = 13
elseif(IsPlayerInForce(ownerDying, Players_Overcast)) then
set numOwnerDyingTeam = 14
endif
set positionDyingTeam = LoadInteger(Info_Ht, numOwnerDyingTeam, MULTIBOARD_ROW_KEY)
set dyingDieTeam = LoadInteger(Info_Ht, numOwnerDyingTeam, DIE_NUMBER_KEY)
endif
call SetSoundVolume(s, SOUND_VOLUME)
if(GetLocalPlayer() == ownerDying) then
call StartSound(s)
endif
call Revive(dying, spawn)
if(numOwnerDying < 8) then
call SaveInteger(Info_Ht, numOwnerDying, DIE_NUMBER_KEY, dyingDie+1)
set mbItem = MultiboardGetItem(MultiB, positionDying, MULTIBOARD_PLAYER_DEATH)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_DEATH_COLOR_CODE+I2S(dyingDie+1)+"|r")
call SaveInteger(Info_Ht, numOwnerDyingTeam, DIE_NUMBER_KEY, dyingDieTeam+1)
set mbItem = MultiboardGetItem(MultiB, positionDyingTeam, MULTIBOARD_PLAYER_DEATH)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_DEATH_COLOR_CODE+I2S(dyingDieTeam+1)+"|r")
if(ownerKiller == ownerDying) then
set totalDyingGold = 0//totalDyingGold + Streakend_Bounty[dyingStreak] + KILL_GOLD_AWARD
set enemyKill = false
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, Player_Name[numOwnerDying] + SUICIDE_MESSAGE)
endif
endif
set i = i + 1
endloop
elseif(IsPlayerAlly(ownerKiller, ownerDying)) then
set totalDyingGold = 0//totalDyingGold + Streakend_Bounty[dyingStreak] + KILL_GOLD_AWARD
set enemyKill = false
if(ownerKiller != Player(PLAYER_NEUTRAL_PASSIVE)) then
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, Player_Name[numOwnerKiller] + KILL_TEAMMATE_MESSAGE + Player_Name[numOwnerDying] + ".")
endif
endif
set i = i + 1
endloop
else
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, Player_Name[numOwnerKiller] + KILL_TEAMMATE_MESSAGE + Player_Name[numOwnerDying] + ".")
endif
endif
set i = i + 1
endloop
endif
elseif(numOwnerKiller < 8) then
set enemyKill = true
else
set num = Find_Assist(dying)
if(num >= 0) then
set ownerAssister = Player(num)
else
set ownerAssister = null
endif
if(ownerAssister != null) then
set enemyKill = true
set killer = GetHero(ownerAssister)
set killerType = GetUnitTypeId(killer)
set ownerKiller = ownerAssister
set numOwnerKiller = GetPlayerId(ownerKiller)
set numOwnerKillerTeam = -1
set killerGold = GetPlayerState(ownerKiller, PLAYER_STATE_RESOURCE_GOLD)
set totalKillerGold = 0
set killerKill = LoadInteger(Info_Ht, numOwnerKiller, KILL_NUMBER_KEY) + 1
set killerStreak = IMinBJ(LoadInteger(Info_Ht, numOwnerKiller, STREAK_NUMBER_KEY) + 1, totalStreak + 2)
set killerRevenge = LoadUnitHandle(Info_Ht, numOwnerKiller, REVENGE_UNIT_KEY)
set killerKillTeam = -1
if(HaveSavedInteger(Info_Ht, numOwnerKiller, MULTIBOARD_ROW_KEY)) then
set positionKiller = LoadInteger(Info_Ht, numOwnerKiller, MULTIBOARD_ROW_KEY)
if(IsPlayerInForce(ownerKiller, Players_Luminous)) then
set numOwnerKillerTeam = 13
elseif(IsPlayerInForce(ownerKiller, Players_Overcast)) then
set numOwnerKillerTeam = 14
endif
set positionKillerTeam = LoadInteger(Info_Ht, numOwnerKillerTeam, MULTIBOARD_ROW_KEY)
set killerKillTeam = LoadInteger(Info_Ht, numOwnerKillerTeam, KILL_NUMBER_KEY)
endif
else
set enemyKill = false
set totalDyingGold = totalDyingGold + HOSTILE_GOLD_AWARD
if(numOwnerKiller == 8) then
set crypter = Player_Colors[numOwnerKiller]+"West|r"
set rct = gg_rct_Crypt_West
elseif(numOwnerKiller == 9) then
set crypter = Player_Colors[numOwnerKiller]+"North|r"
set rct = gg_rct_Crypt_North
elseif(numOwnerKiller == 10) then
set crypter = Player_Colors[numOwnerKiller]+"East|r"
set rct = gg_rct_Crypt_East
elseif(numOwnerKiller == 11) then
set crypter = Player_Colors[numOwnerKiller]+"South|r"
set rct = gg_rct_Crypt_South
endif
if(numOwnerKiller >= 8 and numOwnerKiller <= 11) then
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, Player_Name[numOwnerDying] + NEUTRAL_KILL_MESSAGE + Player_Name[numOwnerKiller] + "\n|cffffff00-$" + I2S(totalDyingGold) + "|r is at " + crypter + " Crypt.")
endif
endif
set i = i + 1
endloop
if(rct != null) then
call CreateItem(ITEM_ID, GetRectCenterX(rct), GetRectCenterY(rct))
endif
else
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, Player_Name[numOwnerDying] + NEUTRAL_KILL_MESSAGE + Player_Name[numOwnerKiller] + ", |cffffff00-$" + I2S(totalDyingGold) + "|r\n")
endif
endif
set i = i + 1
endloop
endif
set totalKillerGold = totalDyingGold
set angle = (GetUnitFacing(killer) + 180.0) * bj_DEGTORAD
call SetPlayerState(ownerKiller, PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(ownerKiller, PLAYER_STATE_RESOURCE_GOLD) + totalKillerGold)
call TextTag_AttachUnit( "+" + I2S(totalKillerGold), 13.0 * 0.023 / 10.0, killer, 30.0, /*
*/255, 255, 0, 255, /*
*/Cos(90.0 * bj_DEGTORAD) * 64.0 * 0.071 / 128, Sin(90.0 * bj_DEGTORAD) * 64.0 * 0.071 / 128,/*
*/false, 2.00, 1.0)
endif
endif
if(enemyKill) then
call SaveUnitHandle(Info_Ht, numOwnerDying, REVENGE_UNIT_KEY, killer)
call SaveInteger(Info_Ht, numOwnerDying, STREAK_NUMBER_KEY, 0)
call SaveInteger(Info_Ht, numOwnerKiller, KILL_NUMBER_KEY, killerKill)
call SaveInteger(Info_Ht, numOwnerKiller, STREAK_NUMBER_KEY, killerStreak)
set mbItem = MultiboardGetItem(MultiB, positionKiller, MULTIBOARD_PLAYER_KILL)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_KILL_COLOR_CODE+I2S(killerKill)+"|r")
call SaveInteger(Info_Ht, numOwnerKillerTeam, KILL_NUMBER_KEY, killerKillTeam + 1)
set mbItem = MultiboardGetItem(MultiB, positionKillerTeam, MULTIBOARD_PLAYER_KILL)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_KILL_COLOR_CODE+I2S(killerKillTeam + 1)+"|r")
if(IsUnitType(killer, UNIT_TYPE_HERO) and /*
*/not IsUnitType(killer, UNIT_TYPE_SUMMONED)) then
call AddHeroXP(killer, KILL_EXP * GetUnitLevel(dying), false)
set alive = (not IsUnitDead(killer))
if(alive) then
call DestroyEffect(AddSpecialEffectTarget(KILL_EFFECT, killer, "origin"))
endif
else
set count = 0
set copy = CopyGroup(Heroes)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(IsUnitAlly(f, ownerKiller)) then
set count = count + 1
endif
endloop
set exp = R2I(KILL_EXP * GetUnitLevel(dying)/count)
set copy = CopyGroup(Heroes)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == ownerKiller) then
call AddHeroXP(f, exp, false)
call DestroyEffect(AddSpecialEffectTarget(KILL_EFFECT, f, "origin"))
endif
endloop
endif
if(dyingStreak >= 3) then
if(dyingStreak < totalStreak + 3) then
set totalDyingGold = totalDyingGold + Streakend_Bounty[dyingStreak-3]
set totalKillerGold = totalKillerGold + Streakend_Bounty[dyingStreak-3]
set totalAssistGold = totalAssistGold + Streakend_Bounty[dyingStreak-3]
else
set totalDyingGold = totalDyingGold + Streakend_Bounty[totalStreak-1]
set totalKillerGold = totalKillerGold + Streakend_Bounty[totalStreak-1]
set totalAssistGold = totalAssistGold + Streakend_Bounty[totalStreak-1]
endif
endif
if(killerStreak >= 3) then
if(killerStreak < totalStreak + 3) then
set totalKillerGold = totalKillerGold + Streakkill_Bounty[killerStreak-3] + KILL_GOLD_AWARD
else
set totalKillerGold = totalKillerGold + Streakkill_Bounty[totalStreak-1] + KILL_GOLD_AWARD
endif
else
set totalKillerGold = totalKillerGold + KILL_GOLD_AWARD
endif
set exist = false
set i = 0
loop
exitwhen(i >= Total)
set hd = Ar[i]
if(hd.o == ownerKiller) then
set hd.t = TIME_START
if(hd.i > 0 and hd.p) then
if(hd.k >= 2) then
if(hd.k - 2 < totalSound) then
if(Multikill_Sound[hd.k - 2] != null) then
call StartSound(Multikill_Sound[hd.k - 2])
set j = 0
loop
exitwhen(j >= 8)
set p = Player(j)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, Player_Name[numOwnerKiller] + Multikill_Message[hd.k - 2])
endif
endif
set j = j + 1
endloop
endif
else
if(Multikill_Sound[totalSound - 1] != null) then
call StartSound(Multikill_Sound[totalSound - 1])
set j = 0
loop
exitwhen(j >= 8)
set p = Player(j)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, Player_Name[numOwnerKiller]+ Multikill_Message[totalSound - 1])
endif
endif
set j = j + 1
endloop
endif
endif
endif
endif
if(hd.k >= 2) then
if(hd.k - 2 < totalSound and (hd.k - 2 >= 0)) then
set totalKillerGold = totalKillerGold + Multikill_Bounty[hd.k - 2]
else
set totalKillerGold = totalKillerGold + Multikill_Bounty[totalSound - 1]
endif
endif
set hd.k = hd.k + 1
set hd.i = MULTIKILL_DELAY
set hd.p = true
set j = 0
loop
exitwhen(j >= 8)
set p = Player(j)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, /*
*/Player_Name[numOwnerKiller] + KILL_TIPS + Player_Name[numOwnerDying] + BOUNTY_KILL_TIPS + I2S(totalKillerGold) + "|r.")
endif
endif
set j = j + 1
endloop
set exist = true
set i = Total
endif
set i = i + 1
endloop
if(not exist) then
set hd = HeroKill_Data.create()
set hd.u = killer
set hd.o = ownerKiller
set hd.oId = numOwnerKiller
set hd.t = TIME_START
set hd.k = 1
set hd.i = 0
set hd.p = false
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, /*
*/Player_Name[numOwnerKiller] + KILL_TIPS + Player_Name[numOwnerDying] + BOUNTY_KILL_TIPS + I2S(totalKillerGold) + "|r.")
endif
endif
set i = i + 1
endloop
if(not FirstBlood) then
set FirstBlood = true
set totalKillerGold = totalKillerGold + FIRST_BLOOD_GOLD_AWARD
set totalAssistGold = totalAssistGold + FIRST_BLOOD_GOLD_AWARD
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, Player_Name[numOwnerKiller] + FIRST_BLOOD_MESSAGE)
endif
endif
set i = i + 1
endloop
set killSound = gg_snd_FirstBlood
if(gg_snd_FirstBlood != null) then
call StartSound(gg_snd_FirstBlood)
endif
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = hd
endif
if(killerRevenge != null and killerRevenge == dying) then
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, Player_Name[numOwnerKiller] + REVENGE_MESSAGE)
endif
endif
set i = i + 1
endloop
set totalKillerGold = totalKillerGold + REVENGE_GOLD_AWARD
set totalAssistGold = totalAssistGold + REVENGE_GOLD_AWARD
call SaveUnitHandle(Info_Ht, numOwnerKiller, REVENGE_UNIT_KEY, gg_unit_Ogld_0031)
endif
if(killerStreak >= 3) then
call StopSound(killSound, false, false)
if(killerStreak < totalStreak + 3) then
if(Streakkill_Sound[killerStreak-3] != null) then
call StartSound(Streakkill_Sound[killerStreak-3])
set killSound = Streakkill_Sound[killerStreak-3]
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, Player_Name[numOwnerKiller] + IS + Streakkill_Message[killerStreak-3] + "!")
endif
endif
set i = i + 1
endloop
endif
else
if(Streakkill_Sound[totalStreak - 1] != null) then
call StartSound(Streakkill_Sound[totalStreak - 1])
set killSound = Streakkill_Sound[totalStreak - 1]
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, Player_Name[numOwnerKiller] + IS + Streakkill_Message[totalStreak - 1] + "!")
endif
endif
set i = i + 1
endloop
endif
endif
endif
if(dyingStreak >= 3) then
if(dyingStreak < totalStreak + 3) then
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, Player_Name[numOwnerKiller] + END + Player_Name[numOwnerDying] + " " + Streakkill_Message[dyingStreak-3] + STREAK)
endif
endif
set i = i + 1
endloop
else
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, Player_Name[numOwnerKiller] + END + Player_Name[numOwnerDying] + " " + Streakkill_Message[totalStreak-1] + STREAK)
endif
endif
set i = i + 1
endloop
endif
endif
call Assisted(dying, killer, totalAssistGold)
call SetPlayerState(ownerKiller, PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(ownerKiller, PLAYER_STATE_RESOURCE_GOLD) + totalKillerGold)
set angle = (GetUnitFacing(killer) + 180.0) * bj_DEGTORAD
call TextTag_AttachUnit( "+" + I2S(totalKillerGold), 13.0 * 0.023 / 10.0, killer, 30.0, /*
*/255, 255, 0, 255, /*
*/Cos(90.0 * bj_DEGTORAD) * 64.0 * 0.071 / 128, Sin(90.0 * bj_DEGTORAD) * 64.0 * 0.071 / 128,/*
*/false, 2.00, 1.0)
endif
call SetPlayerState(ownerDying, PLAYER_STATE_RESOURCE_GOLD, IMaxBJ(dyingGold - totalDyingGold, 0))
endif
set killer = null
set ownerKiller = null
set killerRevenge = null
set dying = null
set ownerDying = null
set killerRevenge = null
set mbItem = null
set s = null
set p = null
set f = null
set ownerAssister = null
set crypter = null
set rct = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit dying = GetDyingUnit()
local player ownerDying = GetOwningPlayer(dying)
local boolean check = true
local boolean okey = false
if(GetUnitAbilityLevel(dying, 'A06K') > 0 and (not IsUnitInGroup(dying, ImmortalCaster))) then
set check = false
endif
set okey = (IsUnitType(dying, UNIT_TYPE_HERO) == true and /*
*/IsUnitType(dying, UNIT_TYPE_SUMMONED) == false) and /*
*/GetPlayerId(ownerDying) < 8 and /*
*/(not IsUnitIllusion(dying)) and /*
*/(not Cinematic_Start) and /*
*/check
set dying = null
set ownerDying = null
return okey
endfunction
//----------------------------------------------------------------
function Disable_Hero_Kill takes boolean disable returns nothing
if(disable) then
call DisableTrigger(HeroKillTrg)
else
call EnableTrigger(HeroKillTrg)
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger HeroReviveTrg = CreateTrigger()
local integer i = 0
set HeroKillTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(HeroKillTrg, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(HeroKillTrg, Condition(function Conditions))
call TriggerAddAction(HeroKillTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(HeroReviveTrg, EVENT_PLAYER_HERO_REVIVE_FINISH )
call TriggerAddCondition(HeroReviveTrg, Condition(function Buy_Revive_Conditions))
call TriggerAddAction(HeroReviveTrg, function Buy_Revive_Actions)
//setting globals
set Tim = CreateTimer()
set Total = 0
set FirstBlood = false
set Revive_Tim = CreateTimer()
set Revive_Total = 0
set copy = CreateGroup()
set killSound = null
set i = 0
loop
exitwhen(i >= 8)
set Revive_Time[i] = 0
set i = i + 1
endloop
set totalStreak = 8
set Streakkill_Sound[0] = gg_snd_KillingSpree
set Streakkill_Sound[1] = gg_snd_Dominating
set Streakkill_Sound[2] = gg_snd_MegaKill
set Streakkill_Sound[3] = gg_snd_Unstoppable
set Streakkill_Sound[4] = gg_snd_WhickedSick
set Streakkill_Sound[5] = gg_snd_MonsterKill
set Streakkill_Sound[6] = gg_snd_GodLike
set Streakkill_Sound[7] = gg_snd_HolyShit
set Streakkill_Message[0] = "|cff00ff00Killing Spree|r"
set Streakkill_Message[1] = "|cff00ff00Dominating|r"
set Streakkill_Message[2] = "|cff00ffffMega Kill|r"
set Streakkill_Message[3] = "|cff00ffffUnstoppable|r"
set Streakkill_Message[4] = "|cffff00ffWicked Sick|r"
set Streakkill_Message[5] = "|cffff00ffMonster Kill|r"
set Streakkill_Message[6] = "|cffff8000God Like|r"
set Streakkill_Message[7] = "|cffff8000Holy Shit|r"
set Streakkill_Bounty[0] = 50
set Streakkill_Bounty[1] = 50
set Streakkill_Bounty[2] = 100
set Streakkill_Bounty[3] = 100
set Streakkill_Bounty[4] = 150
set Streakkill_Bounty[5] = 200
set Streakkill_Bounty[6] = 300
set Streakkill_Bounty[7] = 400
set Streakend_Bounty[0] = 100
set Streakend_Bounty[1] = 150
set Streakend_Bounty[2] = 200
set Streakend_Bounty[3] = 300
set Streakend_Bounty[4] = 400
set Streakend_Bounty[5] = 600
set Streakend_Bounty[6] = 800
set Streakend_Bounty[7] = 1200
set totalSound = 8
set Multikill_Sound[0] = gg_snd_DoubleKill
set Multikill_Sound[1] = gg_snd_TripleKill
set Multikill_Sound[2] = gg_snd_UltraKill
set Multikill_Sound[3] = gg_snd_Rampage
set Multikill_Sound[4] = gg_snd_Berzerk
set Multikill_Sound[5] = gg_snd_Rage
set Multikill_Sound[6] = gg_snd_LudicrousKill
set Multikill_Sound[7] = gg_snd_Headhunter
set Multikill_Message[0] = " *|cff00ff00Double Kill|r! |cffffff00+$50|r."
set Multikill_Message[1] = " *|cff00ff00Triple Kill|r! |cffffff00+$50|r."
set Multikill_Message[2] = " *|cff00ffffUltra Kill|r! |cffffff00+$100|r."
set Multikill_Message[3] = " *|cff00ffffRampage|r! |cffffff00+$100|r."
set Multikill_Message[4] = " *|cffff00ffBerzerk|r! |cffffff00+$150|r."
set Multikill_Message[5] = " *|cffff00ffRage|r! |cffffff00+$200|r."
set Multikill_Message[6] = " *|cffff8000Ludicrous Kill|r! |cffffff00+$300|r."
set Multikill_Message[7] = " *|cffff8000Head Hunter|r! |cffffff00+$400|r."
set Multikill_Bounty[0] = 50
set Multikill_Bounty[1] = 100
set Multikill_Bounty[2] = 150
set Multikill_Bounty[3] = 200
set Multikill_Bounty[4] = 250
set Multikill_Bounty[5] = 300
set Multikill_Bounty[6] = 350
set Multikill_Bounty[7] = 400
endfunction
endscope
//TESH.scrollpos=19
//TESH.alwaysfold=0
scope GameUpgrade initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SKELETAL_STRENGTH_ID = 'R000'
private constant integer SKELETAL_HARDNESS_ID = 'R001'
private constant integer SKELETAL_LONGETIVITY_ID = 'R002'
private constant integer SKELETAL_SPEED_ID = 'R003'
private constant integer SACRED_FORTIFICATION_ID = 'Rhac'
private constant integer SACRED_EMPOWERMENT_ID = 'Rhlh'
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private group copy
endglobals
//----------------------------------------------------------------
function UpgradeGame takes nothing returns nothing
local integer i = 0
local unit f = null
local player p = null
set i = 0
loop
exitwhen(i >= 16)
set p = Player(i)
call SetPlayerTechResearched(p, SKELETAL_STRENGTH_ID, GameLevel)
call SetPlayerTechResearched(p, SKELETAL_HARDNESS_ID, GameLevel)
call SetPlayerTechResearched(p, SKELETAL_LONGETIVITY_ID, GameLevel)
call SetPlayerTechResearched(p, SKELETAL_SPEED_ID, GameLevel)
call SetPlayerTechResearched(p, SACRED_FORTIFICATION_ID, GameLevel)
call SetPlayerTechResearched(p, SACRED_EMPOWERMENT_ID, GameLevel)
set i = i + 1
endloop
set i = 0
loop
exitwhen(i >= 16)
set p = Player(i)
call SetPlayerState(p, PLAYER_STATE_RESOURCE_FOOD_USED, GameLevel)
set i = i + 1
endloop
endfunction
//----------------------------------------------------------------
function CategorizeGameLevel takes nothing returns integer
if(GameLevel < 4) then
return 1
elseif(GameLevel < 7) then
return 2
elseif(GameLevel < 10) then
return 3
elseif(GameLevel < 13) then
return 4
else
return 5
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local integer i = 0
local player p = null
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
call SetPlayerState(p, PLAYER_STATE_RESOURCE_FOOD_USED, GameLevel)
call SetPlayerState(p, PLAYER_STATE_RESOURCE_FOOD_CAP, MAX_GAME_LEVEL)
set i = i + 1
endloop
set p = null
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
globals
boolean Win_Start = false
boolean Cinematic_Start = false
boolean Pause_Victory = false
integer Win_Side = -1
leaderboard WinLose_Leaderboard
boolean Created_Leaderboard = false
endglobals
scope Victory initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPIRIT_ID = 'nder' //Unit spirit rawcode
private constant integer WARLOCK_ID = 'Uktl' //Unit Warlock rawcode
private constant real TEMPLE_OUTSIDE_LIFE_FACTOR = 0.005 //Life factor when conqueror outside temple
private constant real TEMPLE_OUTSIDE_MANA_FACTOR = 0.005 //Mana factor when conqueror outside temple
private constant real TEMPLE_INSIDE_LIFE_FACTOR = 0.005 //Life factor when conqueror inside temple
private constant real TEMPLE_INSIDE_MANA_FACTOR = 0.005 //Mana factor when conqueror inside temple
private constant string CONQUEROR_HEAL_EFFECT = "war3mapImported\\HealingWater.MDX" //Heal effect
private constant string CONQUEROR_DAMAGE_EFFECT = "war3mapImported\\Warmth.MDX" //Damage effect
private constant integer ABILITY1_ID = 'Aamk' //Ability Attribute Bonus rawcode
private constant integer ABILITY2_ID = 'A04I' //Ability Inanimate Form (Revenant) rawcode
private constant real ATOK_PING_DURATION = 30.0 //Ping atok
private constant real WIN_TIME = 120.0 //Countdown to win
private constant real WIN_TIME_MIN = 30.0 //Minimum win time
private constant real WIN_TIME_CHANGE = 30.0 //Change of each countdown
private constant string WIN_ORDER_TIPS_1 = "The |cff00ff00Relic Revenant|r has been |cffff0000killed|r.\n|cff00ffffConqueror|r must |cffff0000survive|r inside the temple for " //Countdown tips to win part 1
private constant string WIN_ORDER_TIPS_2 = " seconds to achieve |cffffff00victory|r." //Countdown tips to win part 2
private constant string END_MESSAGE = "|cff00ff00Stay|r in the game to find out who is |cffff8000Atok, the Reckoner|r." //End message
private constant string LUMINOUS_MESSAGE_WIN = "|cffefefefLuminous|r is |cffffff00victory|r!!!!\n" //Alliance win message
private constant string OVERCAST_MESSAGE_WIN = "|cffc0c0c0Overcast|r is |cffffff00victory|r!!!\n" //Horde win message
private constant string EFFECT = "Abilities\\Spells\\Human\\MassTeleport\\MassTeleportCaster.mdl" //Heroes and Atok effect
private constant integer SOUND_VOLUME = 200 //Volume of sound and music
endglobals
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Win_Data
real t //Time to win
real wt //Winning time
boolean c //Check condition
real x //Target x
real y //Target y
integer num //Number to cycle Conqueror
integer p //Phase
endstruct
//----------------------------------------------------------------
globals
private Win_Data Winning
private integer countWinning
private timer Tim
private group copy
private effect conquerorEffect
private boolean positionInOut
private integer effectCounter
private boolean tensionOpen
endglobals
//----------------------------------------------------------------
private function Force_Actions takes nothing returns nothing
local player p = GetEnumPlayer()
local real x = GetRectCenterX(gg_rct_Temple_Main_Center)
local real y = GetRectCenterY(gg_rct_Temple_Main_Center)
if(GetLocalPlayer() == p) then
call EnableUserControl(true)
call EnableUserUI(false)
endif
set p = null
endfunction
//----------------------------------------------------------------
private function Win_Actions takes nothing returns nothing
local trigger t = CreateTrigger()
local dialog d = DialogCreate()
local player p = GetEnumPlayer()
if(not IsNoVictoryCheat()) then
call RemovePlayer(p, PLAYER_GAME_RESULT_VICTORY)
set bj_changeLevelShowScores = true
call DialogSetMessage(d, GetLocalizedString("GAMEOVER_VICTORY_MSG"))
call TriggerRegisterDialogButtonEvent(t, DialogAddButton(d, GetLocalizedString("GAMEOVER_QUIT_MISSION"), GetLocalizedHotkey("GAMEOVER_QUIT_MISSION")))
call TriggerAddAction(t, function CustomVictoryQuitBJ)
set bj_lastCreatedFogModifier = CreateFogModifierRect(p, FOG_OF_WAR_VISIBLE, bj_mapInitialPlayableArea, true, false)
call FogModifierStart(bj_lastCreatedFogModifier)
if(GetLocalPlayer() == p) then
call EnableUserControl(true)
call EnableUserUI(false)
endif
call DialogDisplay(p, d, true)
call VolumeGroupSetVolumeForPlayerBJ(p, SOUND_VOLUMEGROUP_UI, 1.0)
call StartSoundForPlayerBJ(p, bj_victoryDialogSound)
endif
set d = null //Is this okey?
set p = null
endfunction
//----------------------------------------------------------------
private function Lose_Actions takes nothing returns nothing
local trigger t = CreateTrigger()
local dialog d = DialogCreate()
local player p = GetEnumPlayer()
local unit f = null
if(not IsNoDefeatCheat()) then
call RemovePlayer(p, PLAYER_GAME_RESULT_DEFEAT)
call DialogSetMessage(d, "You are defeated")
call TriggerRegisterDialogButtonEvent(t, DialogAddButton(d, GetLocalizedString("GAMEOVER_QUIT_MISSION"), GetLocalizedHotkey("GAMEOVER_QUIT_MISSION")))
call TriggerAddAction(t, function CustomDefeatQuitBJ)
if(GetLocalPlayer() == p) then
call EnableUserControl(true)
call EnableUserUI(false)
endif
call DialogDisplay(p, d, true)
call VolumeGroupSetVolumeForPlayerBJ(p, SOUND_VOLUMEGROUP_UI, 1.0)
call StartSoundForPlayerBJ(p, bj_defeatDialogSound)
endif
set d = null
set p = null
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Win_Data wd = Winning
local integer i = 0
local integer j = 0
local string time = "0"
local real state = 0.0
local real maxState = 0.0
local player p = null
local unit f = null
local unit hero = null
local unit boat = null
local real x = 0.0
local real y = 0.0
local boolean exist = false
local sound s = null
if(wd.c) then
if(wd.t > 0 and (not Pause_Victory)) then
if(IsUnitInGroup(Conqueror[0], Unit_Inside_Temple)) then
set wd.t = wd.t - Interval()
endif
set i = 0
loop
exitwhen(i >= totalConqueror)
if(IsUnitDead(Conqueror[i])) then
set wd.c = false
endif
set i = i + 1
endloop
if(not tensionOpen) then
if(wd.t <= 16.0) then
call PlayThematicMusic("Sound\\Music\\mp3Music\\Tension.mp3")
set tensionOpen = true
endif
endif
set time = I2S(R2I(wd.t))
if(Win_Side == 0) then
if(IsUnitInGroup(Conqueror[0], Unit_Inside_Temple)) then
call LeaderboardSetLabel(WinLose_Leaderboard, "Luminous will victory in " + time + " seconds")
else
call LeaderboardSetLabel(WinLose_Leaderboard, "Luminous conqueror must be inside the temple")
endif
set i = 0
loop
exitwhen(i >= totalConqueror)
if(not IsPlayerInForce(GetOwningPlayer(Conqueror[i]), Players_Luminous)) then
set wd.c = false
endif
set i = i + 1
endloop
elseif(Win_Side == 1) then
if(IsUnitInGroup(Conqueror[0], Unit_Inside_Temple)) then
call LeaderboardSetLabel(WinLose_Leaderboard, "Overcast will victory in " + time + " seconds")
else
call LeaderboardSetLabel(WinLose_Leaderboard, "Overcast conqueror must be inside the temple")
endif
set i = 0
loop
exitwhen(i >= totalConqueror)
if(not IsPlayerInForce(GetOwningPlayer(Conqueror[i]), Players_Overcast)) then
set wd.c = false
endif
set i = i + 1
endloop
endif
call LeaderboardResizeBJ(WinLose_Leaderboard)
if(wd.num < totalConqueror - 1) then
set wd.num = wd.num + 1
else
set wd.num = 0
endif
if(effectCounter > 0) then
set effectCounter = effectCounter - 1
else
set effectCounter = 50
if(conquerorEffect != null) then
call DestroyEffect(conquerorEffect)
set conquerorEffect = null
endif
endif
if(Conqueror[0] != Guardian[0]) then
if(IsUnitInForce(Conqueror[0], Players)) then
if(not IsUnitDead(Conqueror[0])) then
if(not IsUnitInGroup(Conqueror[0], Unit_Inside_Temple)) then
set state = GetUnitState(Conqueror[0], UNIT_STATE_LIFE)
set maxState = GetUnitState(Conqueror[0], UNIT_STATE_MAX_LIFE)
call UnitDamageTarget(Guardian[0], Conqueror[0], (maxState * TEMPLE_OUTSIDE_LIFE_FACTOR), true, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_UNIVERSAL, null)
set state = GetUnitState(Conqueror[0], UNIT_STATE_MANA)
set maxState = GetUnitState(Conqueror[0], UNIT_STATE_MAX_MANA)
call SetUnitState(Conqueror[0], UNIT_STATE_MANA, state - (maxState * TEMPLE_OUTSIDE_MANA_FACTOR))
if(positionInOut) then
if(conquerorEffect != null) then
call DestroyEffect(conquerorEffect)
set conquerorEffect = AddSpecialEffectTarget(CONQUEROR_DAMAGE_EFFECT, Conqueror[0], "origin")
else
set conquerorEffect = AddSpecialEffectTarget(CONQUEROR_DAMAGE_EFFECT, Conqueror[0], "origin")
endif
set positionInOut = false
else
if(conquerorEffect == null) then
set conquerorEffect = AddSpecialEffectTarget(CONQUEROR_DAMAGE_EFFECT, Conqueror[0], "origin")
endif
endif
else
set state = GetUnitState(Conqueror[0], UNIT_STATE_LIFE)
set maxState = GetUnitState(Conqueror[0], UNIT_STATE_MAX_LIFE)
call SetUnitState(Conqueror[0], UNIT_STATE_LIFE, state + (maxState * TEMPLE_INSIDE_LIFE_FACTOR))
set state = GetUnitState(Conqueror[0], UNIT_STATE_MANA)
set maxState = GetUnitState(Conqueror[0], UNIT_STATE_MAX_MANA)
call SetUnitState(Conqueror[0], UNIT_STATE_MANA, state + (maxState * TEMPLE_INSIDE_MANA_FACTOR))
if(not positionInOut) then
if(conquerorEffect != null) then
call DestroyEffect(conquerorEffect)
set conquerorEffect = AddSpecialEffectTarget(CONQUEROR_HEAL_EFFECT, Conqueror[0], "origin")
else
set conquerorEffect = AddSpecialEffectTarget(CONQUEROR_HEAL_EFFECT, Conqueror[0], "origin")
endif
set positionInOut = true
else
if(conquerorEffect == null) then
set conquerorEffect = AddSpecialEffectTarget(CONQUEROR_HEAL_EFFECT, Conqueror[0], "origin")
endif
endif
endif
endif
endif
endif
else
set exist = false
if(wd.p != 2) then
set i = 0
loop
exitwhen(i >= totalConqueror)
if(IsUnitDead(Conqueror[i])) then
set exist = true
endif
set i = i + 1
endloop
endif
if(not exist) then
if(wd.p == 0) then
if(conquerorEffect != null) then
call DestroyEffect(conquerorEffect)
set conquerorEffect = null
endif
set positionInOut = false
//call PauseAllUnitsBJ(true)
set GamePhase = GAME_PHASE_END
set Cinematic_Start = true
//call DestroyEffect(AddSpecialEffect(FOUNTAIN_EFFECT, GetUnitX(Fountain), GetUnitY(Fountain)))
//call ShowUnit(Fountain, false)
if(Win_Side == 0) then
call EndThematicMusic()
call PlayThematicMusic("Sound\\Music\\mp3Music\\HeroicVictory.mp3")
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, LUMINOUS_MESSAGE_WIN)
endif
endif
set i = i + 1
endloop
set s = gg_snd_QuestCompleted
if(IsPlayerInForce(GetLocalPlayer(), Players_Luminous)) then
call StartSound(s)
endif
set s = gg_snd_QuestFailed
if(IsPlayerInForce(GetLocalPlayer(), Players_Overcast)) then
call StartSound(s)
endif
elseif(Win_Side == 1) then
call EndThematicMusic()
call PlayThematicMusic("Sound\\Music\\mp3Music\\DarkVictory.mp3")
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce( p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, OVERCAST_MESSAGE_WIN)
endif
endif
set i = i + 1
endloop
set s = gg_snd_QuestCompleted
if(IsPlayerInForce(GetLocalPlayer(), Players_Overcast)) then
call StartSound(s)
endif
set s = gg_snd_QuestFailed
if(IsPlayerInForce(GetLocalPlayer(), Players_Luminous)) then
call StartSound(s)
endif
endif
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, END_MESSAGE)
call StartSoundForPlayerBJ(p, bj_defeatDialogSound)
endif
endif
set i = i + 1
endloop
call PanCameraToTimed(x, y, 2.0)
set copy = CopyGroup(Creature)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
call KillUnit(f)
endloop
set copy = CopyGroup(Boats)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
call IssuePointOrder(f, "unloadall", GetUnitX(f), GetUnitY(f))
//call PauseUnit(f, true)
//call UnitRemoveAbility(f, 'Sch5')
//call SetUnitInvulnerable(f, true)
endloop
set copy = CopyGroup(Wolves)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
call KillUnit(f)
endloop
set copy = CopyGroup(RisingDeadUnit)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
call KillUnit(f)
endloop
set copy = CopyGroup(Lava)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
call KillUnit(f)
endloop
set i = 0
loop
exitwhen(i >= totalGate)
call ModifyGateBJ(bj_GATEOPERATION_CLOSE, Gate[i])
set Gate_Open[i] = false
set spawnAllow[i] = false
set i = i + 1
endloop
set i = 0
loop
exitwhen(i >= 4)
call KillUnit(Conqueror_Indicator[i])
set i = i + 1
endloop
call PauseUnit(Obelisk_Luminous[0], true)
call PauseUnit(Obelisk_Luminous[1], true)
call PauseUnit(Obelisk_Luminous[2], true)
call PauseUnit(Obelisk_Overcast[0], true)
call PauseUnit(Obelisk_Overcast[1], true)
call PauseUnit(Obelisk_Overcast[2], true)
set x = GetUnitX(gg_unit_Ogld_0031)
set y = GetUnitY(gg_unit_Ogld_0031)
if(IsPlayerInForce(GetLocalPlayer(), Players)) then
call PingMinimap(x, y, ATOK_PING_DURATION)
endif
if(Win_Side == 0) then
set i = 0
loop
exitwhen(i >= 4)
set p = Player(i)
if(IsPlayerInForce(p, Players_Luminous)) then
set hero = GetHero(p)
if(hero != null) then
if(IsUnitDead(hero)) then
call ReviveHero(hero, GetRectCenterX(Guard_Region[0]), GetRectCenterY(Guard_Region[0]), false)
endif
call SetUnitState(hero, UNIT_STATE_LIFE, GetUnitState(hero, UNIT_STATE_MAX_LIFE))
call SetUnitState(hero, UNIT_STATE_MANA, GetUnitState(hero, UNIT_STATE_MAX_MANA))
call DestroyEffect(AddSpecialEffect(EFFECT, GetUnitX(hero), GetUnitY(hero)))
call GroupAddUnit(Winner_Heroes, hero)
call ShowUnit(hero, false)
endif
call UnitShareVision(gg_unit_Ogld_0031, p, true)
endif
set i = i + 1
endloop
set i = 4
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players_Overcast)) then
set hero = GetHero(p)
set boat = Boat[GetPlayerId(p)]
if(hero != null) then
call ShowUnit(hero, false)
call PauseUnit(hero, true)
set f = CreateUnit(p, SPIRIT_ID, GetUnitX(hero), GetUnitY(hero), bj_UNIT_FACING)
call DestroyEffect(AddSpecialEffectTarget(EFFECT, f, "origin"))
call GroupAddUnit(Loser_Heroes, f)
if(boat != null) then
call SetUnitX(hero, GetUnitX(boat))
call SetUnitY(hero, GetUnitY(boat))
endif
if(GetLocalPlayer() == p) then
call SelectUnit(f, true)
endif
endif
call UnitShareVision(gg_unit_Ogld_0031, p, true)
endif
set i = i + 1
endloop
set hero = null
set f = null
elseif(Win_Side == 1) then
set i = 4
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players_Overcast)) then
set hero = GetHero(p)
if(hero != null) then
if(IsUnitDead(hero)) then
call ReviveHero(hero, GetRectCenterX(Guard_Region[0]), GetRectCenterY(Guard_Region[0]), false)
endif
call SetUnitState(hero, UNIT_STATE_LIFE, GetUnitState(hero, UNIT_STATE_MAX_LIFE))
call SetUnitState(hero, UNIT_STATE_MANA, GetUnitState(hero, UNIT_STATE_MAX_MANA))
call DestroyEffect(AddSpecialEffect(EFFECT, GetUnitX(hero), GetUnitY(hero)))
call GroupAddUnit(Winner_Heroes, hero)
call ShowUnit(hero, false)
endif
call UnitShareVision(gg_unit_Ogld_0031, p, true)
endif
set i = i + 1
endloop
set i = 0
loop
exitwhen(i >= 4)
set p = Player(i)
if(IsPlayerInForce(p, Players_Luminous)) then
set hero = GetHero(p)
set boat = Boat[GetPlayerId(p)]
if(hero != null) then
call ShowUnit(hero, false)
call PauseUnit(hero, true)
set f = CreateUnit(p, SPIRIT_ID, GetUnitX(hero), GetUnitY(hero), bj_UNIT_FACING)
call DestroyEffect(AddSpecialEffectTarget(EFFECT, f, "origin"))
call GroupAddUnit(Loser_Heroes, f)
if(boat != null) then
call SetUnitX(hero, GetUnitX(boat))
call SetUnitY(hero, GetUnitY(boat))
endif
if(GetLocalPlayer() == p) then
call SelectUnit(f, true)
endif
endif
call UnitShareVision(gg_unit_Ogld_0031, p, true)
endif
set i = i + 1
endloop
set hero = null
set f = null
endif
call TriggerExecute(AIResetTrg)
call DisableTrigger(FreeGoldTrg)
call DisableTrigger(RuneTrg)
call FogEnable(false)
call FogMaskEnable(false)
call LeaderboardDisplay(WinLose_Leaderboard, false)
if(Rune_Top_Left != null) then
call RemoveItem(Rune_Top_Left)
set Rune_Top_Left = null
endif
if(Rune_Top_Right != null) then
call RemoveItem(Rune_Top_Right)
set Rune_Top_Right = null
endif
if(Rune_Bottom_Left != null) then
call RemoveItem(Rune_Bottom_Left)
set Rune_Bottom_Left = null
endif
if(Rune_Bottom_Right != null) then
call RemoveItem(Rune_Bottom_Right)
set Rune_Bottom_Right = null
endif
if(Rune_Top_Left_Corner != null) then
call RemoveItem(Rune_Top_Left_Corner)
set Rune_Top_Left_Corner = null
endif
if(Rune_Top_Right_Corner != null) then
call RemoveItem(Rune_Top_Right_Corner)
set Rune_Top_Right_Corner = null
endif
if(Rune_Bottom_Left_Corner != null) then
call RemoveItem(Rune_Bottom_Left_Corner)
set Rune_Bottom_Left_Corner = null
endif
if(Rune_Bottom_Right_Corner != null) then
call RemoveItem(Rune_Bottom_Right_Corner)
set Rune_Bottom_Right_Corner = null
endif
set PauseWeather = true
set PhenomenonTime = 0.0
set PausePhenomenon = true
set wd.p = 1
set wd.wt = 2.0
elseif(wd.p == 1) then
call EnableTrigger(AtokTrg)
set wd.p = 2
elseif(wd.p == 2) then
if(Atok_End) then
if(Win_Side == 0) then
set i = 4
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players_Overcast)) then
set hero = GetHero(p)
if(hero != null) then
call ShowUnit(hero, false)
call PauseUnit(hero, true)
endif
endif
set i = i + 1
endloop
set hero = null
set f = null
elseif(Win_Side == 1) then
set i = 0
loop
exitwhen(i >= 4)
set p = Player(i)
if(IsPlayerInForce(p, Players_Luminous)) then
set hero = GetHero(p)
if(hero != null) then
call ShowUnit(hero, false)
call PauseUnit(hero, true)
endif
endif
set i = i + 1
endloop
set hero = null
set f = null
endif
call ForForce(Players, function Force_Actions)
if(Win_Side == 0) then
call ForForce(Players_Luminous, function Win_Actions)
call ForForce(Players_Overcast, function Lose_Actions)
elseif(Win_Side == 1) then
call ForForce(Players_Overcast, function Win_Actions)
call ForForce(Players_Luminous, function Lose_Actions)
endif
call LeaderboardDisplay(WinLose_Leaderboard, false)
call wd.destroy()
call PauseTimer(Tim)
set Win_Start = false
endif
endif
else
set wd.c = false
endif
endif
else
call EndThematicMusic()
call LeaderboardDisplay(WinLose_Leaderboard, false)
call wd.destroy()
call PauseTimer(Tim)
set Win_Start = false
if(conquerorEffect != null) then
call DestroyEffect(conquerorEffect)
set conquerorEffect = null
endif
set positionInOut = false
endif
set time = null
set p = null
set f = null
set hero = null
set boat = null
set s = null
endfunction
//----------------------------------------------------------------
function Check_Win takes nothing returns boolean
local Win_Data wd
local player p = null
local player o = null
local integer i = 0
local boolean ally = false
local unit f = null
if(not Win_Start) then
set p = GetOwningPlayer(Conqueror[0])
if(GetPlayerId(p) > 7 or p == Player(PLAYER_NEUTRAL_PASSIVE)) then
set ally = false
else
set ally = true
endif
set i = 1
loop
exitwhen(i >= totalConqueror or not ally)
set o = GetOwningPlayer(Conqueror[i])
if(IsPlayerEnemy(o, p) or o == Player(PLAYER_NEUTRAL_PASSIVE)) then
set ally = false
endif
set i = i + 1
endloop
if(ally) then
call PlayThematicMusic("Sound\\Music\\mp3Music\\Doom.mp3")
call StartSound(gg_snd_Warning)
set wd = Win_Data.create()
if(not Created_Leaderboard) then
set WinLose_Leaderboard = CreateLeaderboard()
call LeaderboardDisplay(WinLose_Leaderboard, true)
set Created_Leaderboard = true
else
call LeaderboardDisplay(WinLose_Leaderboard, true)
endif
set wd.t = RMaxBJ(WIN_TIME - countWinning * WIN_TIME_CHANGE, WIN_TIME_MIN)
set wd.wt = 0.0
set wd.c = true
set wd.x = GetRectCenterX(gg_rct_Temple_Main_Center)
set wd.y = GetRectCenterY(gg_rct_Temple_Main_Center)
set wd.num = 0
set wd.p = 0
set countWinning = countWinning + 1
if(IsPlayerInForce(p, Players_Luminous)) then
set Win_Side = 0
call LeaderboardSetLabel(WinLose_Leaderboard, "Luminous will victory in " + I2S(R2I(wd.t)) + " seconds")
elseif(IsPlayerInForce(p, Players_Overcast)) then
set Win_Side = 1
call LeaderboardSetLabel(WinLose_Leaderboard, "Overcast will victory in " + I2S(R2I(wd.t)) + " seconds")
endif
call LeaderboardSetSizeByItemCount(WinLose_Leaderboard, 4)
set i = 0
loop
exitwhen(i >= bj_MAX_PLAYERS)
set p = Player(i)
call PlayerSetLeaderboard(p, WinLose_Leaderboard)
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, WIN_ORDER_TIPS_1 + I2S(R2I(wd.t)) + WIN_ORDER_TIPS_2)
endif
set i = i + 1
endloop
call TimerStart(Tim, Interval(), true, function Actions_Execute)
set Winning = wd
set Win_Start = true
set tensionOpen = false
if(conquerorEffect != null) then
call DestroyEffect(conquerorEffect)
set conquerorEffect = null
endif
set positionInOut = IsUnitInGroup(Conqueror[0], Unit_Inside_Temple)
endif
endif
set p = null
set o = null
set f = null
return ally
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Setting globals
set countWinning = 0
set conquerorEffect = null
set positionInOut = false
set effectCounter = 0
set Tim = CreateTimer()
set copy = CreateGroup()
endfunction
endscope
//TESH.scrollpos=4
//TESH.alwaysfold=0
globals
group Winner_Heroes = CreateGroup()
group Loser_Heroes = CreateGroup()
unit Atok = null
boolean Atok_End = false
trigger AtokTrg = CreateTrigger()
endglobals
scope Atok initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPIRIT_ID = 'nder' //Unit spirit rawcode
private constant integer WARLOCK_ID = 'Uktl' //Unit Warlock rawcode
private constant integer ABILITY1_ID = 'Aamk' //Ability Attribute Bonus rawcode
private constant integer ABILITY2_ID = 'A04I' //Ability Inanimate Form (Revenant) rawcode
private constant real ATOK_FACING = 90.0 //Atok facing when cinematic
private constant real ATOK_SPELL_INTERVAL = 3.0 //Interval max before next spell
private constant real ATOK_SPELL_RADIUS = 900.0 //Radius to cast spell
private constant real WINNING_CINEMATIC_TIME = 30.0 //Winning cinematic duration
private constant real FINALIZE_TIME = 60.0 //Finalize duraion
private constant string WINNING_EFFECT = "war3mapImported\\EmpyreanSigil.mdx" //Winning effect
private constant integer ATTRIBUTE_BONUS = 1000 //Attribute bonus
private constant string KILL_MESSAGE = "Do your best to |cffff0000defeat|r the |cffff8000Reckoner|r!" //Kill message
private constant string TEXT1 = "|cffff8000Hahaha! CONGRATULATIONS!|r" //Text 1 Atok message
private constant string TEXT2 = "|cffff8000The truth is, the POWER you SEEK is within my HANDS.|r" //Text 2 Atok message
private constant string TEXT3 = "|cffff8000NOW, all the LEFT OF YOU will be joining my RUINS!!!.|r" //Text 2 Atok message
private constant string TEXT_WIN = "|cffff8000NOOO!!! We will meet AGAIN, mortals!!!\nThe power is ALL YOURS|r" //Text 3 Atok message
private constant string TEXT_LOSE = "|cffff8000Hahaha! Welcome to RUINS|r" //Text 4 Atok message
private constant string CONTACT_MESSAGE = "|cffff8000Do not forget|r to leave your comment to me! |cffffff00Hiveworkshop|r > |cff00ff00Revenants of Ruins|r.\nIf you like the map, let me serve you better with |cffff8000your kind donation|r, |cffff8000Paypal|r me at |[email protected]|r" //Text contact
private constant real CONTACT_DELAY = 5.0
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Human\\MassTeleport\\MassTeleportTo.mdl" //Heroes and Atok effect
private constant string FOUNTAIN_EFFECT = "Objects\\Spawnmodels\\Naga\\NagaDeath\\NagaDeath.mdl" //Effect
private constant string EFFECT = "Abilities\\Spells\\Human\\MassTeleport\\MassTeleportCaster.mdl" //Heroes and Atok effect
private constant integer SOUND_VOLUME = 200 //Volume of sound and music
endglobals
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false)
endfunction
//Interval
private function Interval takes nothing returns real
return 1.0
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private integer phase
private real time
private real interval
private real maxInterval
private rect array Victor_Hero_Location[4]
private real Atok_Spell_Interval
private integer Atok_Spell_Max
private integer array Atok_Spell[7]
private integer array Atok_Spell_Type[7]
private string array Atok_Spell_Order[7]
private effect Atok_Effect
private effect Atok_Special_Effect
private boolean Atok_Won
private group copy
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
return Targets(GetFilterUnit())
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local real x = 0.0
local real y = 0.0
local real tX = 0.0
local real tY = 0.0
local real face = 0.0
local player owner = null
local integer random = 0
local unit f = null
local boolean exist = false
local real randomDistance = 0.0
local real randomAngle = 0.0
local integer i = 0
local integer j = 0
local sound s = null
local player p = null
local unit hero = null
if(phase == 0) then
set phase = 1
set time = 2.0
elseif(phase == 1) then
if(time > 0) then
set time = time - Interval()
else
set copy = CopyGroup(Boats)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
call PauseUnit(f, true)
endloop
set x = 0.0
set y = 0.0
call GroupEnumUnitsInRange(all, x, y, 9000.0, null)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if((not IsUnitDead(f)) and IsUnitIllusion(f)) then
call KillUnit(f)
endif
endloop
set i = 0
set copy = CopyGroup(Winner_Heroes)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(IsUnitDead(f)) then
call ReviveHero(f, GetRectCenterX(gg_rct_Temple_Main_Center), GetRectCenterY(gg_rct_Temple_Main_Center), true)
endif
set face = Atan2(GetRectCenterY(gg_rct_Temple_Main_Center) - GetUnitY(f), GetRectCenterX(gg_rct_Temple_Main_Center) - GetUnitX(f)) * bj_RADTODEG
call ShowUnit(f, true)
call PauseUnit(f, true)
call SetUnitInvulnerable(f, true)
call SetUnitFacing(f, face)
call SetUnitPosition(f, GetRectCenterX(Victor_Hero_Location[i]), GetRectCenterY(Victor_Hero_Location[i]))
call DestroyEffect(AddSpecialEffectTarget(EFFECT, f, "origin"))
if(i < 3) then
set i = i + 1
else
set i = 0
endif
endloop
set Atok_Effect = AddSpecialEffectTarget(SPECIAL_EFFECT, gg_unit_Ogld_0031, "origin")
set Atok_Special_Effect = AddSpecialEffect(SPECIAL_EFFECT, GetRectCenterX(gg_rct_Temple_Main_Center), GetRectCenterY(gg_rct_Temple_Main_Center))
set phase = 2
set time = WINNING_CINEMATIC_TIME
call LeaderboardDisplay(WinLose_Leaderboard, true)
call LeaderboardSetLabel(WinLose_Leaderboard, "Cinematic starts in " + I2S(R2I(time)) + " seconds")
endif
elseif(phase == 2) then
if(time > 0) then
set time = time - Interval()
call LeaderboardSetLabel(WinLose_Leaderboard, "Cinematic starts in " + I2S(R2I(time)) + " seconds")
set i = 0
set copy = CopyGroup(Winner_Heroes)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(IsUnitDead(f)) then
call ReviveHero(f, GetRectCenterX(gg_rct_Temple_Main_Center), GetRectCenterY(gg_rct_Temple_Main_Center), true)
endif
set face = Atan2(GetRectCenterY(gg_rct_Temple_Main_Center) - GetUnitY(f), GetRectCenterX(gg_rct_Temple_Main_Center) - GetUnitX(f)) * bj_RADTODEG
call ShowUnit(f, true)
call PauseUnit(f, true)
call SetUnitInvulnerable(f, true)
call SetUnitFacing(f, face)
call SetUnitPosition(f, GetRectCenterX(Victor_Hero_Location[i]), GetRectCenterY(Victor_Hero_Location[i]))
if(i < 3) then
set i = i + 1
else
set i = 0
endif
endloop
else
call LeaderboardDisplay(WinLose_Leaderboard, false)
call ShowUnit(gg_unit_Ogld_0031, false)
call DestroyEffect(Atok_Effect)
call DestroyEffect(Atok_Special_Effect)
set Atok_Effect = null
set Atok_Special_Effect = null
call PanCameraToTimed(x, y, 1.0)
set Atok = CreateUnit(Player(PLAYER_NEUTRAL_AGGRESSIVE), WARLOCK_ID, GetRectCenterX(gg_rct_Temple_Main_Center), GetRectCenterY(gg_rct_Temple_Main_Center), ATOK_FACING)
call DestroyEffect(AddSpecialEffectTarget(EFFECT, Atok, "origin"))
call SetHeroLevel(Atok, GameLevel, false)
call SetUnitInvulnerable(Atok, true)
call GroupAddUnit(Unit_Inside_Temple, Atok)
call SetUnitAbilityLevel(Atok, ABILITY1_ID, IMaxBJ(R2I(GameLevel/3), 1) * IMaxBJ(R2I(Players_Count/2), 1))
call SetUnitAbilityLevel(Atok, Atok_Spell[0], GameLevel/3)
call SetUnitAbilityLevel(Atok, Atok_Spell[1], GameLevel/3)
call SetUnitAbilityLevel(Atok, Atok_Spell[2], GameLevel/5)
call SetUnitAbilityLevel(Atok, Atok_Spell[3], GameLevel/3)
call SetUnitAbilityLevel(Atok, Atok_Spell[4], GameLevel/3)
call SetUnitAbilityLevel(Atok, Atok_Spell[5], GameLevel/3)
call SetUnitAbilityLevel(Atok, Atok_Spell[6], GameLevel/5)
set copy = CopyGroup(Winner_Heroes)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not IsUnitDead(f)) then
set face = Atan2(GetUnitY(Atok) - GetUnitY(f), GetUnitX(Atok) - GetUnitX(f)) * bj_RADTODEG
call SetUnitFacing(f, face)
else
call ReviveHero(f, GetRectCenterX(gg_rct_Temple_Main_Center), GetRectCenterY(gg_rct_Temple_Main_Center), true)
endif
call PauseUnit(f, true)
endloop
call SetUnitFacing(Atok, ATOK_FACING)
set phase = 3
set time = 1.0
endif
elseif(phase == 3) then
if(time > 0.0) then
set time = time - Interval()
else
call TextTag_Center(TEXT1, 10.0 * 0.023 / 10.0, GetUnitX(Atok), GetUnitY(Atok), 90.0, /*
*/255, 255, 255, 255, /*
*/(64.0 * 0.071 / 128) * Cos(90.0 * bj_DEGTORAD), (64.0 * 0.071 / 128) * Sin(90.0 * bj_DEGTORAD), /*
*/false, 3.00, 1.5)
set phase = 4
set time = 4.0
set s = gg_snd_Atok1
call AttachSoundToUnit(s, Atok)
call SetSoundVolume(s, SOUND_VOLUME)
call StartSound(s)
set s = null
endif
elseif(phase == 4) then
if(time > 0.0) then
set time = time - Interval()
else
call TextTag_Center(TEXT2, 10.0 * 0.023 / 10.0, GetUnitX(Atok), GetUnitY(Atok), 90.0, /*
*/255, 255, 255, 255, /*
*/(48.0 * 0.071 / 128) * Cos(90.0 * bj_DEGTORAD), (48.0 * 0.071 / 128) * Sin(90.0 * bj_DEGTORAD), /*
*/false, 5.00, 1.5)
set phase = 5
set time = 6.0
endif
elseif(phase == 5) then
if(time > 0.0) then
set time = time - Interval()
else
call TextTag_Center(TEXT3, 10.0 * 0.023 / 10.0, GetUnitX(Atok), GetUnitY(Atok), 90.0, /*
*/255, 255, 255, 255, /*
*/(32.0 * 0.071 / 128) * Cos(90.0 * bj_DEGTORAD), (32.0 * 0.071 / 128) * Sin(90.0 * bj_DEGTORAD), /*
*/false, 7.00, 4.00)
set phase = 6
set time = 8.0
set s = gg_snd_Atok2
call AttachSoundToUnit(s, Atok)
call SetSoundVolume(s, SOUND_VOLUME)
call StartSound(s)
set s = null
call SetUnitAnimation(Atok, "spell")
call QueueUnitAnimation(Atok, "stand")
set i = 0
loop
exitwhen(i >= totalGate)
call DestructableRestoreLife(Wall[i], GetDestructableMaxLife(Wall[i]), false)
call SetDestructableAnimation(Wall[i], "stand")
set j = 0
loop
exitwhen(j >= 8)
call DestructableRestoreLife(Wall_Part[i][j], GetDestructableMaxLife(Wall_Part[i][j]), false)
set j = j + 1
endloop
set i = i + 1
endloop
endif
elseif(phase == 6) then
if(time > 0.0) then
set time = time - Interval()
else
call StopMusic(true)
call SetMapMusicRandomBJ("Sound\\Music\\mp3Music\\PursuitTheme.mp3")
call PlayMusic("Sound\\Music\\mp3Music\\PursuitTheme.mp3")
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
if(Win_Side == 0) then
if(IsPlayerInForce(p, Players_Luminous)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, KILL_MESSAGE)
endif
endif
elseif(Win_Side == 1) then
if(IsPlayerInForce(p, Players_Overcast)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, KILL_MESSAGE)
endif
endif
endif
call StartSoundForPlayerBJ(p, gg_snd_Warlock_Arrive)
endif
set i = i + 1
endloop
//call EnableTrigger(AtokTrg)
call SetUnitInvulnerable(Atok, false)
//call EndThematicMusic()
//call PlayThematicMusic("Sound\\Music\\mp3Music\\PursuitTheme.mp3")
set copy = CopyGroup(Winner_Heroes)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(IsUnitDead(f)) then
call ReviveHero(f, GetRectCenterX(gg_rct_Temple_Main_Center), GetRectCenterY(gg_rct_Temple_Main_Center), true)
endif
call PauseUnit(f, false)
call SetUnitInvulnerable(f, false)
endloop
set phase = 7
set time = 2.0
endif
elseif(phase == 7) then
if(not IsUnitDead(Atok)) then
if(Atok != null) then
set x = GetUnitX(Atok)
set y = GetUnitY(Atok)
set owner = GetOwningPlayer(Atok)
if(Atok_Spell_Interval > 0.0) then
set Atok_Spell_Interval = Atok_Spell_Interval - 1.0
else
set Atok_Spell_Interval = ATOK_SPELL_INTERVAL
set random = GetRandomInt(0, Atok_Spell_Max - 1)
if(Atok_Spell_Type[random] == 0) then
call IssueImmediateOrder(Atok, Atok_Spell_Order[random])
elseif(Atok_Spell_Type[random] == 1) then
set exist = false
call GroupEnumUnitsInRange(all, x, y, ATOK_SPELL_RADIUS, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, owner) and (not exist)) then
set exist = true
call IssueTargetOrder(Atok, Atok_Spell_Order[random], f)
endif
endloop
elseif(Atok_Spell_Type[random] == 2) then
set exist = false
call GroupEnumUnitsInRange(all, x, y, ATOK_SPELL_RADIUS, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, owner) and (not exist)) then
set exist = true
call IssuePointOrder(Atok, Atok_Spell_Order[random], GetUnitX(f), GetUnitY(f))
endif
endloop
elseif(Atok_Spell_Type[random] == 3) then
if(GetUnitState(Atok, UNIT_STATE_LIFE) < 0.2 * GetUnitState(Atok, UNIT_STATE_MAX_LIFE)) then
call IssuePointOrder(Atok, Atok_Spell_Order[random], GetUnitX(f), GetUnitY(f))
set randomDistance = GetRandomReal(0.0, ATOK_SPELL_RADIUS)
set randomAngle = GetRandomReal(0.0, 360.0) * bj_DEGTORAD
set tX = x + randomDistance * Cos(randomAngle)
set tY = y + randomDistance * Sin(randomAngle)
call IssuePointOrder(Atok, Atok_Spell_Order[random], GetUnitX(f), GetUnitY(f))
else
set exist = false
call GroupEnumUnitsInRange(all, x, y, ATOK_SPELL_RADIUS, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, owner) and (not exist)) then
set exist = true
call IssuePointOrder(Atok, Atok_Spell_Order[random], GetUnitX(f), GetUnitY(f))
endif
endloop
endif
else
endif
endif
if(GetUnitState(Atok, UNIT_STATE_LIFE) < 0.3 * GetUnitState(Atok, UNIT_STATE_MAX_LIFE)) then
call IssueImmediateOrder(Atok, "avatar")
endif
endif
if(interval > 0.0) then
set interval = interval - Interval()
else
set interval = maxInterval
set x = GetRandomReal(GetRectMinX(gg_rct_Temple_High_Center), GetRectMaxX(gg_rct_Temple_High_Center))
set y = GetRandomReal(GetRectMinY(gg_rct_Temple_High_Center), GetRectMaxY(gg_rct_Temple_High_Center))
call IssuePointOrder(Atok, "patrol", x, y)
if(IsUnitInGroup(Atok, Unit_Outside_Temple)) then
call SetUnitPosition(Atok, GetRectCenterX(gg_rct_Temple_Main_Center), GetRectCenterY(gg_rct_Temple_Main_Center))
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, Atok, "origin"))
endif
set exist = false
set copy = CopyGroup(Winner_Heroes)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not IsUnitDead(f)) then
set exist = true
if(IsUnitInGroup(f, Unit_Outside_Temple)) then
call SetUnitPosition(f, GetRectCenterX(gg_rct_Temple_Main_Center), GetRectCenterY(gg_rct_Temple_Main_Center))
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, f, "origin"))
endif
else
if(GetUnitAbilityLevel(GetDyingUnit(), 'A06K') > 0) then
if(not IsUnitInGroup(GetDyingUnit(), ImmortalCaster)) then
else
call GroupRemoveUnit(Winner_Heroes, f)
set hero = CreateUnit(GetOwningPlayer(f), SPIRIT_ID, GetUnitX(f), GetUnitY(f), bj_UNIT_FACING)
set p = GetOwningPlayer(f)
if(GetLocalPlayer() == p) then
call SelectUnit(hero, true)
endif
set hero = null
endif
else
call GroupRemoveUnit(Winner_Heroes, f)
set hero = CreateUnit(GetOwningPlayer(f), SPIRIT_ID, GetUnitX(f), GetUnitY(f), bj_UNIT_FACING)
set p = GetOwningPlayer(f)
if(GetLocalPlayer() == p) then
call SelectUnit(hero, true)
endif
set hero = null
endif
endif
endloop
if(not exist) then
set phase = 8
set time = 5.0
set Atok_Won = true
call TextTag_Center(TEXT_LOSE, 10.0 * 0.023 / 10.0, GetUnitX(Atok), GetUnitY(Atok), 90.0, /*
*/255, 255, 255, 255, /*
*/(64.0 * 0.071 / 128) * Cos(90.0 * bj_DEGTORAD), (64.0 * 0.071 / 128) * Sin(90.0 * bj_DEGTORAD), /*
*/false, 5.00, 1.75)
//call DisableTrigger(AtokTrg)
call SetUnitInvulnerable(Atok, true)
call IssuePointOrder(Atok, "move", 0.0, 0.0)
//call PauseUnit(Atok, true)
call StopMusic(true)
call EndThematicMusic()
call PlayMusic("Sound\\Music\\mp3Music\\TragicConfrontation.mp3")
set s = gg_snd_Atok1
call AttachSoundToUnit(s, Atok)
call SetSoundVolume(s, SOUND_VOLUME)
call StartSound(s)
set s = null
set i = 0
loop
exitwhen(i >= totalGate)
call KillDestructable(Wall[i])
set i = i + 1
endloop
call GroupEnumUnitsInRange(all, 0.0, 0.0, 6000.0, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(GetPlayerId(GetOwningPlayer(f)) > 7 and (not IsUnitType(f, UNIT_TYPE_HERO))) then
call KillUnit(f)
endif
endloop
endif
endif
else
set phase = 10
set time = FINALIZE_TIME
set Atok_Won = false
call TextTag_Center(TEXT_WIN, 10.0 * 0.023 / 10.0, GetUnitX(Atok), GetUnitY(Atok), 90.0, /*
*/255, 255, 255, 255, /*
*/(32.0 * 0.071 / 128) * Cos(90.0 * bj_DEGTORAD), (32.0 * 0.071 / 128) * Sin(90.0 * bj_DEGTORAD), /*
*/false, 8.00, 1.75)
//call DisableTrigger(AtokTrg)
call LeaderboardDisplay(WinLose_Leaderboard, true)
call LeaderboardSetLabel(WinLose_Leaderboard, "Game finalize in " + I2S(R2I(time)) + " seconds")
call StopMusic(true)
call EndThematicMusic()
call PlayMusic("Sound\\Music\\mp3Music\\Credits.mp3")
set copy = CopyGroup(Winner_Heroes)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
//if(IsUnitDead(f)) then
//call ReviveHero(f, GetRandomReal(GetRectMinX(gg_rct_Temple_Main_Center), GetRectMaxX(gg_rct_Temple_Main_Center)), GetRandomReal(GetRectMinY(gg_rct_Temple_Main_Center), GetRectMaxY(gg_rct_Temple_Main_Center)), true)
//endif
call PauseUnit(f, true)
call SetUnitAnimation(f, GetHeroVictoryAnimation(GetUnitTypeId(f)))
call QueueUnitAnimation(f, GetHeroVictoryAnimation(GetUnitTypeId(f)))
call SetHeroStr(f, GetHeroStr(f, true) + ATTRIBUTE_BONUS, true)
call SetHeroAgi(f, GetHeroAgi(f, true) + ATTRIBUTE_BONUS, true)
call SetHeroInt(f, GetHeroInt(f, true) + ATTRIBUTE_BONUS, true)
call AddSpecialEffectTarget(WINNING_EFFECT, f, "origin")
endloop
set i = 0
loop
exitwhen(i >= totalGate)
call KillDestructable(Wall[i])
set i = i + 1
endloop
call GroupEnumUnitsInRange(all, 0.0, 0.0, 6000.0, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(GetPlayerId(GetOwningPlayer(f)) > 7 and (not IsUnitType(f, UNIT_TYPE_HERO))) then
call KillUnit(f)
endif
endloop
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, CONTACT_MESSAGE)
endif
endif
set i = i + 1
endloop
endif
elseif(phase == 8) then
if(time > 0.0) then
set time = time - Interval()
call IssuePointOrder(Atok, "move", 0.0, 0.0)
else
set phase = 9
if(Atok_Won) then
set time = 2.0
call IssueImmediateOrder(Atok, "stop")
call SetUnitAnimation(Atok, "spell")
set i = 0
loop
exitwhen(i >= totalGuardian)
call ReviveHero(Guardian[i], GetRectCenterX(Guard_Region[i]), GetRectCenterY(Guard_Region[i]), true)
call UnitAddAbility(Guardian[i], ABILITY2_ID)
call UnitRemoveAbility(Guardian[i], ABILITY2_ID)
call PauseUnit(Guardian[i], true)
call SetUnitFacing(Guardian[i], Guard_Facing[i])
call SetUnitTimeScale(Guardian[i], 0.0)
call SetUnitVertexColor(Guardian[i], 255, 255, 255, 150)
call SetUnitOwner(Guardian[i], Player(PLAYER_NEUTRAL_PASSIVE), false)
//call UnitAddAbility(Guardian[i], ABILITY3_ID)
set Conqueror_Indicator[i] = null
set Conqueror[i] = Guardian[i]
set i = i + 1
endloop
endif
endif
elseif(phase == 9) then
if(time > 0.0) then
set time = time - Interval()
else
set phase = 10
set time = FINALIZE_TIME
//call PauseUnit(Atok, false)
call SetUnitOwner(Atok, Player(GetRandomInt(8, 11)), true)
call IssuePointOrder(Atok, "move", GetRectCenterX(gg_rct_Warlock), GetRectCenterY(gg_rct_Warlock))
call UnitAddAbility(Atok, 'Arav')
call UnitRemoveAbility(Atok, 'Arav')
call SetUnitPathing(Atok, false)
call LeaderboardDisplay(WinLose_Leaderboard, true)
call LeaderboardSetLabel(WinLose_Leaderboard, "Game finalize in " + I2S(R2I(time)) + " seconds")
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
call DisplayTextToPlayer(p, 0, 0, CONTACT_MESSAGE)
endif
set i = i + 1
endloop
endif
elseif(phase == 10) then
if(time > 0.0) then
set time = time - Interval()
call LeaderboardSetLabel(WinLose_Leaderboard, "Game finalize in " + I2S(R2I(time)) + " seconds")
if(not IsUnitDead(Atok)) then
call IssuePointOrder(Atok, "move", GetRectCenterX(gg_rct_Warlock), GetRectCenterY(gg_rct_Warlock))
endif
if(not Atok_Won) then
set copy = CopyGroup(Winner_Heroes)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not IsUnitDead(f)) then
if(IsUnitInGroup(f, Unit_Outside_Temple)) then
call SetUnitPosition(f, GetRectCenterX(gg_rct_Temple_Main_Center), GetRectCenterY(gg_rct_Temple_Main_Center))
endif
call PauseUnit(f, true)
endif
endloop
endif
else
set phase = 11
set time = CONTACT_DELAY
set Atok_End = true
call ShowUnit(gg_unit_Ogld_0031, true)
call SetUnitAnimation(gg_unit_Ogld_0031, "spell")
if(IsUnitDead(Atok)) then
call DestroyEffect(AddSpecialEffect(EFFECT, GetUnitX(gg_unit_Ogld_0031), GetUnitY(gg_unit_Ogld_0031)))
set i = 0
loop
exitwhen(i >= totalGuardian)
call ReviveHero(Guardian[i], GetRectCenterX(Guard_Region[i]), GetRectCenterY(Guard_Region[i]), true)
call UnitAddAbility(Guardian[i], ABILITY2_ID)
call UnitRemoveAbility(Guardian[i], ABILITY2_ID)
call PauseUnit(Guardian[i], true)
call SetUnitFacing(Guardian[i], Guard_Facing[i])
call SetUnitTimeScale(Guardian[i], 0.0)
call SetUnitVertexColor(Guardian[i], 255, 255, 255, 150)
call SetUnitOwner(Guardian[i], Player(PLAYER_NEUTRAL_PASSIVE), false)
//call UnitAddAbility(Guardian[i], ABILITY3_ID)
set Conqueror_Indicator[i] = null
set Conqueror[i] = Guardian[i]
set i = i + 1
endloop
else
call ShowUnit(Atok, false)
endif
if(not Atok_Won) then
set copy = CopyGroup(Winner_Heroes)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not IsUnitDead(f)) then
call DestroyEffect(AddSpecialEffect(EFFECT, GetUnitX(f), GetUnitY(f)))
call ShowUnit(f, false)
call PauseUnit(f, true)
endif
endloop
endif
endif
elseif(phase == 11) then
call DisableTrigger(AtokTrg)
endif
set owner = null
set f = null
set s = null
set p = null
set hero = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterTimerEventPeriodic(AtokTrg, 1.0)
call TriggerAddAction(AtokTrg, function Actions)
call DisableTrigger(AtokTrg)
//Setting globals
set phase = 0
set time = 0.0
set interval = 0.0
set maxInterval = 5.0
set copy = CreateGroup()
set all = CreateGroup()
set bexpr = Condition(function Pick)
set Victor_Hero_Location[0] = gg_rct_Victor_Hero_1
set Victor_Hero_Location[1] = gg_rct_Victor_Hero_2
set Victor_Hero_Location[2] = gg_rct_Victor_Hero_3
set Victor_Hero_Location[3] = gg_rct_Victor_Hero_4
set Atok = null
set Atok_Spell_Max = 7
set Atok_Spell_Interval = ATOK_SPELL_INTERVAL
set Atok_Effect = null
set Atok_Won = false
set Atok_Spell[0] = 'ANbl'
set Atok_Spell[1] = 'AEmb'
set Atok_Spell[2] = 'AUls'
set Atok_Spell[3] = 'AOsh'
set Atok_Spell[4] = 'ACs9'
set Atok_Spell[5] = 'ACcb'
set Atok_Spell[6] = 'ACcl'
set Atok_Spell_Type[0] = 3
set Atok_Spell_Type[1] = 1
set Atok_Spell_Type[2] = 0
set Atok_Spell_Type[3] = 2
set Atok_Spell_Type[4] = 0
set Atok_Spell_Type[5] = 1
set Atok_Spell_Type[6] = 2
set Atok_Spell_Order[0] = "blink"
set Atok_Spell_Order[1] = "manaburn"
set Atok_Spell_Order[2] = "Locustswarm"
set Atok_Spell_Order[3] = "shockwave"
set Atok_Spell_Order[4] = "spiritwolf"
set Atok_Spell_Order[5] = "thunderbolt"
set Atok_Spell_Order[6] = "chainlightning"
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
globals
integer totalGuardian
unit array Guardian[1]
real array Guard_Facing[1]
rect array Guard_Region[1]
rect array Guard_Area[1]
integer totalConqueror
unit array Conqueror[1]
unit array Conqueror_Indicator[1]
rect array Conqueror_Region[1]
endglobals
scope Revenant initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer UNIT_ID = 'Uwar' //Unit Revenant rawcode
private constant integer UNIT1_ID = 'U000' //Unit Revenant (Inanimate Form) rawcode
private constant integer DUMMY_ID = 'n00D' //Dummy wisp rawcode
private constant integer ABILITY1_ID = 'A04H' //Ability Animate Form (Revenant) rawcode
private constant integer ABILITY2_ID = 'A04I' //Ability Inanimate Form (Revenant) rawcode
private constant integer ABILITY3_ID = 'ACm2' //Ability Spell Immunity (Revenant) rawcode
private constant integer ABILITY4_ID = 'Aamk' //Ability Attribute Bonus (Revenant) rawcode
private constant integer CAST1_ID = 'AUls' //Cast Shadow Requiem (Revenant) rawcode
private constant string CAST1_ORDER = "Locustswarm" //Cast Shadow Requiem (Revenant) order string
private constant integer CAST1_PROBABILITY = 90 //Cast Shadow Requiem (Revenant) probability
private constant integer CAST2_ID = 'AOmi' //Cast Conjure Image (Revenant) rawcode
private constant string CAST2_ORDER = "mirrorimage" //Cast Conjure Image (Revenant) order string
private constant integer CAST2_PROBABILITY = 50 //Cast Conjure Image (Revenant) probability
private constant integer CAST3_ID = 'AEmb' //Cast Mana Burn (Revenant) rawcode
private constant string CAST3_ORDER = "manaburn" //Cast Mana Burn (Revenant) order string
private constant integer CAST3_PROBABILITY = 50 //Cast Mana Burn (Revenant) probability
private constant real KNOCKBACK_DISTANCE = 40 //Distance to knockback
private constant real KNOCKBACK_DURATION = 0.4 //Duration to knockback to blocking unit
private constant real KNOCKBACK_RADIUS = 100.0 //Knockback enemy
private constant real COOLDOWN_FROM_ATTACK = 10.0 //Cooldown after attack
private constant real RECYCLE_TIME = 60.0 //Recycle time
private constant string CONQUER_TIPS = "A |cff00ff00Relic Revenant|r has been |cffff0000killed|r." //Conquer tips
private constant string NEXT_CONQUER1_TIPS = " |cff00ff00Relic Revenants|r left" //Conquer tips
private constant string NEXT_CONQUER2_TIPS = " |cff00ff00Relic Revenant|r left" //Conquer tips
private constant string ATTACK_TIPS = "Attack (press A to) the |cff00ff00Relic Revenant|r to wake it up\n" + /*
*/"|cffff0000You must wake it up before you can kill it|r" //Attack tips
private constant string REKILL_REVENANTS = "Kill the revived |cff00ff00Relic Revenant|r again" //Warn to kill Relic Revenants again
private constant string GAME_LEVEL_INCREASES = "Game level has |cffff0000increased|r.\nKill the revived |cff00ff00Relic Revenant|r again" //Warn game level increase and to kill Relic Revenants again
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Orc\\CommandAura\\CommandAura.mdl" //Target this
private constant integer SOUND_VOLUME = 200 //Sound volume
endglobals
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Revenant_Data
unit u //Unit revenant
integer oID //Owner of revenant ID
integer p //Phase
real t //Time
real x //Guard x
real y //Guard y
real c //Recycle
real minX //Minimum guard x
real minY //Maximum guard x
real maxX //Minimum guard y
real maxY //Maximum guard y
effect e //Effect awake
endstruct
//----------------------------------------------------------------
globals
private sound array Roar[3]
private integer totalRoar
private Revenant_Data array Ar[4]
private integer Total
private timer Tim
private group all
private group copy
private boolean checkDie
private boolexpr bexpr
private force forceDying
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
function Revenant_onDamage takes unit attacker, unit attacked, real amount returns nothing
local integer attackerType = GetUnitTypeId(attacker)
local Revenant_Data rd
local integer i = 0
loop
exitwhen(i >= Total)
set rd = Ar[i]
if(rd.u == attacked) then
if(rd.p == 1) then
if(IsUnitType(attacker, UNIT_TYPE_HERO)) then
set rd.t = COOLDOWN_FROM_ATTACK
endif
endif
endif
set i = i + 1
endloop
if(attackerType == 'uske' or attackerType == 'uskm' or attackerType == 'uabo' or attackerType == 'unec') then
if(IsUnitIllusion(attacked)) then
if(GetUnitState(attacked, UNIT_STATE_LIFE) < 0.1 * GetUnitState(attacked, UNIT_STATE_MAX_LIFE)) then
call SetUnitState(attacked, UNIT_STATE_LIFE, GetUnitState(attacked, UNIT_STATE_LIFE) + amount)
endif
endif
endif
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Revenant_Data rd
local integer i = 0
local real uX = 0.0
local real uY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local unit f = null
local real fAngle = 0.0
loop
exitwhen(i >= Total)
set rd = Ar[i]
set uX = GetUnitX(rd.u)
set uY = GetUnitY(rd.u)
if(not IsUnitDead(rd.u)) then
if((uX < rd.minX or uX > rd.maxX) or /*
*/(uY < rd.minY or uY > rd.maxY)) then
call IssuePointOrder(rd.u, "move", rd.x, rd.y)
endif
if(rd.p == 2) then
if(IsUnitType(rd.u, UNIT_TYPE_SLEEPING)) then
call SetUnitInvulnerable(rd.u, false)
set rd.u = null
if(rd.e != null) then
call DestroyEffect(rd.e)
set rd.e = null
endif
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call rd.destroy()
set i = i - 1
else
if(rd.t > 0.0) then
set rd.t = rd.t - Interval()
else
call SetUnitInvulnerable(rd.u, false)
call UnitAddAbility(rd.u, 'Asla')
set rd.u = null
if(rd.e != null) then
call DestroyEffect(rd.e)
set rd.e = null
endif
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call rd.destroy()
set i = i - 1
endif
endif
elseif(rd.p == 0) then
set dx = uX - rd.x
set dy = uY - rd.y
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= 50.0) then
call GroupEnumUnitsInRange(all, uX, uY, KNOCKBACK_RADIUS, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(f != rd.u) then
set fAngle = Atan2(GetUnitY(f) - rd.y, GetUnitX(f) - rd.x) * bj_RADTODEG
call Knockback(f, KNOCKBACK_DISTANCE, fAngle, KNOCKBACK_DURATION)
endif
endloop
call UnitRemoveAbility(rd.u, 'Abun')
call UnitAddAbility(rd.u, ABILITY2_ID)
call UnitRemoveAbility(rd.u, ABILITY2_ID)
call UnitAddAbility(rd.u, 'ACm2')
call SetUnitTimeScale(rd.u, 0.0)
call SetUnitPathing(rd.u, true)
call SetUnitVertexColor(rd.u, 255, 255, 255, 150)
call SetUnitOwner(rd.u, Player(PLAYER_NEUTRAL_AGGRESSIVE), false)
call UnitAddAbility(rd.u, 'Asla')
call SetUnitX(rd.u, rd.x)
call SetUnitY(rd.u, rd.y)
call SetUnitState(rd.u, UNIT_STATE_MANA, 0)
call SuspendHeroXP(rd.u, true)
set rd.p = 2
set rd.t = COOLDOWN_FROM_ATTACK
else
call IssuePointOrder(rd.u, "move", rd.x, rd.y)
call GroupEnumUnitsInRange(all, uX, uY, KNOCKBACK_RADIUS, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(f != rd.u) then
set fAngle = Atan2(GetUnitY(f) - rd.y, GetUnitX(f) - rd.x) * bj_RADTODEG
call Knockback(f, KNOCKBACK_DISTANCE, fAngle, KNOCKBACK_DURATION)
endif
endloop
endif
elseif(rd.p == 1) then
if(not IsUnitPaused(rd.u)) then
if(rd.t > 0.0) then
set rd.t = rd.t - Interval()
else
set rd.p = 0
set rd.t = COOLDOWN_FROM_ATTACK
call UnitAddAbility(rd.u, 'Abun')
call UnitAddAbility(rd.u, 'Arav')
call UnitRemoveAbility(rd.u, 'Arav')
call SetUnitPathing(rd.u, false)
call IssuePointOrder(rd.u, "move", rd.x, rd.y)
call SetUnitInvulnerable(rd.u, true)
endif
endif
elseif(rd.p == 3) then
if(rd.t > 0.0) then
set rd.t = rd.t - Interval()
else
set rd.p = 4
set rd.t = 1.0
//call SetUnitVertexColor(rd.u, 255, 255, 255, 0)
call SetUnitX(rd.u, GetRectCenterX(gg_rct_Temple_Main_Center))
call SetUnitY(rd.u, GetRectCenterY(gg_rct_Temple_Main_Center))
endif
elseif(rd.p == 4) then
if(rd.t > 0.0) then
set rd.t = rd.t - Interval()
call SetUnitX(rd.u, rd.x)
call SetUnitY(rd.u, rd.y)
else
set rd.p = 5
set rd.t = 10.0
//call SetUnitVertexColor(rd.u, 255, 255, 255, 255)
call SetUnitTimeScale(rd.u, -1.0)
//call SetUnitAnimation(rd.u, "death")
call SetUnitX(rd.u, rd.x)
call SetUnitY(rd.u, rd.y)
endif
elseif(rd.p == 5) then
if(rd.t > 0.0) then
set rd.t = rd.t - Interval()
call SetUnitX(rd.u, rd.x)
call SetUnitY(rd.u, rd.y)
else
set rd.p = 1
set rd.t = 0.0
call SetUnitTimeScale(rd.u, 1.0)
call SetUnitAnimation(rd.u, "stand")
call PauseUnit(rd.u, false)
call SetUnitX(rd.u, rd.x)
call SetUnitY(rd.u, rd.y)
endif
endif
if(GetUnitAbilityLevel(rd.u, 'Avul') > 0) then
if(rd.c > 0.0) then
set rd.c = rd.c - Interval()
else
set rd.c = RECYCLE_TIME
set rd.p = 5
set rd.t = 1.0
endif
else
set rd.c = RECYCLE_TIME
endif
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
function Awake_Revenants takes nothing returns nothing
local Revenant_Data rd
local integer randomSound = GetRandomInt(0, totalRoar - 1)
local integer i = 0
local integer j = 0
local boolean exist = false
set i = 0
loop
exitwhen(i >= totalGuardian)
if(not IsUnitDead(Guardian[i])) then
set exist = false
set j = 0
loop
exitwhen(j >= Total)
set rd = Ar[j]
if(rd.u == Guardian[i]) then
set exist = true
set j = Total
endif
set j = j + 1
endloop
if((IsUnitPaused(Guardian[i])) and (not exist) and (GetUnitTypeId(Guardian[i]) == UNIT1_ID)) then
set rd = Revenant_Data.create()
set rd.u = Guardian[i]
set rd.oID = i
set rd.p = 1
set rd.t = COOLDOWN_FROM_ATTACK
set rd.x = GetRectCenterX(Guard_Region[i])
set rd.y = GetRectCenterY(Guard_Region[i])
set rd.minX = GetRectMinX(Guard_Area[i])
set rd.maxX = GetRectMaxX(Guard_Area[i])
set rd.minY = GetRectMinY(Guard_Area[i])
set rd.maxY = GetRectMaxY(Guard_Area[i])
set rd.e = AddSpecialEffectTarget(SPECIAL_EFFECT, rd.u, "origin")
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = rd
call SuspendHeroXP(Guardian[i], false)
if(GameLevel != 1) then
call SetHeroLevel(Guardian[i], GameLevel, false)
endif
call SetUnitState(Guardian[i], UNIT_STATE_MANA, GetUnitState(Guardian[i], UNIT_STATE_MAX_MANA))
call UnitRemoveAbility(Guardian[i], 'Asla')
call SetUnitAnimation(Guardian[i], "stand")
call SetUnitTimeScale(Guardian[i], 1.0)
call SetUnitVertexColor(rd.u, 255, 255, 255, 255)
call UnitAddAbility(Guardian[i], ABILITY1_ID)
call UnitRemoveAbility(Guardian[i], ABILITY1_ID)
call UnitRemoveAbility(Guardian[i], 'ACm2')
call SetUnitOwner(Guardian[i], Player(PLAYER_NEUTRAL_AGGRESSIVE), false)
call SuspendHeroXP(Guardian[i], true)
call SetUnitAbilityLevel(Guardian[i], ABILITY4_ID, IMaxBJ(R2I(GameLevel/3), 1) * IMaxBJ(R2I(Players_Count/2), 1))
call SetUnitAbilityLevel(Guardian[i], CAST1_ID, R2I(GameLevel/5))
call SetUnitAbilityLevel(Guardian[i], CAST2_ID, R2I(GameLevel/3))
//call SetUnitAbilityLevel(Guardian[i], CAST3_ID, R2I(GameLevel/3))
call AttachSoundToUnit(Roar[randomSound], Guardian[i])
call SetSoundVolume(Roar[randomSound], SOUND_VOLUME)
call StartSound(Roar[randomSound])
endif
endif
set i = i + 1
endloop
endfunction
//----------------------------------------------------------------
function Awake_Revenants_By_Index takes integer index returns nothing
local Revenant_Data rd
local integer randomSound = GetRandomInt(0, totalRoar - 1)
local integer i = 0
local boolean exist = false
if(not IsUnitDead(Guardian[index])) then
set exist = false
set i = 0
loop
exitwhen(i >= Total)
set rd = Ar[i]
if(rd.u == Guardian[index]) then
set exist = true
set i = Total
endif
set i = i + 1
endloop
if((IsUnitPaused(Guardian[index])) and (not exist)) then
set rd = Revenant_Data.create()
set rd.u = Guardian[index]
set rd.oID = index
set rd.p = 1
set rd.t = COOLDOWN_FROM_ATTACK
set rd.x = GetRectCenterX(Guard_Region[index])
set rd.y = GetRectCenterY(Guard_Region[index])
set rd.minX = GetRectMinX(Guard_Area[index])
set rd.maxX = GetRectMaxX(Guard_Area[index])
set rd.minY = GetRectMinY(Guard_Area[index])
set rd.maxY = GetRectMaxY(Guard_Area[index])
set rd.e = AddSpecialEffectTarget(SPECIAL_EFFECT, rd.u, "origin")
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = rd
call SuspendHeroXP(Guardian[index], false)
if(GameLevel != 1) then
call SetHeroLevel(Guardian[index], GameLevel, false)
endif
call SetUnitState(Guardian[index], UNIT_STATE_MANA, GetUnitState(Guardian[index], UNIT_STATE_MAX_MANA))
call UnitRemoveAbility(Guardian[index], 'Asla')
call SetUnitAnimation(Guardian[index], "stand")
call SetUnitTimeScale(Guardian[index], 1.0)
call SetUnitVertexColor(Guardian[index], 255, 255, 255, 255)
call UnitAddAbility(Guardian[index], ABILITY1_ID)
call UnitRemoveAbility(Guardian[index], ABILITY1_ID)
call UnitRemoveAbility(Guardian[index], 'ACm2')
call SetUnitOwner(Guardian[index], Player(PLAYER_NEUTRAL_AGGRESSIVE), false)
call SuspendHeroXP(Guardian[index], true)
call SetUnitAbilityLevel(Guardian[index], ABILITY4_ID, IMaxBJ(R2I(GameLevel/3), 1) * IMaxBJ(R2I(Players_Count/2), 1))
call SetUnitAbilityLevel(Guardian[index], CAST1_ID, R2I(GameLevel/5))
call SetUnitAbilityLevel(Guardian[index], CAST2_ID, R2I(GameLevel/3))
//call SetUnitAbilityLevel(Guardian[index], CAST3_ID, R2I(GameLevel/3))
call AttachSoundToUnit(Roar[randomSound], Guardian[index])
call SetSoundVolume(Roar[randomSound], SOUND_VOLUME)
call StartSound(Roar[randomSound])
endif
endif
endfunction
//----------------------------------------------------------------
private function Wake_Revenant takes unit revenant returns nothing
local Revenant_Data rd = Revenant_Data.create()
local integer randomSound = GetRandomInt(0, totalRoar - 1)
local integer num = 0
local integer i = 0
set i = 0
set num = 0
loop
exitwhen(i >= totalGuardian)
if(revenant == Guardian[i]) then
set num = i
set i = totalGuardian
endif
set i = i + 1
endloop
set rd.u = revenant
set rd.oID = num
set rd.p = 1
set rd.t = COOLDOWN_FROM_ATTACK
set rd.x = GetRectCenterX(Guard_Region[num])
set rd.y = GetRectCenterY(Guard_Region[num])
set rd.minX = GetRectMinX(Guard_Area[num])
set rd.maxX = GetRectMaxX(Guard_Area[num])
set rd.minY = GetRectMinY(Guard_Area[num])
set rd.maxY = GetRectMaxY(Guard_Area[num])
set rd.e = AddSpecialEffectTarget(SPECIAL_EFFECT, rd.u, "origin")
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = rd
call SuspendHeroXP(revenant, false)
if(GameLevel != 1) then
call SetHeroLevel(revenant, GameLevel, false)
endif
call SetUnitState(revenant, UNIT_STATE_MANA, GetUnitState(revenant, UNIT_STATE_MAX_MANA))
call UnitRemoveAbility(revenant, 'Asla')
call SetUnitAnimation(revenant, "stand")
call SetUnitTimeScale(revenant, 1.0)
call SetUnitVertexColor(rd.u, 255, 255, 255, 255)
call UnitAddAbility(revenant, ABILITY1_ID)
call UnitRemoveAbility(revenant, ABILITY1_ID)
call UnitRemoveAbility(revenant, 'ACm2')
call SetUnitOwner(revenant, Player(PLAYER_NEUTRAL_AGGRESSIVE), false)
call SuspendHeroXP(revenant, true)
call SetUnitAbilityLevel(revenant, ABILITY4_ID, IMaxBJ(R2I(GameLevel/3), 1) * IMaxBJ(R2I(Players_Count/2), 1))
call SetUnitAbilityLevel(revenant, CAST1_ID, R2I(GameLevel/5))
call SetUnitAbilityLevel(revenant, CAST2_ID, R2I(GameLevel/3))
//call SetUnitAbilityLevel(revenant, CAST3_ID, R2I(GameLevel/3))
call AttachSoundToUnit(Roar[randomSound], revenant)
call SetSoundVolume(Roar[randomSound], SOUND_VOLUME)
call StartSound(Roar[randomSound])
set revenant = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit attacker = GetAttacker()
local unit attacked = GetTriggerUnit()
if(GamePhase == GAME_PHASE_INITIALIZE) then
call IssuePointOrder(attacker, "move", GetUnitX(attacker), GetUnitY(attacker))
elseif(GamePhase == GAME_PHASE_START) then
call IssueImmediateOrder(attacker, "stop")
call Wake_Revenant(attacked)
endif
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit attacker = GetAttacker()
local player ownerAttacker = GetOwningPlayer(attacker)
local unit attacked = GetTriggerUnit()
local Revenant_Data rd
local integer i = 0
local boolean exist = false
local boolean okey = false
loop
exitwhen(i >= Total)
set rd = Ar[i]
if(rd.u == GetTriggerUnit()) then
set exist = true
set i = Total
endif
set i = i + 1
endloop
set okey = GetUnitTypeId(attacked) == UNIT1_ID and /*
*/(not exist) and /*
*/GetUnitAbilityLevel(attacked, 'Asla') > 0 and /*
*/GetPlayerId(ownerAttacker) <= 7
set attacker = null
set ownerAttacker = null
set attacked = null
return okey
endfunction
//----------------------------------------------------------------
private function Attack_Actions takes nothing returns nothing
local unit attacker = GetAttacker()
local integer attackerType = GetUnitTypeId(attacker)
local unit attacked = GetTriggerUnit()
local integer attackedType = GetUnitTypeId(attacked)
local Revenant_Data rd
local integer i = 0
local integer random = GetRandomInt(1, 100)
loop
exitwhen(i >= Total)
set rd = Ar[i]
if(rd.u == attacker) then
if(rd.p != 0) then
if(IsUnitType(attacked, UNIT_TYPE_HERO)) then
set rd.t = COOLDOWN_FROM_ATTACK
/*if(not IsUnitPaused(attacker) and (GetUnitAbilityLevel(attacker, 'Asla') <= 0)) then
if(random > CAST1_PROBABILITY) then
call IssueImmediateOrder(attacker, CAST1_ORDER)
elseif(random > CAST3_PROBABILITY) then
call IssueImmediateOrder(attacker, CAST3_ORDER)
endif
endif*/
endif
endif
set i = Total
endif
if(rd.u == attacked) then
if(rd.p != 0) then
if(IsUnitType(attacker, UNIT_TYPE_HERO)) then
set rd.t = COOLDOWN_FROM_ATTACK
/*if(not IsUnitPaused(attacked) and (GetUnitAbilityLevel(attacked, 'Asla') <= 0)) then
if(random > CAST1_PROBABILITY) then
call IssueImmediateOrder(attacked, CAST1_ORDER)
elseif(random > CAST2_PROBABILITY) then
call IssueImmediateOrder(attacked, CAST2_ORDER)
endif
endif*/
endif
endif
set i = Total
endif
set i = i + 1
endloop
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Attack_Conditions takes nothing returns boolean
return (GetUnitTypeId(GetAttacker()) == UNIT_ID or GetUnitTypeId(GetTriggerUnit()) == UNIT_ID)
endfunction
//----------------------------------------------------------------
private function Die_Actions takes nothing returns nothing
//local Win_Data wd
local Revenant_Data rd
local unit dying = GetDyingUnit()
local integer dyingType = GetUnitTypeId(dying)
local real dyingX = GetUnitX(dying)
local real dyingY = GetUnitY(dying)
local player ownerDying = GetOwningPlayer(dying)
local unit killer = GetKillingUnit()
local player ownerKiller = GetOwningPlayer(killer)
local integer ownerKillerId = GetPlayerId(ownerKiller)
local integer killerType = GetUnitTypeId(killer)
local boolean ally = false
local player p = null
local integer i = 0
local integer j = 0
local unit f = null
local player o = null
local boolean ok = false
local integer total = 0
local unit boat = null
local boolean rekill = false
local boolean reviveRevenant = false
local boolean gameIncreasing = false
local sound s = null
if(IsPlayerInForce(ownerDying, Players_Luminous)) then
set forceDying = Players_Luminous
elseif(IsPlayerInForce(ownerDying, Players_Overcast)) then
set forceDying = Players_Overcast
endif
if(killer != null) then
if(GetPlayerId(ownerKiller) >= 0 and GetPlayerId(ownerKiller) < 8) then
else
set ownerKillerId = Find_Assist(dying)
if(ownerKillerId >= 0) then
set ownerKiller = Player(ownerKillerId)
set killer = GetHero(ownerKiller)
set killerType = GetUnitTypeId(killer)
else
set killer = GetKillingUnit()
set ownerKiller = GetOwningPlayer(killer)
set ownerKillerId = GetPlayerId(ownerKiller)
set killerType = GetUnitTypeId(killer)
endif
endif
else
set ownerKillerId = Find_Assist(dying)
if(ownerKillerId >= 0) then
set ownerKiller = Player(ownerKillerId)
set killer = GetHero(ownerKiller)
set killerType = GetUnitTypeId(killer)
else
set killer = GetKillingUnit()
set ownerKiller = GetOwningPlayer(killer)
set ownerKillerId = GetPlayerId(ownerKiller)
set killerType = GetUnitTypeId(killer)
endif
endif
if(killer != null) then
set i = 0
loop
exitwhen(i >= totalGuardian)
set reviveRevenant = false
if(dying == Conqueror[i]) then
if(dyingType == UNIT_ID or dyingType == UNIT1_ID) then
if(GetPlayerId(ownerKiller) >= 0 and GetPlayerId(ownerKiller) < 8) then
if(GameLevel < MAX_GAME_LEVEL) then
set GameLevel = GameLevel + 1
call UpgradeGame()
set reviveRevenant = true
set gameIncreasing = true
else
set Conqueror_Indicator[i] = CreateUnit(ownerKiller, DUMMY_ID, /*
*/GetRectCenterX(Conqueror_Region[i]), GetRectCenterY(Conqueror_Region[i]), /*
*/bj_UNIT_FACING)
call SetUnitAnimation(Conqueror_Indicator[i], "stand, work")
if(IsUnitType(killer, UNIT_TYPE_HERO) and /*
*/not IsUnitType(killer, UNIT_TYPE_SUMMONED)) then
set Conqueror[i] = killer
else
set Conqueror[i] = GetHero(ownerKiller)
endif
//call Hunter_Actions(obelisk[i], i + 8, Guard_Region[i])
set copy = CopyGroup(Boats)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(ownerKiller == GetOwningPlayer(f) and boat == null) then
set boat = f
endif
endloop
if(boat != null) then
call IssueImmediateOrder(boat, "unload")
call SetPlayerAbilityAvailable(ownerKiller, 'A07P', false)
endif
set ok = Check_Win()
if(not ok) then
set total = 0
set j = 0
loop
exitwhen(j >= 4)
if(GetUnitTypeId(Conqueror[j]) == UNIT_ID or /*
*/GetUnitTypeId(Conqueror[j]) == UNIT1_ID) then
set total = total + 1
endif
set j = j + 1
endloop
set j = 0
loop
exitwhen(j >= 8)
set p = Player(j)
if(IsPlayerEnemy(p, ownerKiller)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, CONQUER_TIPS)
endif
set s = gg_snd_Warning
if(GetLocalPlayer() == p) then
call StartSound(s)
endif
set s = null
else
if(IsPlayerInForce(p, CommentaryForce)) then
if(total > 1) then
call DisplayTextToPlayer(p, 0, 0, I2S(total) + NEXT_CONQUER1_TIPS)
else
call DisplayTextToPlayer(p, 0, 0, I2S(total) + NEXT_CONQUER2_TIPS)
endif
endif
set s = gg_snd_GoodJob
if(GetLocalPlayer() == p) then
call StartSound(s)
endif
set s = null
endif
set j = j + 1
endloop
endif
endif
else
set reviveRevenant = true
endif
else
call RemoveUnit(Conqueror_Indicator[i])
set Conqueror_Indicator[i] = null
set reviveRevenant = true
set copy = CopyGroup(Boats)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(ownerDying == GetOwningPlayer(f) and boat == null) then
set boat = f
endif
endloop
if(boat != null) then
call SetPlayerAbilityAvailable(ownerDying, 'A07P', false)
endif
endif
endif
if(reviveRevenant) then
call ReviveHero(Guardian[i], dyingX, dyingY, false)
call SetUnitInvulnerable(Guardian[i], true)
set Conqueror[i] = Guardian[i]
call SetUnitFacing(Guardian[i], Guard_Facing[i])
set j = 0
loop
exitwhen(j >= Total)
set rd = Ar[j]
if(rd.u == Guardian[i]) then
set rd.p = 3
set rd.t = 9.0
call PauseUnit(rd.u, true)
call SetUnitAnimation(rd.u, "death")
call SetUnitInvulnerable(rd.u, true)
call UnitAddAbility(rd.u, 'Abun')
set j = Total
endif
set j = j + 1
endloop
set i = totalGuardian
endif
set i = i + 1
endloop
else
set killer = GetKillingUnit()
set ownerKiller = GetOwningPlayer(killer)
set ownerKillerId = GetPlayerId(ownerKiller)
set killerType = GetUnitTypeId(killer)
set i = 0
loop
exitwhen(i >= totalGuardian)
if(dying == Conqueror[i]) then
if(Conqueror_Indicator[i] != null) then
call RemoveUnit(Conqueror_Indicator[i])
set Conqueror_Indicator[i] = null
endif
call ReviveHero(Guardian[i], dyingX, dyingY, false)
call SetUnitInvulnerable(Guardian[i], true)
set Conqueror[i] = Guardian[i]
call SetUnitFacing(Guardian[i], Guard_Facing[i])
set rekill = true
set j = 0
loop
exitwhen(j >= Total)
set rd = Ar[j]
if(rd.u == Guardian[i]) then
set rd.p = 3
set rd.t = 9.0
call PauseUnit(rd.u, true)
call SetUnitAnimation(rd.u, "death")
//call SetUnitTimeScale(rd.u, 50.0)
call SetUnitInvulnerable(rd.u, true)
call UnitAddAbility(rd.u, 'Abun')
set j = Total
endif
set j = j + 1
endloop
set i = totalGuardian
endif
set i = i + 1
endloop
endif
if(forceDying != null and rekill) then
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, forceDying)) then
call DisplayTextToPlayer(p, 0, 0, REKILL_REVENANTS)
endif
set i = i + 1
endloop
endif
if(gameIncreasing) then
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
call DisplayTextToPlayer(p, 0, 0, GAME_LEVEL_INCREASES)
endif
set i = i + 1
endloop
endif
set dying = null
set ownerDying = null
set killer = null
set ownerKiller = null
set p = null
set f = null
set o = null
set boat = null
set forceDying = null
set s = null
endfunction
//----------------------------------------------------------------
private function Die_Conditions takes nothing returns boolean
local unit dying = GetDyingUnit()
local boolean check = true
local boolean okey = false
if(GetUnitAbilityLevel(GetDyingUnit(), 'A06K') > 0 and (not IsUnitInGroup(GetDyingUnit(), ImmortalCaster))) then
set check = false
endif
set okey = IsUnitType(dying, UNIT_TYPE_HERO) and /*
*/checkDie and (not Cinematic_Start) and /*
*/(not IsUnitIllusion(dying)) and /*
*/dying == Conqueror[0] and /*
*/check
set dying = null
return okey
endfunction
//----------------------------------------------------------------
private function Level_Actions takes nothing returns nothing
local unit leveler = GetTriggerUnit()
local integer level = R2I(GetHeroLevel(leveler) / 6) + 1
set leveler = null
endfunction
//----------------------------------------------------------------
private function Level_Conditions takes nothing returns boolean
return (GetUnitTypeId(GetLevelingUnit()) == UNIT_ID)
endfunction
//----------------------------------------------------------------
private function Target_Actions takes nothing returns nothing
local unit ordered = GetOrderedUnit()
local player owner = GetOwningPlayer(ordered)
local unit target = GetOrderTargetUnit()
if(IsUnitInGroup(ordered, Unit_Inside_Temple)) then
call Wake_Revenant(target)
else
if(IsPlayerInForce(owner, TipsForce)) then
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0, 0, ATTACK_TIPS)
endif
endif
endif
set ordered = null
set target = null
endfunction
//----------------------------------------------------------------
private function Target_Conditions takes nothing returns boolean
return (GetUnitTypeId(GetOrderTargetUnit()) == UNIT1_ID) and /*
*/GetPlayerId(GetOwningPlayer(GetOrderedUnit())) < 8 and /*
*/GetIssuedOrderId() != 851983 and /*
*/IsUnitType(GetOrderedUnit(), UNIT_TYPE_HERO) and /*
*/GamePhase == GAME_PHASE_START
endfunction
//----------------------------------------------------------------
function SetRevenantCheckDead takes boolean check returns nothing
set checkDie = check
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger RevenantAttackedTrg = CreateTrigger()
local trigger RevenantAttackTrg = CreateTrigger()
local trigger RevenantDieTrg = CreateTrigger()
local trigger RevenantLevelTrg = CreateTrigger()
local trigger RevenantTargetTrg = CreateTrigger()
local integer i = 0
call TriggerRegisterAnyUnitEventBJ(RevenantAttackedTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(RevenantAttackedTrg, Condition(function Conditions))
call TriggerAddAction(RevenantAttackedTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(RevenantAttackTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(RevenantAttackTrg, Condition(function Attack_Conditions))
call TriggerAddAction(RevenantAttackTrg, function Attack_Actions)
call TriggerRegisterAnyUnitEventBJ(RevenantDieTrg, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(RevenantDieTrg, Condition(function Die_Conditions))
call TriggerAddAction(RevenantDieTrg, function Die_Actions)
call TriggerRegisterAnyUnitEventBJ(RevenantLevelTrg, EVENT_PLAYER_HERO_LEVEL)
call TriggerAddCondition(RevenantLevelTrg, Condition(function Level_Conditions))
call TriggerAddAction(RevenantLevelTrg, function Level_Actions)
//setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set copy = CreateGroup()
set checkDie = true
set bexpr = Condition(function Pick)
set forceDying = null
set totalGuardian = 1
set Guardian[0] = gg_unit_Uwar_0003 //North west
set Guard_Facing[0] = 270.0
set Guard_Region[0] = gg_rct_Temple_Center
set Guard_Area[0] = gg_rct_Temple_Center
set i = 0
loop
exitwhen(i >= totalGuardian)
call UnitAddAbility(Guardian[i], ABILITY2_ID)
call UnitRemoveAbility(Guardian[i], ABILITY2_ID)
call UnitAddAbility(Guardian[i], 'ACm2')
call SetUnitInvulnerable(Guardian[i], true)
call SetUnitTimeScale(Guardian[i], 0.0)
call SetUnitVertexColor(Guardian[i], 255, 255, 255, 150)
call SetUnitOwner(Guardian[i], Player(PLAYER_NEUTRAL_AGGRESSIVE), false)
call UnitAddAbility(Guardian[i], 'Asla')
set Conqueror_Indicator[i] = null
set i = i + 1
endloop
set totalConqueror = 1
set Conqueror[0] = Guardian[0]
set Conqueror_Region[0] = gg_rct_Temple_Main_Center
set totalRoar = 3
set Roar[0] = gg_snd_Revenant_Roar1
set Roar[1] = gg_snd_Revenant_Roar1
set Roar[2] = gg_snd_Revenant_Roar1
endfunction
endscope
//TESH.scrollpos=25
//TESH.alwaysfold=0
globals
trigger LuminousForceBaseTrg = CreateTrigger()
trigger OvercastForceBaseTrg = CreateTrigger()
trigger ForceBaseTrg = CreateTrigger()
endglobals
scope ForceBase initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant string MESSAGE = "|cffff0000You cannot enter this area|r"
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
//----------------------------------------------------------------
private function Luminous_Actions takes nothing returns nothing
local unit enterer = GetTriggerUnit()
local player owner = GetOwningPlayer(enterer)
if(not IsPlayerInForce(owner, Players_Luminous)) then
call SetUnitX(enterer, GetRectCenterX(gg_rct_Luminous_Base_Return))
call SetUnitY(enterer, GetRectCenterY(gg_rct_Luminous_Base_Return))
call DisplayTextToPlayer(owner, 0.0, 0.0, MESSAGE)
endif
set enterer = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Overcast_Actions takes nothing returns nothing
local unit enterer = GetTriggerUnit()
local player owner = GetOwningPlayer(enterer)
if(not IsPlayerInForce(owner, Players_Overcast)) then
call SetUnitX(enterer, GetRectCenterX(gg_rct_Overcast_Base_Return))
call SetUnitY(enterer, GetRectCenterY(gg_rct_Overcast_Base_Return))
call DisplayTextToPlayer(owner, 0.0, 0.0, MESSAGE)
endif
set enterer = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit enterer = GetTriggerUnit()
local boolean okey = IsUnitInGroup(enterer, Heroes)
set enterer = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterEnterRectSimple(LuminousForceBaseTrg, gg_rct_Luminous_Base)
call TriggerAddCondition(LuminousForceBaseTrg, Condition(function Conditions))
call TriggerAddAction(LuminousForceBaseTrg, function Luminous_Actions)
call DisableTrigger(LuminousForceBaseTrg)
call TriggerRegisterEnterRectSimple(OvercastForceBaseTrg, gg_rct_Overcast_Base)
call TriggerAddCondition(OvercastForceBaseTrg, Condition(function Conditions))
call TriggerAddAction(OvercastForceBaseTrg, function Overcast_Actions)
call DisableTrigger(OvercastForceBaseTrg)
//setting globals
endfunction
endscope
//TESH.scrollpos=158
//TESH.alwaysfold=0
globals
constant integer TOTAL_PLAYER_SLOTS = 8
force Players = CreateForce()
integer Players_Count = 0
force All_Luminous = CreateForce()
force Players_Luminous = CreateForce()
integer Players_Luminous_Count = 0
force Players_Luminous_Playing = CreateForce()
force All_Overcast = CreateForce()
force Players_Overcast = CreateForce()
integer Players_Overcast_Count = 0
force Players_Overcast_Playing = CreateForce()
force Creep_West = CreateForce()
force Creep_North = CreateForce()
force Creep_East = CreateForce()
force Creep_South = CreateForce()
integer Player_Starting_Gold
boolean array Players_Ready[8]
endglobals
scope Players initializer Init
//----------------------------------------------------------------
function GetPlayerForce takes player p returns force f
if(IsPlayerInForce(p, Players_Luminous)) then
return Players_Luminous
elseif(IsPlayerInForce(p, Players_Overcast)) then
return Players_Overcast
else
return null
endif
endfunction
//----------------------------------------------------------------
function GetPlayerAllForce takes player p returns force f
if(IsPlayerInForce(p, All_Luminous)) then
return All_Luminous
elseif(IsPlayerInForce(p, All_Overcast)) then
return All_Overcast
else
return null
endif
endfunction
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
return (GetPlayerController(GetFilterPlayer()) == MAP_CONTROL_USER and /*
*/GetPlayerSlotState(GetFilterPlayer()) == PLAYER_SLOT_STATE_PLAYING) or /*
*/GetPlayerController(GetFilterPlayer()) == MAP_CONTROL_COMPUTER
endfunction
//----------------------------------------------------------------
private function CountLuminousPlayers takes nothing returns nothing
set Players_Luminous_Count = Players_Luminous_Count + 1
endfunction
//----------------------------------------------------------------
private function SetupLuminousPlayers takes nothing returns nothing
local player enumPlayer = GetEnumPlayer()
local integer enumPlayerID = GetPlayerId(enumPlayer)
call SetPlayerState(enumPlayer, PLAYER_STATE_RESOURCE_GOLD, Player_Starting_Gold)///Players_Luminous_Count)
call SaveInteger(Info_Ht, enumPlayerID, KILL_NUMBER_KEY, 0)
call SaveInteger(Info_Ht, enumPlayerID, DIE_NUMBER_KEY, 0)
call SaveInteger(Info_Ht, enumPlayerID, MULTIBOARD_ROW_KEY, -1)
call SaveInteger(Info_Ht, enumPlayerID, STREAK_NUMBER_KEY, 0)
call SaveInteger(Info_Ht, enumPlayerID, ASSIST_NUMBER_KEY, 0)
call SaveUnitHandle(Info_Ht, enumPlayerID, REVENGE_UNIT_KEY, null)
call SetPlayerAllianceStateBJ(enumPlayer, Player(13), bj_ALLIANCE_ALLIED_VISION)
call SetPlayerAllianceStateBJ(Player(13), enumPlayer, bj_ALLIANCE_ALLIED_VISION)
set enumPlayer = null
endfunction
//----------------------------------------------------------------
private function CountOvercastPlayers takes nothing returns nothing
set Players_Overcast_Count = Players_Overcast_Count + 1
endfunction
//----------------------------------------------------------------
private function SetupOvercastPlayers takes nothing returns nothing
local player enumPlayer = GetEnumPlayer()
local integer enumPlayerID = GetPlayerId(enumPlayer)
call SetPlayerState(enumPlayer, PLAYER_STATE_RESOURCE_GOLD, Player_Starting_Gold)///Players_Overcast_Count)
call SaveInteger(Info_Ht, enumPlayerID, KILL_NUMBER_KEY, 0)
call SaveInteger(Info_Ht, enumPlayerID, DIE_NUMBER_KEY, 0)
call SaveInteger(Info_Ht, enumPlayerID, MULTIBOARD_ROW_KEY, -1)
call SaveInteger(Info_Ht, enumPlayerID, STREAK_NUMBER_KEY, 0)
call SaveInteger(Info_Ht, enumPlayerID, ASSIST_NUMBER_KEY, 0)
call SaveUnitHandle(Info_Ht, enumPlayerID, REVENGE_UNIT_KEY, null)
call SetPlayerAllianceStateBJ(enumPlayer, Player(14), bj_ALLIANCE_ALLIED_VISION)
call SetPlayerAllianceStateBJ(Player(14), enumPlayer, bj_ALLIANCE_ALLIED_VISION)
set enumPlayer = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local boolexpr b = Condition(function Pick)
local integer i = 0
local integer j = 0
local player p = null
set Player_Starting_Gold = 800
//Luminous
set Players_Luminous_Count = 0
call ForceEnumAllies(Players_Luminous, Player(0), b)
call ForceEnumAllies(All_Luminous, Player(0), b)
call ForForce(Players_Luminous, function CountLuminousPlayers)
call ForForce(Players_Luminous, function SetupLuminousPlayers)
//Overcast
set Players_Overcast_Count = 0
call ForceEnumAllies(Players_Overcast, Player(4), b)
call ForceEnumAllies(All_Overcast, Player(4), b)
call ForForce(Players_Overcast, function CountOvercastPlayers)
call ForForce(Players_Overcast, function SetupOvercastPlayers)
set Players_Count = Players_Luminous_Count + Players_Overcast_Count
call ForceEnumPlayers(Players, b)
call DestroyBoolExpr(b)
set i = 0
loop
exitwhen(i >= 12)
set Players_Ready[i] = false
set p = Player(i)
call SetPlayerState(p, PLAYER_STATE_GIVES_BOUNTY, 1)
call SetPlayerState(p, PLAYER_STATE_RESOURCE_LUMBER, 15)
if(GetPlayerState(p, PLAYER_STATE_OBSERVER) > 0) then
endif
set i = i + 1
endloop
//Creep
call ForceAddPlayer(Creep_West, Player(8))
call ForceAddPlayer(Creep_North, Player(9))
call ForceAddPlayer(Creep_East, Player(10))
call ForceAddPlayer(Creep_South, Player(11))
call SetPlayerName(Player(8), "Skeletons West")
call SetPlayerName(Player(9), "Skeletons North")
call SetPlayerName(Player(10), "Skeletons East")
call SetPlayerName(Player(11), "Skeletons South")
call SetPlayerAllianceStateBJ(Player(13), Player(4), bj_ALLIANCE_UNALLIED)
call SetPlayerAllianceStateBJ(Player(13), Player(5), bj_ALLIANCE_UNALLIED)
call SetPlayerAllianceStateBJ(Player(13), Player(6), bj_ALLIANCE_UNALLIED)
call SetPlayerAllianceStateBJ(Player(13), Player(7), bj_ALLIANCE_UNALLIED)
call SetPlayerAllianceStateBJ(Player(13), Player(8), bj_ALLIANCE_UNALLIED)
call SetPlayerAllianceStateBJ(Player(13), Player(9), bj_ALLIANCE_UNALLIED)
call SetPlayerAllianceStateBJ(Player(13), Player(10), bj_ALLIANCE_UNALLIED)
call SetPlayerAllianceStateBJ(Player(13), Player(11), bj_ALLIANCE_UNALLIED)
call SetPlayerAllianceStateBJ(Player(13), Player(12), bj_ALLIANCE_UNALLIED)
call SetPlayerAllianceStateBJ(Player(4), Player(13), bj_ALLIANCE_UNALLIED)
call SetPlayerAllianceStateBJ(Player(5), Player(13), bj_ALLIANCE_UNALLIED)
call SetPlayerAllianceStateBJ(Player(6), Player(13), bj_ALLIANCE_UNALLIED)
call SetPlayerAllianceStateBJ(Player(7), Player(13), bj_ALLIANCE_UNALLIED)
call SetPlayerAllianceStateBJ(Player(8), Player(13), bj_ALLIANCE_UNALLIED)
call SetPlayerAllianceStateBJ(Player(9), Player(13), bj_ALLIANCE_UNALLIED)
call SetPlayerAllianceStateBJ(Player(10), Player(13), bj_ALLIANCE_UNALLIED)
call SetPlayerAllianceStateBJ(Player(11), Player(13), bj_ALLIANCE_UNALLIED)
call SetPlayerAllianceStateBJ(Player(12), Player(13), bj_ALLIANCE_UNALLIED)
call ForceAddPlayer(All_Luminous, Player(13))
call SetPlayerName(Player(13), "Luminous")
call SaveInteger(Info_Ht, 13, KILL_NUMBER_KEY, 0)
call SaveInteger(Info_Ht, 13, DIE_NUMBER_KEY, 0)
call SaveInteger(Info_Ht, 13, MULTIBOARD_ROW_KEY, -1)
call SaveInteger(Info_Ht, 13, STREAK_NUMBER_KEY, 0)
call SaveInteger(Info_Ht, 13, ASSIST_NUMBER_KEY, 0)
call SaveUnitHandle(Info_Ht, 13, REVENGE_UNIT_KEY, null)
call ForceAddPlayer(All_Overcast, Player(14))
call SetPlayerName(Player(14), "Overcast")
call SaveInteger(Info_Ht, 14, KILL_NUMBER_KEY, 0)
call SaveInteger(Info_Ht, 14, DIE_NUMBER_KEY, 0)
call SaveInteger(Info_Ht, 14, MULTIBOARD_ROW_KEY, -1)
call SaveInteger(Info_Ht, 14, STREAK_NUMBER_KEY, 0)
call SaveInteger(Info_Ht, 14, ASSIST_NUMBER_KEY, 0)
call SaveUnitHandle(Info_Ht, 14, REVENGE_UNIT_KEY, null)
set p = null
//Passive is player 15
//Extra is player 14
//Victim is player 13
//Aggressive is player 12
//call BJDebugMsg(I2S(PLAYER_NEUTRAL_PASSIVE))
//call BJDebugMsg(I2S(PLAYER_NEUTRAL_AGGRESSIVE))
//call BJDebugMsg(I2S(bj_PLAYER_NEUTRAL_EXTRA))
//call BJDebugMsg(I2S(bj_PLAYER_NEUTRAL_VICTIM))
endfunction
endscope
//TESH.scrollpos=105
//TESH.alwaysfold=0
globals
string array Player_Colors[12]
string array Player_Name[15]
endglobals
scope PlayerColors initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local integer i = 0
set Player_Colors[0] = "|cffff0000"
set Player_Colors[1] = "|cff0000ff"
set Player_Colors[2] = "|cff00ffff"
set Player_Colors[3] = "|cff8000ff"
set Player_Colors[4] = "|cffffff00"
set Player_Colors[5] = "|cffff8000"
set Player_Colors[6] = "|cff00ff00"
set Player_Colors[7] = "|cffff00ff"
set Player_Colors[8] = "|cff808080"
set Player_Colors[9] = "|cff80ffff"
set Player_Colors[10] = "|cff008000"
set Player_Colors[11] = "|cff804000"
loop
exitwhen(i > 7)
set Player_Name[i] = Player_Colors[i] + GetPlayerName(Player(i)) + "|r"
set i = i + 1
endloop
loop
exitwhen(i > 11)
if(i == 8) then
set Player_Name[i] = Player_Colors[i] + "Skeleton West|r"
elseif(i == 9) then
set Player_Name[i] = Player_Colors[i] + "Skeleton North|r"
elseif(i == 10) then
set Player_Name[i] = Player_Colors[i] + "Skeleton East|r"
elseif(i == 11) then
set Player_Name[i] = Player_Colors[i] + "Skeleton South|r"
endif
set i = i + 1
endloop
set Player_Name[12] = "|cffc0c0c0Neutral Passive|r"
set Player_Name[13] = "|cffc0c0c0Luminous|r"
set Player_Name[14] = "|cffc0c0c0Overcast|r"
set Player_Name[PLAYER_NEUTRAL_AGGRESSIVE] = "|cffc0c0c0Neutral Hostile|r"
endfunction
//----------------------------------------------------------------
function GetPlayerColorRedTinting takes integer playerId returns integer
if(playerId == 0) then
return 255
elseif(playerId == 1) then
return 0
elseif(playerId == 2) then
return 27
elseif(playerId == 3) then
return 83
elseif(playerId == 4) then
return 255
elseif(playerId == 5) then
return 254
elseif(playerId == 6) then
return 31
elseif(playerId == 7) then
return 228
elseif(playerId == 8) then
return 148
elseif(playerId == 9) then
return 125
elseif(playerId == 10) then
return 15
elseif(playerId == 11) then
return 77
else
return 0
endif
endfunction
//----------------------------------------------------------------
function GetPlayerColorGreenTinting takes integer playerId returns integer
if(playerId == 0) then
return 2
elseif(playerId == 1) then
return 65
elseif(playerId == 2) then
return 229
elseif(playerId == 3) then
return 0
elseif(playerId == 4) then
return 255
elseif(playerId == 5) then
return 137
elseif(playerId == 6) then
return 191
elseif(playerId == 7) then
return 90
elseif(playerId == 8) then
return 149
elseif(playerId == 9) then
return 190
elseif(playerId == 10) then
return 97
elseif(playerId == 11) then
return 41
else
return 0
endif
endfunction
//----------------------------------------------------------------
function GetPlayerColorBlueTinting takes integer playerId returns integer
if(playerId == 0) then
return 2
elseif(playerId == 1) then
return 255
elseif(playerId == 2) then
return 184
elseif(playerId == 3) then
return 128
elseif(playerId == 4) then
return 0
elseif(playerId == 5) then
return 13
elseif(playerId == 6) then
return 0
elseif(playerId == 7) then
return 170
elseif(playerId == 8) then
return 150
elseif(playerId == 9) then
return 241
elseif(playerId == 10) then
return 69
elseif(playerId == 11) then
return 3
else
return 0
endif
endfunction
//----------------------------------------------------------------
function AppendPlayerNameHero takes player p, unit hero returns nothing
local integer playerId = GetPlayerId(p)
if(playerId >= 0 and playerId < 8) then
set Player_Name[playerId] = Player_Colors[playerId] + GetPlayerName(p) + " (" + GetUnitName(hero) + ")|r"
endif
set p = null
set hero = null
endfunction
endscope
//TESH.scrollpos=21
//TESH.alwaysfold=0
globals
force Players_Leave = CreateForce()
endglobals
scope Leave initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant string MESSAGE = " |cffff0000has left the game|r." //Player left message
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private group copy
endglobals
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local player leaver = GetTriggerPlayer()
local integer numP = GetPlayerId(leaver)
local integer position = LoadInteger(Info_Ht, numP, MULTIBOARD_ROW_KEY)
local multiboarditem mbItem = null
local integer i = 0
local unit f = null
local player fOwner = null
local player p = null
local boolean exist = false
call ForceAddPlayer(Players_Leave, leaver)
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTimedTextToPlayer(p, 0, 0, 15, Player_Name[numP] + MESSAGE)
endif
if(IsPlayerAlly(p, leaver)) then
call SetPlayerAlliance(p, leaver, ALLIANCE_HELP_REQUEST, true)
call SetPlayerAlliance(p, leaver, ALLIANCE_HELP_RESPONSE, true)
call SetPlayerAlliance(p, leaver, ALLIANCE_SHARED_SPELLS, true)
call SetPlayerAlliance(p, leaver, ALLIANCE_SHARED_VISION, true)
call SetPlayerAlliance(p, leaver, ALLIANCE_SHARED_CONTROL, true)
endif
endif
set i = i + 1
endloop
set mbItem = MultiboardGetItem(MultiB, position, MULTIBOARD_PLAYER_NAME)
call MultiboardSetItemValue(mbItem, "|cff808080" + GetPlayerName(leaver) + "|r.")
set leaver = null
set mbItem = null
set f = null
set fOwner = null
set p = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger LeaveTrg = CreateTrigger()
call TriggerRegisterPlayerEventLeave(LeaveTrg, Player(0))
call TriggerRegisterPlayerEventLeave(LeaveTrg, Player(1))
call TriggerRegisterPlayerEventLeave(LeaveTrg, Player(2))
call TriggerRegisterPlayerEventLeave(LeaveTrg, Player(3))
call TriggerRegisterPlayerEventLeave(LeaveTrg, Player(4))
call TriggerRegisterPlayerEventLeave(LeaveTrg, Player(5))
call TriggerRegisterPlayerEventLeave(LeaveTrg, Player(6))
call TriggerRegisterPlayerEventLeave(LeaveTrg, Player(7))
call TriggerAddAction(LeaveTrg, function Actions)
//setting globals
set copy = CreateGroup()
endfunction
endscope
//TESH.scrollpos=28
//TESH.alwaysfold=0
globals
trigger FreeGoldTrg
endglobals
scope FreeGold initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant real DURATION_SPREAD = 60.0 //Duration spread gold of ally team
private constant real DURATION_SPAWN = 60.0 //Duration spawn gold to crypt
private constant real INTERVAL = 2.0 //Interval timer
private constant integer TEAM_GOLD = 1 //Give to ally team per interval
private constant integer POWER_TOWER_GOLD = 1 //Gold given to alliance Power Tower
private constant integer ITEM_ID = 'gold' //Gold item
private constant integer ITEM1_ID = 'manh' //Gold greater item
private constant integer MAX_SPAWN_GOLD = 1 //Gold spawn max every duration
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private real durationSpread
private real durationSpawn
private location loc
private rect array Gold_Spawn[4]
private item array Gold[4]
endglobals
//----------------------------------------------------------------
private function Add_Gold takes nothing returns nothing
local player enumPlayer = GetEnumPlayer()
local integer playerId = GetPlayerId(enumPlayer)
local integer state = GetPlayerState(enumPlayer, PLAYER_STATE_RESOURCE_GOLD)
local integer plus = 2
local integer extra = 0
local string s = ""
local integer i = 0
set i = 0
loop
exitwhen(i >= 4)
if(Power_Tower[i] != null) then
if(not IsUnitDead(Power_Tower[i])) then
if(IsUnitAlly(Power_Tower[i], enumPlayer)) then
set extra = POWER_TOWER_GOLD
set plus = plus + extra
set s = ""
if(GetLocalPlayer() == enumPlayer) then
set s = "+" + I2S(extra)
endif
call TextTag_AttachUnit(s, 10.0 * 0.023 / 10.0, Power_Tower[i], 30.0, /*
*/255, 255, 0, 255, /*
*/Cos(90.0 * bj_DEGTORAD) * 64.0 * 0.071 / 128, Sin(90.0 * bj_DEGTORAD) * 64.0 * 0.071 / 128,/*
*/false, 3.00, 2.0)
endif
endif
endif
set i = i + 1
endloop
call SetPlayerState(enumPlayer, PLAYER_STATE_RESOURCE_GOLD, state + plus)
set enumPlayer = null
set s = null
endfunction
//----------------------------------------------------------------
private function Distribute_Gold takes nothing returns nothing
local player enumPlayer = GetEnumPlayer()
local integer playerId = GetPlayerId(enumPlayer)
local integer gold = GetPlayerState(enumPlayer, PLAYER_STATE_RESOURCE_GOLD)
if(IsPlayerInForce(enumPlayer, Players_Luminous)) then
call SetPlayerState(Player(13), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(Player(13), PLAYER_STATE_RESOURCE_GOLD) + gold)
elseif(IsPlayerInForce(enumPlayer, Players_Overcast)) then
call SetPlayerState(Player(14), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(Player(14), PLAYER_STATE_RESOURCE_GOLD) + gold)
endif
call SetPlayerState(enumPlayer, PLAYER_STATE_RESOURCE_GOLD, 0)
set enumPlayer = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local player p = null
local integer gold = 0
local integer count = 0
local integer teamGold = 0
local integer distGold = 0
local integer i = 0
local integer j = 0
local real x = 0.0
local real y = 0.0
local integer totalLuminous = TEAM_GOLD
local integer totalOvercast = TEAM_GOLD
call ForForce(Players, function Add_Gold)
call ForForce(Players_Leave, function Distribute_Gold)
if(durationSpread > INTERVAL) then
set durationSpread = durationSpread - INTERVAL
else
set durationSpread = DURATION_SPREAD - INTERVAL
set teamGold = GetPlayerState(Player(13), PLAYER_STATE_RESOURCE_GOLD)
set distGold = R2I(teamGold / Players_Luminous_Count)
call SetPlayerState(Player(13), PLAYER_STATE_RESOURCE_GOLD, 0)
set i = 0
loop
exitwhen(i >= 4)
set p = Player(i)
if(IsPlayerInForce(p, Players_Luminous)) then
call SetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD) + distGold)
endif
set i = i + 1
endloop
set teamGold = GetPlayerState(Player(14), PLAYER_STATE_RESOURCE_GOLD)
set distGold = R2I(teamGold / Players_Overcast_Count)
call SetPlayerState(Player(14), PLAYER_STATE_RESOURCE_GOLD, 0)
set i = 4
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players_Overcast)) then
call SetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD) + distGold)
endif
set i = i + 1
endloop
endif
if(durationSpawn > INTERVAL) then
set durationSpawn = durationSpawn - INTERVAL
else
set durationSpawn = DURATION_SPAWN - INTERVAL
set i = 8
loop
exitwhen(i >= 12)
set p = Player(i)
if(Gold[i-8] == null) then
set gold = 100 + GetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD)
set count = R2I(gold / 100)
set count = IMinBJ(count, MAX_SPAWN_GOLD)
call SetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD, gold - (count * 100))
set j = 0
loop
exitwhen(j >= count)
set loc = GetRectCenter(Gold_Spawn[i-8])
set Gold[i-8] = CreateItem(ITEM_ID, GetLocationX(loc), GetLocationY(loc))
set j = j + 1
endloop
else
call RemoveItem(Gold[i-8])
set loc = GetRectCenter(Gold_Spawn[i-8])
set Gold[i-8] = CreateItem(ITEM1_ID, GetLocationX(loc), GetLocationY(loc))
endif
set i = i + 1
endloop
endif
set p = null
endfunction
//----------------------------------------------------------------
private function TakeGold_Conditions takes nothing returns boolean
local item pickedItem = GetManipulatedItem()
local integer itemType = GetItemTypeId(pickedItem)
local boolean ok = false
if(GetItemType(pickedItem) == ITEM_TYPE_POWERUP) then
set ok = ((itemType == ITEM_ID) or (itemType == ITEM1_ID))
endif
set pickedItem = null
return ok
endfunction
//----------------------------------------------------------------
private function TakeGold_Actions takes nothing returns nothing
local item takenItem = GetManipulatedItem()
local integer i = 0
set i = 0
loop
exitwhen(i >= 4)
if(takenItem == Gold[i]) then
set Gold[i] = null
endif
set i = i + 1
endloop
set takenItem = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger GoldTakenTrg = CreateTrigger()
set FreeGoldTrg = CreateTrigger()
call TriggerRegisterTimerEventPeriodic(FreeGoldTrg, INTERVAL)
call TriggerAddAction(FreeGoldTrg, function Actions)
call DisableTrigger(FreeGoldTrg)
call TriggerRegisterAnyUnitEventBJ(GoldTakenTrg, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(GoldTakenTrg, Condition(function TakeGold_Conditions))
call TriggerAddAction(GoldTakenTrg, function TakeGold_Actions)
//setting globals
set durationSpread = DURATION_SPREAD
set durationSpawn = DURATION_SPAWN
set loc = Location(0, 0)
set Gold_Spawn[0] = gg_rct_Crypt_West
set Gold_Spawn[1] = gg_rct_Crypt_North
set Gold_Spawn[2] = gg_rct_Crypt_East
set Gold_Spawn[3] = gg_rct_Crypt_South
set Gold[0] = null
set Gold[1] = null
set Gold[2] = null
set Gold[3] = null
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope Matchup initializer Init
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local player trigP = GetTriggerPlayer()
local string message = ""
local integer i = 0
local player p = null
local unit u = null
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
set u = GetHero(p)
if(p != trigP) then
if(IsPlayerEnemy(p, trigP)) then
set message = message + GetPlayerName(p) + " controls " + GetUnitName(u) + " ( " + I2S(GetHeroLevel(u)) + ")."
call DisplayTextToPlayer(trigP, 0, 0, message)
endif
endif
set i = i + 1
endloop
set trigP = null
set message = null
set p = null
set u = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger MatchupTrg = CreateTrigger()
call TriggerRegisterPlayerChatEvent(MatchupTrg, Player(0), "-ma", true)
call TriggerRegisterPlayerChatEvent(MatchupTrg, Player(1), "-ma", true)
call TriggerRegisterPlayerChatEvent(MatchupTrg, Player(2), "-ma", true)
call TriggerRegisterPlayerChatEvent(MatchupTrg, Player(3), "-ma", true)
call TriggerRegisterPlayerChatEvent(MatchupTrg, Player(4), "-ma", true)
call TriggerRegisterPlayerChatEvent(MatchupTrg, Player(5), "-ma", true)
call TriggerRegisterPlayerChatEvent(MatchupTrg, Player(6), "-ma", true)
call TriggerRegisterPlayerChatEvent(MatchupTrg, Player(7), "-ma", true)
call TriggerAddAction(MatchupTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope Movespeed initializer Init
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local player playerT = GetTriggerPlayer()
local unit u = GetHero(playerT)
local string message = GetUnitName(u) + " movespeed is " + R2S(GetUnitMoveSpeed(u)) + "."
call DisplayTimedTextToPlayer(playerT, 0, 0, bj_TEXT_DELAY_HINT, message)
set playerT = null
set u = null
set message = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger MovespeedTrg = CreateTrigger()
call TriggerRegisterPlayerChatEvent(MovespeedTrg, Player(0), "-ms", true)
call TriggerRegisterPlayerChatEvent(MovespeedTrg, Player(1), "-ms", true)
call TriggerRegisterPlayerChatEvent(MovespeedTrg, Player(2), "-ms", true)
call TriggerRegisterPlayerChatEvent(MovespeedTrg, Player(3), "-ms", true)
call TriggerRegisterPlayerChatEvent(MovespeedTrg, Player(4), "-ms", true)
call TriggerRegisterPlayerChatEvent(MovespeedTrg, Player(5), "-ms", true)
call TriggerRegisterPlayerChatEvent(MovespeedTrg, Player(6), "-ms", true)
call TriggerRegisterPlayerChatEvent(MovespeedTrg, Player(7), "-ms", true)
call TriggerAddAction(MovespeedTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope Clear initializer Init
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local player p = GetTriggerPlayer()
if(GetLocalPlayer() == p) then
call ClearTextMessages()
endif
set p = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger ClearTrg = CreateTrigger()
call TriggerRegisterPlayerChatEvent(ClearTrg, Player(0), "-clear", true)
call TriggerRegisterPlayerChatEvent(ClearTrg, Player(1), "-clear", true)
call TriggerRegisterPlayerChatEvent(ClearTrg, Player(2), "-clear", true)
call TriggerRegisterPlayerChatEvent(ClearTrg, Player(3), "-clear", true)
call TriggerRegisterPlayerChatEvent(ClearTrg, Player(4), "-clear", true)
call TriggerRegisterPlayerChatEvent(ClearTrg, Player(5), "-clear", true)
call TriggerRegisterPlayerChatEvent(ClearTrg, Player(6), "-clear", true)
call TriggerRegisterPlayerChatEvent(ClearTrg, Player(7), "-clear", true)
call TriggerAddAction(ClearTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=389
//TESH.alwaysfold=0
globals
force Camera_Shortcut = CreateForce()
real array Camera_Distance[12]
boolean array Camera_Lock[12]
boolean array Camera_Locked[12]
constant real MAX_CAMERA_DISTANCE = 3000.0
constant real MIN_CAMERA_DISTANCE = 500.0
endglobals
scope Camera initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant real DEFAULT_DISTANCE = 2200.0
private constant real DEFAULT_SMOOTHING_FACTOR = 1.0
private constant real DURATION = 0.1 //Duration for double click
private constant real DISTANCE_CHANGE = 100.0 //Distance increase or decrease
private constant string LOCK_MESSAGE = "Camera has been locked to your hero." //Locked message
private constant string UNLOCK_MESSAGE = "Camera has been unlocked to your hero." //Unlocked message
private constant string DISTANCE_MESSAGE = "Camera distance is " //Distance update message
private constant string NO_HERO_MESSAGE = "|cffff0000You have no hero yet|r." //No hero message
private constant integer MAX_CLICK = 2 //Clicks required
endglobals
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
//----------------------------------------------------------------
struct Camera_Data
player o //Owner of caster
real t //Time remain
integer m //Mode
integer c //Clicks
integer cm //Max clicks
endstruct
//----------------------------------------------------------------
globals
private integer currentPlayerNum
private timer Tim
private integer Total
private Camera_Data array Ar[100]
endglobals
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local player p = null
local real distance = 0.0
local camerafield cm = null
local unit hero = null
set p = Player(currentPlayerNum)
set hero = GetHero(p)
if(IsPlayerInForce(p, Players) or (GetPlayerState(p, PLAYER_STATE_OBSERVER) > 0)) then
set distance = Camera_Distance[currentPlayerNum]
set cm = CAMERA_FIELD_TARGET_DISTANCE
if(Camera_Lock[currentPlayerNum]) then
if(hero != null) then
if(not IsUnitDead(hero)) then
if(not Camera_Locked[currentPlayerNum]) then
set Camera_Locked[currentPlayerNum] = true
if(GetLocalPlayer() == p) then
call SetCameraTargetController(hero, 0.0, 0.0, false)
endif
endif
else
if(Camera_Locked[currentPlayerNum]) then
set Camera_Locked[currentPlayerNum] = false
if(GetLocalPlayer() == p) then
call ResetToGameCamera(0.0)
call SetCameraField(cm, distance, 0.0)
endif
endif
endif
endif
else
if(Camera_Locked[currentPlayerNum]) then
set Camera_Locked[currentPlayerNum] = false
if(GetLocalPlayer() == p) then
call ResetToGameCamera(0.0)
call SetCameraField(cm, distance, 0.0)
endif
endif
endif
if(GetLocalPlayer() == p) then
call SetCameraField(cm, distance, 1.0)
endif
endif
if(currentPlayerNum < 8) then
set currentPlayerNum = currentPlayerNum + 1
else
set currentPlayerNum = 0
endif
set p = null
set hero = null
set cm = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return true
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Camera_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t > 0.0) then
set sd.t = sd.t - Interval()
else
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Camera_LockUn_Actions takes nothing returns nothing
local Camera_Data sd
local player owner = GetTriggerPlayer()
local integer ownerNum = GetPlayerId(owner)
local integer i = 0
local boolean exist = false
local camerafield cm = null
local unit hero = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.m == 0 and sd.o == owner) then
set exist = true
if(sd.c < sd.cm) then
set sd.c = sd.c + 1
set sd.t = DURATION
else
set sd.t = 0.0
set Camera_Lock[ownerNum] = (not Camera_Lock[ownerNum])
set hero = GetHero(owner)
if(hero != null) then
if(not Camera_Lock[ownerNum]) then
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0.0, 0.0, UNLOCK_MESSAGE)
endif
set cm = CAMERA_FIELD_TARGET_DISTANCE
if(GetLocalPlayer() == owner) then
call ResetToGameCamera(0.0)
call SetCameraField(cm, Camera_Distance[ownerNum], 0.0)
endif
set cm = null
else
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0.0, 0.0, LOCK_MESSAGE)
endif
if(GetLocalPlayer() == owner) then
call SetCameraTargetController(hero, 0.0, 0.0, false)
endif
endif
else
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0.0, 0.0, NO_HERO_MESSAGE)
endif
endif
set hero = null
endif
set i = Total
endif
set i = i + 1
endloop
if(not exist) then
set sd = Camera_Data.create()
set sd.o = owner
set sd.t = DURATION
set sd.m = 0
set sd.c = 1
set sd.cm = MAX_CLICK - 1
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
set owner = null
set cm = null
set hero = null
endfunction
//----------------------------------------------------------------
private function Camera_Increase_Actions takes nothing returns nothing
local Camera_Data sd
local player owner = GetTriggerPlayer()
local integer ownerNum = GetPlayerId(owner)
local integer i = 0
local boolean exist = false
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.m == 1 and sd.o == owner) then
set exist = true
if(sd.c < sd.cm) then
set sd.c = sd.c + 1
set sd.t = DURATION
else
set sd.t = 0.0
if(Camera_Distance[ownerNum] < MAX_CAMERA_DISTANCE) then
set Camera_Distance[ownerNum] = Camera_Distance[ownerNum] + DISTANCE_CHANGE
endif
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0.0, 0.0, DISTANCE_MESSAGE + R2S(Camera_Distance[ownerNum]))
endif
endif
set i = Total
endif
set i = i + 1
endloop
if(not exist) then
set sd = Camera_Data.create()
set sd.o = owner
set sd.t = DURATION
set sd.m = 1
set sd.c = 1
set sd.cm = MAX_CLICK - 1
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
set owner = null
endfunction
//----------------------------------------------------------------
private function Camera_Decrease_Actions takes nothing returns nothing
local Camera_Data sd
local player owner = GetTriggerPlayer()
local integer ownerNum = GetPlayerId(owner)
local integer i = 0
local boolean exist = false
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.m == 2 and sd.o == owner) then
set exist = true
if(sd.c < sd.cm) then
set sd.c = sd.c + 1
set sd.t = DURATION
else
set sd.t = 0.0
if(Camera_Distance[ownerNum] > MIN_CAMERA_DISTANCE) then
set Camera_Distance[ownerNum] = Camera_Distance[ownerNum] - DISTANCE_CHANGE
endif
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0.0, 0.0, DISTANCE_MESSAGE + R2S(Camera_Distance[ownerNum]))
endif
endif
set i = Total
endif
set i = i + 1
endloop
if(not exist) then
set sd = Camera_Data.create()
set sd.o = owner
set sd.t = DURATION
set sd.m = 2
set sd.c = 1
set sd.cm = MAX_CLICK - 1
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
set owner = null
endfunction
//----------------------------------------------------------------
private function Camera_Change_Actions takes nothing returns nothing
local string text = GetEventPlayerChatString()
local string value = SubString(text, 6, StringLength(text))
local player owner = GetTriggerPlayer()
local integer ownerNum = GetPlayerId(owner)
local integer i = 0
local boolean exist = false
local real distance = Camera_Distance[ownerNum]
local integer newDistance = R2I(distance)
set newDistance = S2I(value)
if(newDistance > 0) then
if(newDistance >= MIN_CAMERA_DISTANCE and newDistance <= MAX_CAMERA_DISTANCE) then
else
set newDistance = R2I(distance)
endif
else
set newDistance = R2I(distance)
endif
set Camera_Distance[ownerNum] = I2R(newDistance)
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0.0, 0.0, DISTANCE_MESSAGE + R2S(Camera_Distance[ownerNum]))
endif
set text = null
set value = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Camera_Setting_Conditions takes nothing returns boolean
return IsPlayerInForce(GetTriggerPlayer(), Camera_Shortcut)
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger CameraTrg = CreateTrigger()
local trigger CameraLockUnTrg = CreateTrigger()
local trigger CameraDistanceIncreaseTrg = CreateTrigger()
local trigger CameraDistanceDecreaseTrg = CreateTrigger()
local trigger CameraDistanceChangeTrg = CreateTrigger()
local integer i = 0
call TriggerRegisterTimerEventPeriodic(CameraTrg, 0.5)
call TriggerAddCondition(CameraTrg, Condition(function Conditions))
call TriggerAddAction(CameraTrg, function Actions)
//call DisableTrigger(CameraTrg)
//Setting globals
set currentPlayerNum = 0
set i = 0
loop
exitwhen(i >= 12)
set Camera_Distance[i] = DEFAULT_DISTANCE
set Camera_Lock[i] = false
set Camera_Locked[i] = false
call ForceAddPlayer(Camera_Shortcut, Player(i))
call TriggerRegisterPlayerKeyEventBJ(CameraLockUnTrg, Player(i), bj_KEYEVENTTYPE_DEPRESS, bj_KEYEVENTKEY_LEFT)
//call TriggerRegisterPlayerKeyEventBJ(CameraLockUnTrg, Player(i), bj_KEYEVENTTYPE_DEPRESS, bj_KEYEVENTKEY_RIGHT)
call TriggerRegisterPlayerKeyEventBJ(CameraDistanceIncreaseTrg, Player(i), bj_KEYEVENTTYPE_DEPRESS, bj_KEYEVENTKEY_UP)
call TriggerRegisterPlayerKeyEventBJ(CameraDistanceDecreaseTrg, Player(i), bj_KEYEVENTTYPE_DEPRESS, bj_KEYEVENTKEY_DOWN)
call TriggerRegisterPlayerChatEvent(CameraDistanceChangeTrg, Player(i), "-zoom ", false)
set i = i + 1
endloop
call TriggerAddCondition(CameraLockUnTrg, Condition(function Camera_Setting_Conditions))
call TriggerAddCondition(CameraDistanceIncreaseTrg, Condition(function Camera_Setting_Conditions))
call TriggerAddCondition(CameraDistanceDecreaseTrg, Condition(function Camera_Setting_Conditions))
call TriggerAddCondition(CameraDistanceChangeTrg, Condition(function Camera_Setting_Conditions))
call TriggerAddAction(CameraLockUnTrg, function Camera_LockUn_Actions)
call TriggerAddAction(CameraDistanceIncreaseTrg, function Camera_Increase_Actions)
call TriggerAddAction(CameraDistanceDecreaseTrg, function Camera_Decrease_Actions)
call TriggerAddAction(CameraDistanceChangeTrg, function Camera_Change_Actions)
//call CameraSetSmoothingFactor(DEFAULT_SMOOTHING_FACTOR)
//setting globals
set Tim = CreateTimer()
set Total = 0
endfunction
endscope
//TESH.scrollpos=193
//TESH.alwaysfold=0
globals
force Selecter_Shortcut = CreateForce()
boolean array Selecter_Lock[12]
boolean array Selecter_Locked[12]
endglobals
scope Selecter initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant string LOCK_MESSAGE = "Selecting has been locked to your hero." //Locked message
private constant string UNLOCK_MESSAGE = "Selecting has been unlocked to your hero." //Unlocked message
private constant string NO_HERO_MESSAGE = "|cffff0000You have no hero yet|r." //No hero message
private constant real DURATION = 0.1 //Duration for double click
private constant integer MAX_CLICK = 2 //Clicks required
endglobals
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
//----------------------------------------------------------------
struct Selecter_Data
player o //Owner of caster
real t //Time remain
integer m //Mode
integer c //Clicks
integer cm //Max clicks
endstruct
//----------------------------------------------------------------
globals
private integer currentPlayerNum
private timer Tim
private integer Total
private Selecter_Data array Ar[100]
private force Selecting_Force
endglobals
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local player p = null
local unit hero = null
set p = Player(currentPlayerNum)
set hero = GetHero(p)
if(IsPlayerInForce(p, Players)) then
if(Selecter_Lock[currentPlayerNum]) then
if(hero != null) then
if((not IsUnitDead(hero)) and (IsUnitVisible(hero, p))) then
if(not IsUnitSelected(hero, p)) then
if(GetLocalPlayer() == p) then
//call ClearSelection()
call SelectUnit(hero, true)
endif
endif
endif
endif
endif
endif
if(currentPlayerNum < 8) then
set currentPlayerNum = currentPlayerNum + 1
else
set currentPlayerNum = 0
endif
set p = null
set hero = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return true
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Selecter_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t > 0.0) then
set sd.t = sd.t - Interval()
else
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Selecter_LockUn_Actions takes nothing returns nothing
local Selecter_Data sd
local player owner = GetTriggerPlayer()
local integer ownerNum = GetPlayerId(owner)
local integer i = 0
local boolean exist = false
local unit hero = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.m == 0 and sd.o == owner) then
set exist = true
if(sd.c < sd.cm) then
set sd.c = sd.c + 1
set sd.t = DURATION
else
set sd.t = 0.0
set Selecter_Lock[ownerNum] = (not Selecter_Lock[ownerNum])
set hero = GetHero(owner)
if(hero != null) then
if(not Selecter_Lock[ownerNum]) then
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0.0, 0.0, UNLOCK_MESSAGE)
endif
if((not IsUnitDead(hero)) and (IsUnitVisible(hero, owner))) then
if(GetLocalPlayer() == owner) then
call ClearSelection()
call SelectUnit(hero, false)
endif
endif
else
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0.0, 0.0, LOCK_MESSAGE)
endif
if((not IsUnitDead(hero)) and (IsUnitVisible(hero, owner))) then
if(GetLocalPlayer() == owner) then
call ClearSelection()
call SelectUnit(hero, true)
endif
endif
endif
else
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0.0, 0.0, NO_HERO_MESSAGE)
endif
endif
set hero = null
endif
set i = Total
endif
set i = i + 1
endloop
if(not exist) then
set sd = Selecter_Data.create()
set sd.o = owner
set sd.t = DURATION
set sd.m = 0
set sd.c = 1
set sd.cm = MAX_CLICK - 1
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
set owner = null
set hero = null
endfunction
//----------------------------------------------------------------
private function Selecter_Setting_Conditions takes nothing returns boolean
return IsPlayerInForce(GetTriggerPlayer(), Selecter_Shortcut)
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger SelecterTrg = CreateTrigger()
local trigger SelecterLockUnTrg = CreateTrigger()
local integer i = 0
call TriggerRegisterTimerEventPeriodic(SelecterTrg, 0.1)
call TriggerAddCondition(SelecterTrg, Condition(function Conditions))
call TriggerAddAction(SelecterTrg, function Actions)
//call DisableTrigger(CameraTrg)
//Setting globals
set currentPlayerNum = 0
set i = 0
loop
exitwhen(i >= 12)
set Selecter_Lock[i] = false
set Selecter_Locked[i] = false
call ForceAddPlayer(Selecter_Shortcut, Player(i))
call TriggerRegisterPlayerKeyEventBJ(SelecterLockUnTrg, Player(i), bj_KEYEVENTTYPE_DEPRESS, bj_KEYEVENTKEY_RIGHT)
set i = i + 1
endloop
call TriggerAddCondition(SelecterLockUnTrg, Condition(function Selecter_Setting_Conditions))
call TriggerAddAction(SelecterLockUnTrg, function Selecter_LockUn_Actions)
//setting globals
set Tim = CreateTimer()
set Total = 0
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
globals
multiboard MultiB
constant integer MULTIBOARD_TOTAL_ROW = 7
constant string MULTIBOARD_TITLE = "RoR v3.2l"
constant integer MULTIBOARD_PLAYER_NAME = 0
constant integer MULTIBOARD_PLAYER_REVIVE = 1
constant integer MULTIBOARD_PLAYER_LEVEL = 2
constant integer MULTIBOARD_PLAYER_KILL = 3
constant integer MULTIBOARD_PLAYER_DEATH = 4
constant integer MULTIBOARD_PLAYER_ASSIST = 5
constant integer MULTIBOARD_PLAYER_GOLD = 6
constant real MULTIBOARD_PLAYER_NAME_LENGTH = 0.08
constant real MULTIBOARD_PLAYER_REVIVE_LENGTH = 0.02
constant real MULTIBOARD_PLAYER_LEVEL_LENGTH = 0.02
constant real MULTIBOARD_PLAYER_KILL_LENGTH = 0.02
constant real MULTIBOARD_PLAYER_DEATH_LENGTH = 0.02
constant real MULTIBOARD_PLAYER_ASSIST_LENGTH = 0.02
constant real MULTIBOARD_PLAYER_GOLD_LENGTH = 0.04
constant string MULTIBOARD_PLAYER_NAME_DESC = "Player"
constant string MULTIBOARD_PLAYER_REVIVE_DESC = "R"
constant string MULTIBOARD_PLAYER_LEVEL_DESC = "L"
constant string MULTIBOARD_PLAYER_KILL_DESC = "K"
constant string MULTIBOARD_PLAYER_DEATH_DESC = "D"
constant string MULTIBOARD_PLAYER_ASSIST_DESC = "A"
constant string MULTIBOARD_PLAYER_GOLD_DESC = "Gold"
constant string MULTIBOARD_PLAYER_KILL_COLOR_CODE = "|cffff8080"
constant string MULTIBOARD_PLAYER_REVIVE_COLOR_CODE = "|cff80ffff"
constant string MULTIBOARD_PLAYER_LEVEL_COLOR_CODE = "|cffc0c0c0"
constant string MULTIBOARD_PLAYER_DEATH_COLOR_CODE = "|cff80ff80"
constant string MULTIBOARD_PLAYER_ASSIST_COLOR_CODE = "|cffff8040"
constant string MULTIBOARD_PLAYER_GOLD_COLOR_CODE = "|cffffff80"
constant string MULTIBOARD_PLAYER_NAME_ICON = "UI\\Minimap\\minimap-gold.blp"
constant string MULTIBOARD_PLAYER_REVIVE_ICON = "UI\\Minimap\\minimap-gold.blp"
constant string MULTIBOARD_PLAYER_LEVEL_ICON = "UI\\Minimap\\minimap-gold-entangled.blp"
constant string MULTIBOARD_PLAYER_KILL_ICON = "UI\\Minimap\\minimap-gold-entangled.blp"
constant string MULTIBOARD_PLAYER_DEATH_ICON = "UI\\Minimap\\minimap-gold-haunted.blp"
constant string MULTIBOARD_PLAYER_ASSIST_ICON = "UI\\Minimap\\minimap-gold.blp"
constant string MULTIBOARD_PLAYER_GOLD_ICON = "UI\\Minimap\\minimap-gold.blp"
trigger UpdateMultiBoardTrg
endglobals
scope MBoard initializer Init
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local integer i = 0
local player p = null
local multiboarditem mbItem = null
local string gold = ""
local unit hero = null
local string level = ""
local integer playerId = 0
local integer row = 0
local integer time = R2I(GameTime/60)
local integer killLuminous = LoadInteger(Info_Ht, 13, KILL_NUMBER_KEY)
local integer killOvercast = LoadInteger(Info_Ht, 14, KILL_NUMBER_KEY)
local string reviving = ""
local string tempString = ""
local integer reviveTime = 0
local integer side = -1
local integer count = 0
local boolean exist = false
local integer kill = 0
local integer death = 0
local integer assist = 0
local integer k = 0
local integer d = 0
local integer a = 0
if(GamePhase == GAME_PHASE_START or /*
*/GamePhase == GAME_PHASE_READY or /*
*/GamePhase == GAME_PHASE_END) then
if(IsPlayerInForce(GetLocalPlayer(), Players_Luminous)) then
set side = 0
elseif(IsPlayerInForce(GetLocalPlayer(), Players_Overcast)) then
set side = 1
endif
if(side == 0) then
set reviving = ""
set tempString = "Ally["
set count = 0
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players_Luminous)) then
set p = Player(i)
set playerId = GetPlayerId(p)
set reviveTime = Revive_Time[playerId]
if(reviveTime > 0) then
if(count > 0) then
set tempString = tempString + ","
endif
set tempString = tempString + Player_Colors[playerId] + I2S(reviveTime) + "|r"
set count = count + 1
endif
endif
set i = i + 1
endloop
if(count > 0) then
set reviving = reviving + tempString + "] "
endif
set exist = false
set tempString = "Enemy["
set count = 0
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players_Overcast)) then
set p = Player(i)
set playerId = GetPlayerId(p)
set reviveTime = Revive_Time[playerId]
if(reviveTime > 0) then
if(count > 0) then
set tempString = tempString + ","
endif
set tempString = tempString + Player_Colors[playerId] + I2S(reviveTime) + "|r"
set count = count + 1
endif
endif
set i = i + 1
endloop
if(count > 0) then
set reviving = reviving + tempString + "] "
endif
elseif(side == 1) then
set reviving = ""
set tempString = "Ally["
set count = 0
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players_Overcast)) then
set p = Player(i)
set playerId = GetPlayerId(p)
set reviveTime = Revive_Time[playerId]
if(reviveTime > 0) then
if(count > 0) then
set tempString = tempString + ","
endif
set tempString = tempString + Player_Colors[playerId] + I2S(reviveTime) + "|r"
set count = count + 1
endif
endif
set i = i + 1
endloop
if(count > 0) then
set reviving = reviving + tempString + "] "
endif
set tempString = "Enemy["
set count = 0
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players_Luminous)) then
set p = Player(i)
set playerId = GetPlayerId(p)
set reviveTime = Revive_Time[playerId]
if(reviveTime > 0) then
if(count > 0) then
set tempString = tempString + ","
endif
set tempString = tempString + Player_Colors[playerId] + I2S(reviveTime) + "|r"
set count = count + 1
endif
endif
set i = i + 1
endloop
if(count > 0) then
set reviving = reviving + tempString + "] "
endif
endif
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
set playerId = GetPlayerId(p)
set row = LoadInteger(Info_Ht, playerId, MULTIBOARD_ROW_KEY)
set gold = MULTIBOARD_PLAYER_GOLD_COLOR_CODE + I2S(GetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD)) + "|r"
if(not IsPlayerAlly(GetLocalPlayer(), p)) then
set gold = ""
endif
if(row != 0) then
set mbItem = MultiboardGetItem(MultiB, row, MULTIBOARD_PLAYER_GOLD)
call MultiboardSetItemValue(mbItem, gold)
endif
set hero = GetHero(p)
if(hero != null) then
set level = MULTIBOARD_PLAYER_LEVEL_COLOR_CODE + I2S(GetHeroLevel(hero)) + "|r"
else
set level = "?"
endif
if(row != 0) then
set mbItem = MultiboardGetItem(MultiB, row, MULTIBOARD_PLAYER_LEVEL)
call MultiboardSetItemValue(mbItem, level)
endif
set k = LoadInteger(Info_Ht, playerId, KILL_NUMBER_KEY)
set d = LoadInteger(Info_Ht, playerId, DIE_NUMBER_KEY)
set a = LoadInteger(Info_Ht, playerId, ASSIST_NUMBER_KEY)
if(GetLocalPlayer() == p) then
set kill = k
set death = d
set assist = a
endif
endif
set i = i + 1
endloop
if(time == 1) then
call MultiboardSetTitleText(MultiB, reviving/*
*/ + "K:D:A[" + MULTIBOARD_PLAYER_KILL_COLOR_CODE + I2S(kill) + "|r:" + MULTIBOARD_PLAYER_DEATH_COLOR_CODE + I2S(death) + "|r:" + MULTIBOARD_PLAYER_ASSIST_COLOR_CODE + I2S(assist) + "|r]"/*
*/ + "Team Kills[|cffffffe1" + I2S(killLuminous) + "|r/|cffffffe1" + I2S(killOvercast) + "|r]" + " Time[|cffffffe1" + I2S(time) + " minute|r]")
else
call MultiboardSetTitleText(MultiB, reviving/*
*/ + "K:D:A[" + MULTIBOARD_PLAYER_KILL_COLOR_CODE + I2S(kill) + "|r:" + MULTIBOARD_PLAYER_DEATH_COLOR_CODE + I2S(death) + "|r:" + MULTIBOARD_PLAYER_ASSIST_COLOR_CODE + I2S(assist) + "|r]"/*
*/ + "Team Kills[|cffffffe1" + I2S(killLuminous) + "|r/|cffffffe1" + I2S(killOvercast) + "|r]" + " Time[|cffffffe1" + I2S(time) + " minutes|r]")
endif
set p = Player(13)
set playerId = 13
set row = LoadInteger(Info_Ht, playerId, MULTIBOARD_ROW_KEY)
set gold = MULTIBOARD_PLAYER_GOLD_COLOR_CODE + I2S(GetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD)) + "|r"
if(not IsPlayerAlly(GetLocalPlayer(), p)) then
set gold = ""
endif
if(row != 0) then
set mbItem = MultiboardGetItem(MultiB, row, MULTIBOARD_PLAYER_GOLD)
call MultiboardSetItemValue(mbItem, gold)
endif
set p = Player(14)
set playerId = 14
set row = LoadInteger(Info_Ht, playerId, MULTIBOARD_ROW_KEY)
set gold = MULTIBOARD_PLAYER_GOLD_COLOR_CODE + I2S(GetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD)) + "|r"
if(not IsPlayerAlly(GetLocalPlayer(), p)) then
set gold = ""
endif
if(row != 0) then
set mbItem = MultiboardGetItem(MultiB, row, MULTIBOARD_PLAYER_GOLD)
call MultiboardSetItemValue(mbItem, gold)
endif
else
endif
set p = null
set mbItem = null
set gold = null
set hero = null
set level = null
set reviving = null
set tempString = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set UpdateMultiBoardTrg = CreateTrigger()
call DisableTrigger(UpdateMultiBoardTrg)
call TriggerRegisterTimerEventPeriodic(UpdateMultiBoardTrg, 0.5)
call TriggerAddAction(UpdateMultiBoardTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=6
//TESH.alwaysfold=0
globals
force TipsForce = CreateForce()
force CommentaryForce = CreateForce()
trigger HintTrg = CreateTrigger()
endglobals
scope Tips initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant string MODE_TIPS = "|cff00ff00Wait 15 seconds|r for |cff00ffffNormal|r mode.\n" + /*
*/"|cff00ff00Type -ap|r for |cff00ffffAll pick|r mode.\n" + /*
*/"|cff00ff00Type -ar|r for |cff00ffffAll random|r mode.\n" + /*
*/"|cff00ff00Type -as|r for |cff00ffffAll same|r mode.\n" + /*
*/"|cff00ff00Type -test|r for |cff00ffffTest|r mode.\n\n"
private constant string MODE_TIPS1 = "Wait for a game mode from host (Player 1).\n\n"
private constant string ABOUT_TIPS = "Gameplay tips is explained in the info (f9).\n" + /*
*/"For location tips, type \"-tips\" follow with\n" + /*
*/" 'c' to identify location of |cff00ffffCrypts|r |cff00ff00(-tips c)|r.\n" + /*
*/" 'r' to identify location of |cff00ffffRune of Restorations|r |cff00ff00(-tips r)|r.\n" + /*
*/" 'p' to identify location of |cff00ffffRunical Powers|r |cff00ff00(-tips p)|r.\n" + /*
*/"For enabling tips, type \"-tips on\".\n" + /*
*/"For disabling tips, type \"-tips off\".\n\n"
private constant string SWITCH_TIPS = "Type \"-tips off\" to turn off general tips.\n" + /*
*/"Type \"-tips on\" to turn on general tips.\n\n"
private constant string OBJECTIVE_TIPS = "Your |cff00ff00objective|r is to get the |cffffff00Omnipower|r\n" + /*
*/"by killing the |cff00ff00Relic Revenant|r that has 15 lives.\n" + /*
*/"Becoming the |cff00ff00conqueror|r, you have to |cffff0000survive|r for a duration inside its temple."
private constant string STATUE_SHOP_TIPS = "|cff00ffffStatue Shops|r are here where you can buy powerful items.\n" + /*
*/"Upgrading an item only requires 2 recipients.\n" + /*
*/"Buy from Spirit Birds to get upgraded items.\n\n"
private constant string PILLAR_SHOP_TIPS = "|cff00ffffPillar Shops|r are here where you can obtain utilize power, buy potions and ward.\n\n"
private constant string FOUNTAIN_TIPS = "|cff00ffffFountains|r are here where you can heal your hero life and mana with no cost.\n\n"
private constant string CRYPT_TIPS = "|cff00ffffCrypt|r is where the skeletons are coming from.\n\n"
private constant string WEATHER_TIPS = "|cffff0000Beware of the Weather!|r\n\n"
private constant string STORM_TIPS = WEATHER_TIPS + /*
*/"During |cff00ffffMonsoon Weather|r, thunder will |cffff0000strike|r your hero.\n" + /*
*/"Stay inside the temple to avoid being struck by thunder.\n\n"
private constant string RAIN_TIPS = WEATHER_TIPS + /*
*/"During |cff00ffffRainfall Weather|r, many trees |cffff0000grow|r outside the temple\nand block hero's sight.\n\n"
private constant string TORNADO_TIPS = WEATHER_TIPS + /*
*/"During |cff00ffffTornado Weather|r, a tornado can |cffff0000slows|r your hero greatly.\n\n"
private constant string EARTHQUAKE_TIPS = "During |cff00ffffEarthquake Phenomenon|r, temple is collapsing that will |cffff0000damage|r\nall units inside the temple.\n" + /*
*/"|cffff0000Do not stay there|r.\n\n"
private constant string BLIGHT_TIPS = "During |cff00ffffBlight Phenomenon|r, skeletons and Relic Revenants\ninside the temple are becoming |cffff0000strong|r.\n\n"
private constant string HINDRANCE_TIPS = "During |cff00ffffHindrance Phenomenon|r, gates are closed and temple barriers are formed.\n\n"
private constant string DEATH_ANGEL_TIPS = " has been spawned! Beware... It is a very powerful creature."
private constant string ON_TIPS = "Tips has been enabled."
private constant string OFF_TIPS = "Tips has been disabled."
private constant string ON_ALREADY_TIPS = "Tips are already enabled."
private constant string OFF_ALREADY_TIPS = "Tips are already disabled."
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
function Tips_Death_Angel takes integer num, real x, real y returns nothing
local integer i = 0
local player o = null
set i = 0
loop
exitwhen(i >= 8)
set o = Player(i)
if(IsPlayerInForce(o, TipsForce)) then
call DisplayTextToPlayer(o, 0, 0, "An " + Player_Colors[num] + "Abomination|r" + DEATH_ANGEL_TIPS)
if(GetLocalPlayer() == o) then
call PingMinimap(x, y, 10.0)
endif
endif
set i = i + 1
endloop
set o = null
endfunction
//----------------------------------------------------------------
function Tips_Objective takes player o returns nothing
local player p = o
local real x1 = GetRectCenterX(gg_rct_Temple_Main_Center)
local real y1 = GetRectCenterY(gg_rct_Temple_Main_Center)
local sound s = gg_snd_Hint
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, OBJECTIVE_TIPS)
endif
if(GetLocalPlayer() == p) then
call StartSound(s)
call PingMinimap(x1, y1, 10.0)
//call PingMinimap(x2, y2, 10.0)
//call PingMinimap(x3, y3, 10.0)
//call PingMinimap(x4, y4, 10.0)
endif
set p = null
set s = null
endfunction
//----------------------------------------------------------------
function Tips_Storm takes nothing returns nothing
local integer i = 0
local player o = null
local sound s = gg_snd_Hint
set i = 0
loop
exitwhen(i >= 8)
set o = Player(i)
if(IsPlayerInForce(o, TipsForce)) then
call StartSound(s)
call DisplayTextToPlayer(o, 0, 0, STORM_TIPS)
endif
set i = i + 1
endloop
set o = null
set s = null
endfunction
//----------------------------------------------------------------
function Tips_Rain takes nothing returns nothing
local integer i = 0
local player o = null
local sound s = gg_snd_Hint
set i = 0
loop
exitwhen(i >= 8)
set o = Player(i)
if(IsPlayerInForce(o, TipsForce)) then
call StartSound(s)
call DisplayTextToPlayer(o, 0, 0, RAIN_TIPS)
endif
set i = i + 1
endloop
set o = null
set s = null
endfunction
//----------------------------------------------------------------
function Tips_Tornado takes nothing returns nothing
local integer i = 0
local player o = null
local sound s = gg_snd_Hint
set i = 0
loop
exitwhen(i >= 8)
set o = Player(i)
if(IsPlayerInForce(o, TipsForce)) then
call StartSound(s)
call DisplayTextToPlayer(o, 0, 0, TORNADO_TIPS)
endif
set i = i + 1
endloop
set o = null
set s = null
endfunction
//----------------------------------------------------------------
function Tips_Earthquake takes nothing returns nothing
local integer i = 0
local player o = null
local sound s = gg_snd_Hint
set i = 0
loop
exitwhen(i >= 8)
set o = Player(i)
if(IsPlayerInForce(o, TipsForce)) then
call StartSound(s)
call DisplayTextToPlayer(o, 0, 0, EARTHQUAKE_TIPS)
endif
set i = i + 1
endloop
set o = null
set s = null
endfunction
//----------------------------------------------------------------
function Tips_Blight takes nothing returns nothing
local integer i = 0
local player o = null
local sound s = gg_snd_Hint
set i = 0
loop
exitwhen(i >= 8)
set o = Player(i)
if(IsPlayerInForce(o, TipsForce)) then
call StartSound(s)
call DisplayTextToPlayer(o, 0, 0, BLIGHT_TIPS)
endif
set i = i + 1
endloop
set o = null
set s = null
endfunction
//----------------------------------------------------------------
function Tips_Hindrance takes nothing returns nothing
local integer i = 0
local player o = null
local sound s = gg_snd_Hint
set i = 0
loop
exitwhen(i >= 8)
set o = Player(i)
if(IsPlayerInForce(o, TipsForce)) then
call StartSound(s)
call DisplayTextToPlayer(o, 0, 0, HINDRANCE_TIPS)
endif
set i = i + 1
endloop
set o = null
set s = null
endfunction
//----------------------------------------------------------------
private function On_Actions takes nothing returns nothing
local player triggerP = GetTriggerPlayer()
if(not IsPlayerInForce(triggerP, TipsForce)) then
call DisplayTextToPlayer(triggerP, 0, 0, ON_TIPS)
call DisplayTextToPlayer(triggerP, 0, 0, ABOUT_TIPS)
call ForceAddPlayer(TipsForce, triggerP)
else
call DisplayTextToPlayer(triggerP, 0, 0, ON_ALREADY_TIPS)
call DisplayTextToPlayer(triggerP, 0, 0, ABOUT_TIPS)
endif
set triggerP = null
endfunction
//----------------------------------------------------------------
private function Off_Actions takes nothing returns nothing
local player triggerP = GetTriggerPlayer()
if(IsPlayerInForce(triggerP, TipsForce)) then
call DisplayTextToPlayer(triggerP, 0, 0, OFF_TIPS)
call ForceRemovePlayer(TipsForce, triggerP)
else
call DisplayTextToPlayer(triggerP, 0, 0, OFF_ALREADY_TIPS)
endif
set triggerP = null
endfunction
//----------------------------------------------------------------
private function Tips_Actions takes nothing returns nothing
local player triggerP = GetTriggerPlayer()
call DisplayTextToPlayer(triggerP, 0, 0, SWITCH_TIPS)
set triggerP = null
endfunction
//----------------------------------------------------------------
function Crypt_Actions takes nothing returns nothing
local player owner = GetTriggerPlayer()
local real x1 = GetRectCenterX(gg_rct_Crypt_West)
local real y1 = GetRectCenterY(gg_rct_Crypt_West)
local real x2 = GetRectCenterX(gg_rct_Crypt_South)
local real y2 = GetRectCenterY(gg_rct_Crypt_South)
local real x3 = GetRectCenterX(gg_rct_Crypt_East)
local real y3 = GetRectCenterY(gg_rct_Crypt_East)
local real x4 = GetRectCenterX(gg_rct_Crypt_North)
local real y4 = GetRectCenterY(gg_rct_Crypt_North)
local sound s = gg_snd_Hint
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0, 0, CRYPT_TIPS)
endif
if (GetLocalPlayer() == owner) then
call StartSound(s)
call PingMinimap(x1, y1, 10.0)
call PingMinimap(x2, y2, 10.0)
call PingMinimap(x3, y3, 10.0)
call PingMinimap(x4, y4, 10.0)
endif
set owner = null
set s = null
endfunction
//----------------------------------------------------------------
function Hint_Actions takes nothing returns nothing
local integer i = 0
local player p = null
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, TipsForce)) then
endif
set i = i + 1
endloop
set p = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger TipsTrg = CreateTrigger()
local trigger TipsOnTrg = CreateTrigger()
local trigger TipsOffTrg = CreateTrigger()
local trigger TipsBoatTrg = CreateTrigger()
local trigger TipsCryptTrg = CreateTrigger()
local integer i = 0
local player o = null
set i = 0
loop
exitwhen(i >= 8)
set o = Player(i)
if(IsPlayerInForce(o, Players)) then
call ForceAddPlayer(CommentaryForce, Player(i))
call TriggerRegisterPlayerChatEvent(TipsCryptTrg, o, "-tips c", true)
call TriggerRegisterPlayerChatEvent(TipsOffTrg, o, "-tips off", true)
call TriggerRegisterPlayerChatEvent(TipsOnTrg, o, "-tips on", true)
call TriggerRegisterPlayerChatEvent(TipsTrg, o, "-tips", true)
if(i == 0) then
call DisplayTextToPlayer(o, 0, 0, MODE_TIPS)
else
call DisplayTextToPlayer(o, 0, 0, MODE_TIPS1)
endif
//call DisplayTextToPlayer(o, 0, 0, ABOUT_TIPS)
endif
set i = i + 1
endloop
call TriggerRegisterTimerEventPeriodic(HintTrg, 30.0)
call DisableTrigger(HintTrg)
call TriggerAddAction(HintTrg, function Hint_Actions)
call TriggerAddAction(TipsCryptTrg, function Crypt_Actions)
call TriggerAddAction(TipsOffTrg, function Off_Actions)
call TriggerAddAction(TipsOnTrg, function On_Actions)
call TriggerAddAction(TipsTrg, function Tips_Actions)
set o = null
endfunction
endscope
//TESH.scrollpos=18
//TESH.alwaysfold=0
scope AntiMaphack initializer Init
//----------------------------------------------------------------
globals
private unit array Detector[3]
endglobals
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local player trigP = GetTriggerPlayer()
local string message = ""
local integer i = 0
local integer j = 0
local player p = null
local boolean exist = false
local boolean check = false
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
set message = ""
set exist = false
set j = 0
loop
exitwhen(j >= 3)
if(IsUnitVisible(Detector[j], p)) then
set exist = true
set check = true
set j = 3
endif
set j = j + 1
endloop
if(exist) then
set message = message + Player_Name[i] + " has |cffff0000map always visible|r.\n"
endif
endif
set i = i + 1
endloop
if(not check) then
set message = "No one has map always visible."
call DisplayTextToPlayer(trigP, 0, 0, message)
else
call DisplayTextToPlayer(trigP, 0, 0, message)
endif
set trigP = null
set message = null
set p = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger DetectVisibleTrg = CreateTrigger()
call TriggerRegisterPlayerChatEvent(DetectVisibleTrg, Player(0), "-ah", true)
call TriggerRegisterPlayerChatEvent(DetectVisibleTrg, Player(1), "-ah", true)
call TriggerRegisterPlayerChatEvent(DetectVisibleTrg, Player(2), "-ah", true)
call TriggerRegisterPlayerChatEvent(DetectVisibleTrg, Player(3), "-ah", true)
call TriggerRegisterPlayerChatEvent(DetectVisibleTrg, Player(4), "-ah", true)
call TriggerRegisterPlayerChatEvent(DetectVisibleTrg, Player(5), "-ah", true)
call TriggerRegisterPlayerChatEvent(DetectVisibleTrg, Player(6), "-ah", true)
call TriggerRegisterPlayerChatEvent(DetectVisibleTrg, Player(7), "-ah", true)
call TriggerAddAction(DetectVisibleTrg, function Actions)
//setting globals
set Detector[0] = gg_unit_nsea_0066
set Detector[0] = gg_unit_nsea_0004
set Detector[0] = gg_unit_nsea_0005
endfunction
endscope
//TESH.scrollpos=18
//TESH.alwaysfold=0
globals
group Unit_Inside_Temple
group Unit_Outside_Temple
weathereffect Weather_Effect_Center
endglobals
scope Temple initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer ABILITY_SIGHT_RANGE_ID = 'A006' //Ability sight range
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private rect array Temple_Rect[1]
private integer totalTempleRect
endglobals
//----------------------------------------------------------------
private function Check_Existence takes nothing returns nothing
local unit enumU = GetEnumUnit()
local real enumUX = GetUnitX(enumU)
local real enumUY = GetUnitY(enumU)
local player owner = GetOwningPlayer(enumU)
local rect r = null
local integer i = 0
local boolean check
local sound s = null
set check = false
loop
exitwhen(i > totalTempleRect)
set r = Temple_Rect[i]
if((GetRectMinX(r) <= enumUX) and /*
*/ (enumUX <= GetRectMaxX(r)) and /*
*/ (GetRectMinY(r) <= enumUY) and /*
*/ (enumUY <= GetRectMaxY(r)) and /*
*/check == false) then
//call UnitRemoveAbility(enumU, SIGHT_RANGE_ID)
set check = true
set i = totalTempleRect
endif
set i = i + 1
endloop
if(not check) then
call GroupAddUnit(Unit_Outside_Temple, enumU)
call GroupRemoveUnit(Unit_Inside_Temple, enumU)
//call UnitAddAbility(enumU, ABILITY_SIGHT_RANGE_ID)
endif
set enumU = null
set owner = null
set r = null
set s = null
endfunction
//----------------------------------------------------------------
private function Leave_Actions takes nothing returns nothing
call ForGroup(Unit_Inside_Temple, function Check_Existence)
endfunction
//----------------------------------------------------------------
private function Enter_Actions takes nothing returns nothing
local unit enterer = GetEnteringUnit()
local player owner = GetOwningPlayer(enterer)
local sound s = gg_snd_Enter_Temple
if(IsUnitType(enterer, UNIT_TYPE_HERO)) then
set s = gg_snd_Enter_Temple
if(GetLocalPlayer() == owner) then
call AttachSoundToUnit(s, enterer)
call SetSoundVolume(s, 200)
call StartSound(s)
endif
endif
call GroupAddUnit(Unit_Inside_Temple, enterer)
call GroupRemoveUnit(Unit_Outside_Temple, enterer)
//call UnitRemoveAbility(enterer, ABILITY_SIGHT_RANGE_ID)
if(GetUnitTypeId(enterer) == 'ntor') then
call KillUnit(enterer)
endif
set enterer = null
set owner = null
set s = null
endfunction
//----------------------------------------------------------------
private function Enter_Conditions takes nothing returns boolean
local unit enterer = GetEnteringUnit()
local boolean okey = IsUnitInGroup(enterer, Unit_Outside_Temple) and /*
*/ not IsUnitInGroup(enterer, Unit_Inside_Temple)
set enterer = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger TempleEnterTrg = CreateTrigger()
local trigger TempleLeaveTrg = CreateTrigger()
local integer i = 0
set Unit_Inside_Temple = CreateGroup()
set Unit_Outside_Temple = CreateGroup()
set totalTempleRect = 1
set Temple_Rect[0] = gg_rct_Temple_Center
set Weather_Effect_Center = AddWeatherEffect(gg_rct_Temple_Center, 'FDgh')
call RemoveWeatherEffect(Weather_Effect_Center)
set Weather_Effect_Center = null
loop
exitwhen(i > totalTempleRect)
call TriggerRegisterEnterRectSimple(TempleEnterTrg, gg_rct_Temple_High_Ground)
set i = i + 1
endloop
call TriggerAddCondition(TempleEnterTrg, Condition(function Enter_Conditions))
call TriggerAddAction(TempleEnterTrg, function Enter_Actions)
call TriggerRegisterTimerEventPeriodic(TempleLeaveTrg, 0.5)
call TriggerAddAction(TempleLeaveTrg, function Leave_Actions)
endfunction
endscope
//TESH.scrollpos=123
//TESH.alwaysfold=0
globals
boolean array Gate_Open[4]
boolean array Gate_Openable[4]
destructable array Gate[4]
destructable array Wall[4]
destructable array Wall_Part[4][12]
integer totalGate
constant integer TOTAL_GATE_PART = 12
endglobals
scope Gate initializer Init
//----------------------------------------------------------------
function Operate_West_Gate takes string operation returns nothing
if(operation == "close") then
call ModifyGateBJ(bj_GATEOPERATION_CLOSE, Gate[0])
set Gate_Open[0] = false
elseif(Gate_Openable[0]) then
if(operation == "open") then
call ModifyGateBJ(bj_GATEOPERATION_OPEN, Gate[0])
set Gate_Open[0] = true
else
call ModifyGateBJ(bj_GATEOPERATION_DESTROY, Gate[0])
set Gate_Open[0] = true
endif
endif
set operation = null
endfunction
//----------------------------------------------------------------
function Operate_North_Gate takes string operation returns nothing
if(operation == "close") then
call ModifyGateBJ(bj_GATEOPERATION_CLOSE, Gate[1])
set Gate_Open[1] = false
elseif(Gate_Openable[1]) then
if(operation == "open") then
call ModifyGateBJ(bj_GATEOPERATION_OPEN, Gate[1])
set Gate_Open[1] = true
else
call ModifyGateBJ(bj_GATEOPERATION_DESTROY, Gate[1])
set Gate_Open[1] = true
endif
endif
set operation = null
endfunction
//----------------------------------------------------------------
function Operate_East_Gate takes string operation returns nothing
if(operation == "close") then
call ModifyGateBJ(bj_GATEOPERATION_CLOSE, Gate[2])
set Gate_Open[2] = false
elseif(Gate_Openable[2]) then
if(operation == "open") then
call ModifyGateBJ(bj_GATEOPERATION_OPEN, Gate[2])
set Gate_Open[2] = true
else
call ModifyGateBJ(bj_GATEOPERATION_DESTROY, Gate[2])
set Gate_Open[2] = true
endif
endif
set operation = null
endfunction
//----------------------------------------------------------------
function Operate_South_Gate takes string operation returns nothing
if(operation == "close") then
call ModifyGateBJ(bj_GATEOPERATION_CLOSE, Gate[3])
set Gate_Open[3] = false
elseif(Gate_Openable[3]) then
if(operation == "open") then
call ModifyGateBJ(bj_GATEOPERATION_OPEN, Gate[3])
set Gate_Open[3] = true
else
call ModifyGateBJ(bj_GATEOPERATION_DESTROY, Gate[3])
set Gate_Open[3] = true
endif
endif
set operation = null
endfunction
//----------------------------------------------------------------
function Operate_All_Gate takes string operation returns nothing
local integer i = 0
loop
exitwhen(i >= totalGate)
if(operation == "close") then
call ModifyGateBJ(bj_GATEOPERATION_CLOSE, Gate[i])
set Gate_Open[i] = false
elseif(Gate_Openable[i]) then
if(operation == "open") then
call ModifyGateBJ(bj_GATEOPERATION_OPEN, Gate[i])
set Gate_Open[i] = true
else
call ModifyGateBJ(bj_GATEOPERATION_DESTROY, Gate[i])
set Gate_Open[i] = true
endif
endif
set i = i + 1
endloop
set operation = null
endfunction
//----------------------------------------------------------------
function Operate_Allied_Gate takes string operation, integer playerId returns nothing
local integer i = 0
loop
exitwhen(i >= totalGate)
if(IsPlayerAlly(Player(playerId), Player(i + 8))) then
if(operation == "close") then
call ModifyGateBJ(bj_GATEOPERATION_CLOSE, Gate[i])
set Gate_Open[i] = false
elseif(Gate_Openable[i]) then
if(operation == "open") then
call ModifyGateBJ(bj_GATEOPERATION_OPEN, Gate[i])
set Gate_Open[i] = true
else
call ModifyGateBJ(bj_GATEOPERATION_DESTROY, Gate[i])
set Gate_Open[i] = true
endif
endif
endif
set i = i + 1
endloop
set operation = null
endfunction
//----------------------------------------------------------------
function Control_Gate takes integer index returns nothing
if(Gate_Open[index]) then
call ModifyGateBJ(bj_GATEOPERATION_CLOSE, Gate[index])
set Gate_Open[index] = false
elseif(not Gate_Open[index]) then
if(Gate_Openable[index]) then
call ModifyGateBJ(bj_GATEOPERATION_OPEN, Gate[index])
set Gate_Open[index] = true
endif
else
endif
endfunction
//----------------------------------------------------------------
function Operate_Gate takes integer index, string operation returns nothing
if(operation == "close") then
call ModifyGateBJ(bj_GATEOPERATION_CLOSE, Gate[index])
set Gate_Open[index] = false
elseif(Gate_Openable[index]) then
if(operation == "open") then
call ModifyGateBJ(bj_GATEOPERATION_OPEN, Gate[index])
set Gate_Open[index] = true
else
call ModifyGateBJ(bj_GATEOPERATION_DESTROY, Gate[index])
set Gate_Open[index] = true
endif
endif
set operation = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local integer i = 0
//setting globals
set totalGate = 4
set Gate[0] = gg_dest_ZTg3_0171 //West gate
set Gate[1] = gg_dest_ZTg1_0057 //North gate
set Gate[2] = gg_dest_B001_0055 //East gate
set Gate[3] = gg_dest_B000_0084 //South gate
set Wall[0] = gg_dest_Dofw_0025 //West wall
set Wall[1] = gg_dest_Dofw_0019 //North wall
set Wall[2] = gg_dest_Dofw_0024 //East wall
set Wall[3] = gg_dest_Dofw_0015 //South wall
set Wall_Part[0][0] = gg_dest_YTpb_1497
set Wall_Part[0][1] = gg_dest_YTpb_1496
set Wall_Part[0][2] = gg_dest_YTpb_1495
set Wall_Part[0][3] = gg_dest_YTpb_1494
set Wall_Part[0][4] = gg_dest_YTpb_1490
set Wall_Part[0][5] = gg_dest_YTpb_1491
set Wall_Part[0][6] = gg_dest_YTpb_1492
set Wall_Part[0][7] = gg_dest_YTpb_1493
set Wall_Part[0][8] = gg_dest_YTpb_0309
set Wall_Part[0][9] = gg_dest_YTpb_0308
set Wall_Part[0][10] = gg_dest_YTpb_0305
set Wall_Part[0][11] = gg_dest_YTpb_0307
set Wall_Part[1][0] = gg_dest_YTpb_1498
set Wall_Part[1][1] = gg_dest_YTpb_1499
set Wall_Part[1][2] = gg_dest_YTpb_1500
set Wall_Part[1][3] = gg_dest_YTpb_1501
set Wall_Part[1][4] = gg_dest_YTpb_1502
set Wall_Part[1][5] = gg_dest_YTpb_1503
set Wall_Part[1][6] = gg_dest_YTpb_1504
set Wall_Part[1][7] = gg_dest_YTpb_1505
set Wall_Part[1][8] = gg_dest_YTpb_0292
set Wall_Part[1][9] = gg_dest_YTpb_0291
set Wall_Part[1][10] = gg_dest_YTpb_0290
set Wall_Part[1][11] = gg_dest_YTpb_0295
set Wall_Part[2][0] = gg_dest_YTpb_1509
set Wall_Part[2][1] = gg_dest_YTpb_1510
set Wall_Part[2][2] = gg_dest_YTpb_1511
set Wall_Part[2][3] = gg_dest_YTpb_1513
set Wall_Part[2][4] = gg_dest_YTpb_1514
set Wall_Part[2][5] = gg_dest_YTpb_1515
set Wall_Part[2][6] = gg_dest_YTpb_1516
set Wall_Part[2][7] = gg_dest_YTpb_1517
set Wall_Part[2][8] = gg_dest_YTpb_0300
set Wall_Part[2][9] = gg_dest_YTpb_0299
set Wall_Part[2][10] = gg_dest_YTpb_0301
set Wall_Part[2][11] = gg_dest_YTpb_0303
set Wall_Part[3][0] = gg_dest_YTpb_1527
set Wall_Part[3][1] = gg_dest_YTpb_1528
set Wall_Part[3][2] = gg_dest_YTpb_1529
set Wall_Part[3][3] = gg_dest_YTpb_1530
set Wall_Part[3][4] = gg_dest_YTpb_1518
set Wall_Part[3][5] = gg_dest_YTpb_1524
set Wall_Part[3][6] = gg_dest_YTpb_1525
set Wall_Part[3][7] = gg_dest_YTpb_1526
set Wall_Part[3][8] = gg_dest_YTpb_0313
set Wall_Part[3][9] = gg_dest_YTpb_0312
set Wall_Part[3][10] = gg_dest_YTpb_0315
set Wall_Part[3][11] = gg_dest_YTpb_0316
set i = 0
loop
exitwhen(i >= totalGate)
set Gate_Openable[i] = true
call KillDestructable(Wall[i])
set i = i + 1
endloop
set i = 0
loop
exitwhen(i >= TOTAL_GATE_PART)
call KillDestructable(Wall_Part[0][i])
call KillDestructable(Wall_Part[1][i])
call KillDestructable(Wall_Part[2][i])
call KillDestructable(Wall_Part[3][i])
set i = i + 1
endloop
endfunction
endscope
//TESH.scrollpos=222
//TESH.alwaysfold=0
globals
trigger PhenomenonTrg
boolean PhenomenonOn = false
real PhenomenonTime = 0.0
integer CurrentPhenomenon = 0
integer FuturePhenomenon = 0
boolean PausePhenomenon = true
integer TotalPhenomenon = 4
unit PhenomenonCaster = null
force PhenomenonForce = null
constant integer PHENOMENON_NONE = 0
constant integer PHENOMENON_EARTHQUAKE = 1
constant integer PHENOMENON_BLIGHT = 2
constant integer PHENOMENON_HINDRANCE = 3
integer array Tower_Predict_Phenomenon_Icon[4]
endglobals
scope Phenomenon initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant real TIME_TRIGGER = 150.0 //Time before a phenomenon trigger
private constant real TIME_SET = 30.0 //Time to set a phenomenon
private constant real EARTHQUAKE_DURATION = 60.0 //Duration of earthquake phenomenon
private constant real BLIGHT_DURATION = 120.0 //Duration of blight phenomenon
private constant real HINDRANCE_DURATION = 240.0 //Duration of blight phenomenon
private constant integer VOLUME = 500 //Sound volume
endglobals
//Interval
private function Interval takes nothing returns real
return 1.0
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Phenomenon_Data
group g //Group heroes staying in temple
integer p //Phase
real t //Duration time
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Phenomenon_Data array Ar[2]
private group copy
endglobals
//----------------------------------------------------------------
private function SetTowerPrediction takes integer phenomenon returns nothing
local integer i = 0
loop
exitwhen(i >= TotalPhenomenon)
call UnitRemoveAbility(gg_unit_nmrc_0002, Tower_Predict_Phenomenon_Icon[i])
call UnitRemoveAbility(gg_unit_nmrc_0030, Tower_Predict_Phenomenon_Icon[i])
set i = i + 1
endloop
call UnitAddAbility(gg_unit_nmrc_0002, Tower_Predict_Phenomenon_Icon[phenomenon])
call UnitAddAbility(gg_unit_nmrc_0030, Tower_Predict_Phenomenon_Icon[phenomenon])
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Phenomenon_Data sd
local integer i = 0
local unit f = null
local boolean c = false
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(not PausePhenomenon) then
if(sd.p == 0) then
if(PhenomenonOn) then
set sd.p = 2
else
if(sd.t > 0) then
set sd.t = sd.t - Interval()
set c = false
set copy = CopyGroup(sd.g)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(IsUnitInGroup(f, Unit_Inside_Temple) and /*
*/(not IsUnitDead(f))) then
set c = true
else
call GroupRemoveUnit(sd.g, f)
endif
endloop
if(not c) then
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
else
set sd.p = 1
set sd.t = TIME_SET
set FuturePhenomenon = GetRandomInt(PHENOMENON_NONE + 1, TotalPhenomenon - 1)
call SetTowerPrediction(FuturePhenomenon)
endif
endif
elseif(sd.p == 1) then
if(PhenomenonOn) then
set sd.p = 2
else
if(sd.t > 0) then
set sd.t = sd.t - Interval()
else
set sd.p = 2
set CurrentPhenomenon = FuturePhenomenon
if(CurrentPhenomenon != PHENOMENON_NONE) then
if(CurrentPhenomenon == PHENOMENON_EARTHQUAKE) then
set PhenomenonOn = true
set PhenomenonTime = EARTHQUAKE_DURATION
call EnableTrigger(EarthquakeTrg)
call StartSound(gg_snd_Earthquake)
call SetSoundVolume(gg_snd_Earthquake, VOLUME)
call Tips_Earthquake()
set Earthquake_Damage = 0.0
elseif(CurrentPhenomenon == PHENOMENON_BLIGHT) then
set PhenomenonOn = true
set PhenomenonTime = BLIGHT_DURATION
call EnableTrigger(BlightTrg)
call Tips_Blight()
elseif(CurrentPhenomenon == PHENOMENON_HINDRANCE) then
set PhenomenonOn = true
set PhenomenonTime = HINDRANCE_DURATION
call EnableTrigger(HindranceTrg)
call Tips_Hindrance()
endif
endif
endif
endif
elseif(sd.p == 2) then
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Phenomenon_Data sd
local unit enterer = GetTriggerUnit()
local player owner = GetOwningPlayer(enterer)
local integer i = 0
local boolean team = false
set team = false
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(IsUnitAlly(FirstOfGroup(sd.g), owner)) then
call GroupAddUnit(sd.g, enterer)
set team = true
endif
set i = i + 1
endloop
if(not team and Total < 2) then
if(Ar[Total] == null) then
set sd = Phenomenon_Data.create()
set sd.g = CreateGroup()
set sd.p = 0
set sd.t = TIME_TRIGGER
call GroupAddUnit(sd.g, enterer)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
set sd = Ar[Total]
set sd.p = 0
set sd.t = TIME_TRIGGER
call GroupAddUnit(sd.g, enterer)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
endif
set enterer = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit enterer = GetTriggerUnit()
local boolean okey = IsUnitInGroup(enterer, Heroes) and (not PhenomenonOn)
set enterer = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set PhenomenonTrg = CreateTrigger()
call TriggerRegisterEnterRectSimple(PhenomenonTrg, gg_rct_Temple_High_Ground)
call TriggerAddCondition(PhenomenonTrg, Condition(function Conditions))
call TriggerAddAction(PhenomenonTrg, function Actions)
//setting globals
set Tim = CreateTimer()
set Total = 0
set copy = CreateGroup()
set Tower_Predict_Phenomenon_Icon[0] = 'A07R'
set Tower_Predict_Phenomenon_Icon[1] = 'A07Q'
set Tower_Predict_Phenomenon_Icon[2] = 'A06Z'
set Tower_Predict_Phenomenon_Icon[3] = 'A09E'
call UnitAddAbility(Guardian[0], Tower_Predict_Phenomenon_Icon[0])
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
globals
trigger EarthquakeTrg
real Earthquake_Damage = 0.0
endglobals
scope Earthquake initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant real DURATION = 60.0 //Duration of a phenomenon
private constant real MAGNITUDE = 2.0 //Magnitude shake earthquake
private constant damagetype D_TYPE = DAMAGE_TYPE_DEMOLITION //Spell attack type
private constant attacktype A_TYPE = ATTACK_TYPE_SIEGE //Spell damage type
private constant integer DUMMY_ID = 'n00F' //Unit dummy dust
private constant integer VOLUME = 500 //Sound volume
private constant real FREQUENCY = 0.05 //Frequency increased
endglobals
//Damage
private function Damage takes integer level returns real
return 200.0 + (20.0 * level)
endfunction
//Radius
private function Radius takes integer level returns real
return 300.0 + (0.0 * level)
endfunction
//Dusts per interval
private function Dust_Count takes integer level returns integer
return 5 + (0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and /*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and /*
*/(IsUnitType(target, UNIT_TYPE_ANCIENT) == false) and /*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false)
endfunction
//Interval
private function Interval takes nothing returns real
return 1.0
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private boolexpr bexpr
private group all
private integer sfxTotal = 0
private boolean shake
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
return Targets(GetFilterUnit())
endfunction
//----------------------------------------------------------------
private function Shake_On takes nothing returns nothing
local player p = GetEnumPlayer()
local real magnitude = MAGNITUDE * 2.0
local real velocity = MAGNITUDE * Pow(10, MAGNITUDE)
if(GetLocalPlayer() == p) then
call CameraSetTargetNoiseEx(magnitude, velocity, true)
call CameraSetSourceNoiseEx(magnitude, velocity, true)
endif
set p = null
endfunction
//----------------------------------------------------------------
private function Shake_Off takes nothing returns nothing
local player p = GetEnumPlayer()
if(GetLocalPlayer() == p) then
call CameraSetSourceNoise(0, 0)
call CameraSetTargetNoise(0, 0)
endif
set p = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local real randomX = 0.0
local real randomY = 0.0
local unit f = null
local unit g = null
local integer i = 0
if(PhenomenonTime > 0) then
if(not shake) then
call ForForce(Players, function Shake_On)
set shake = true
endif
set i = 0
loop
exitwhen(i >= Dust_Count(GameLevel))
set randomX = GetRandomReal(GetRectMinX(gg_rct_Temple_High_Ground), GetRectMaxX(gg_rct_Temple_High_Ground))
set randomY = GetRandomReal(GetRectMinY(gg_rct_Temple_High_Ground), GetRectMaxY(gg_rct_Temple_High_Ground))
set f = CreateUnit(Player(PLAYER_NEUTRAL_AGGRESSIVE), DUMMY_ID, randomX, randomY, bj_UNIT_FACING)
call UnitApplyTimedLife(f, 'BTLF', 4.0)
call GroupEnumUnitsInRange(all, randomX, randomY, Radius(GameLevel), bexpr)
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
if(PhenomenonForce != null) then
if(not IsUnitInForce(g, PhenomenonForce)) then
if(PhenomenonCaster != null) then
call UnitDamageTarget(PhenomenonCaster, g, Damage(GameLevel) * Earthquake_Damage, false, false, A_TYPE, D_TYPE, null)
else
call UnitDamageTarget(f, g, Damage(GameLevel) * Earthquake_Damage, false, false, A_TYPE, D_TYPE, null)
endif
endif
else
call UnitDamageTarget(f, g, Damage(GameLevel) * Earthquake_Damage, false, false, A_TYPE, D_TYPE, null)
endif
endloop
set i = i + 1
endloop
if(Earthquake_Damage < 1.0) then
set Earthquake_Damage = Earthquake_Damage + FREQUENCY
endif
set PhenomenonTime = PhenomenonTime - Interval()
if(PhenomenonTime <= 30.0) then
call UnitRemoveAbility(Guardian[0], Tower_Predict_Phenomenon_Icon[PHENOMENON_EARTHQUAKE])
call UnitAddAbility(Guardian[0], Tower_Predict_Phenomenon_Icon[0])
endif
else
call ForForce(Players, function Shake_Off)
call DisableTrigger(EarthquakeTrg)
set PhenomenonOn = false
set shake = false
call StopSound(gg_snd_Earthquake, false, true)
//call setGhoulSpawning( true, true, true, true)
endif
set f = null
set g = null
endfunction
//----------------------------------------------------------------
private function Die_Actions takes nothing returns nothing
local unit dying = GetTriggerUnit()
call RemoveUnit(dying)
set dying = null
endfunction
//----------------------------------------------------------------
private function Die_Conditions takes nothing returns boolean
local unit dying = GetTriggerUnit()
local boolean okey = (GetUnitTypeId(dying) == DUMMY_ID)
set dying = null
return okey
endfunction
//----------------------------------------------------------------
function Trigger_Earthquake takes nothing returns nothing
local integer i = 0
if(not PhenomenonOn) then
set PhenomenonOn = true
set PhenomenonTime = DURATION
set CurrentPhenomenon = PHENOMENON_EARTHQUAKE
call EnableTrigger(EarthquakeTrg)
call StartSound(gg_snd_Earthquake)
call SetSoundVolume(gg_snd_Earthquake, VOLUME)
set Earthquake_Damage = 0
call Tips_Earthquake()
set i = 0
loop
exitwhen(i >= TotalPhenomenon)
call UnitRemoveAbility(Guardian[0], Tower_Predict_Phenomenon_Icon[i])
set i = i + 1
endloop
call UnitAddAbility(Guardian[0], Tower_Predict_Phenomenon_Icon[PHENOMENON_EARTHQUAKE])
else
if(CurrentPhenomenon == PHENOMENON_EARTHQUAKE) then
set PhenomenonTime = DURATION
set Earthquake_Damage = 0
call Tips_Earthquake()
set i = 0
loop
exitwhen(i >= TotalPhenomenon)
call UnitRemoveAbility(Guardian[0], Tower_Predict_Phenomenon_Icon[i])
set i = i + 1
endloop
call UnitAddAbility(Guardian[0], Tower_Predict_Phenomenon_Icon[PHENOMENON_EARTHQUAKE])
endif
endif
endfunction
//----------------------------------------------------------------
function Clear_Earthquake takes nothing returns nothing
if(PhenomenonOn and CurrentPhenomenon == PHENOMENON_EARTHQUAKE) then
call ForForce(Players, function Shake_Off)
call DisableTrigger(EarthquakeTrg)
set PhenomenonOn = false
set CurrentPhenomenon = PHENOMENON_NONE
set shake = false
call StopSound(gg_snd_Earthquake, false, true)
call UnitRemoveAbility(Guardian[0], Tower_Predict_Phenomenon_Icon[PHENOMENON_EARTHQUAKE])
call UnitAddAbility(Guardian[0], Tower_Predict_Phenomenon_Icon[0])
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger EarthquakeDieTrg = CreateTrigger()
set EarthquakeTrg = CreateTrigger()
call TriggerRegisterTimerEventPeriodic(EarthquakeTrg, 1.0)
call TriggerAddAction(EarthquakeTrg, function Actions)
call DisableTrigger(EarthquakeTrg)
call TriggerRegisterAnyUnitEventBJ(EarthquakeDieTrg, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(EarthquakeDieTrg, Condition(function Die_Conditions))
call TriggerAddAction(EarthquakeDieTrg, function Die_Actions)
//setting globals
set shake = false
set bexpr = Condition(function Pick)
set all = CreateGroup()
set sfxTotal = 0
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
globals
trigger BlightTrg
real Blight_Damage = 0.0
endglobals
scope Blight initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer PHENOMENON_BLIGHT_ID = 'FDgh' //Weather green fog environment rawcode
private constant real DURATION = 10.0 //120.0 //Duration of a phenomenon
private constant real RADIUS = 1200.0 //Radius of group
private constant integer ABILITY1_ID = 'A07X' //Ability Blight (Damage) rawcode
private constant integer ABILITY2_ID = 'A07Y' //Ability Blight (Armor) rawcode
private constant integer ABILITY3_ID = 'A07Z' //Ability Blight (Mana Regeneration) rawcode
private constant integer ABILITY4_ID = 'A080' //Ability Blight (Life Regeneration) rawcode
endglobals
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and /*
*/(GetUnitTypeId(target) == 'uske' or GetUnitTypeId(target) == 'uskm' or /*
*/GetUnitTypeId(target) == 'uabo' or GetUnitTypeId(target) == 'unec' or /*
*/GetUnitTypeId(target) == 'Uwar')
endfunction
//Interval
private function Interval takes nothing returns real
return 1.0
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private boolexpr bexpr
private group all
private group copy
private boolean open
private group affected
private rect rct
private integer revenant_index
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
return Targets(GetFilterUnit())
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit f = null
local real fX = 0.0
local real fY = 0.0
local boolean exist = false
local integer level = 1
local real lvl = GameLevel/3
local integer lvl2 = R2I(lvl)
if(PhenomenonTime > 0) then
if(not open) then
set Weather_Effect_Center = AddWeatherEffect(gg_rct_Temple_High_Center, PHENOMENON_BLIGHT_ID)
call EnableWeatherEffect(Weather_Effect_Center, true)
set open = true
set revenant_index = 0
endif
set PhenomenonTime = PhenomenonTime - Interval()
call Awake_Revenants_By_Index(revenant_index)
if(revenant_index < 4) then
set revenant_index = revenant_index + 1
endif
set level = lvl2 + 2
set exist = false
call GroupEnumUnitsInRange(all, 0.0, 0.0, RADIUS, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(PhenomenonForce != null) then
if(PhenomenonCaster != null) then
if(IsUnitAlly(f, GetOwningPlayer(PhenomenonCaster))) then
if(not IsUnitInGroup(f, affected)) then
set exist = true
call GroupAddUnit(affected, f)
call SetUnitAbilityLevel(f, ABILITY1_ID, level)
call SetUnitAbilityLevel(f, ABILITY2_ID, level)
call SetUnitAbilityLevel(f, ABILITY3_ID, level)
call SetUnitAbilityLevel(f, ABILITY4_ID, level)
endif
endif
else
if(not IsUnitInGroup(f, affected)) then
set exist = true
call GroupAddUnit(affected, f)
call SetUnitAbilityLevel(f, ABILITY1_ID, level)
call SetUnitAbilityLevel(f, ABILITY2_ID, level)
call SetUnitAbilityLevel(f, ABILITY3_ID, level)
call SetUnitAbilityLevel(f, ABILITY4_ID, level)
endif
endif
else
if(not IsUnitInGroup(f, affected)) then
set exist = true
call GroupAddUnit(affected, f)
//call UnitAddAbility(f, ABILITY1_ID)
call SetUnitAbilityLevel(f, ABILITY1_ID, level)
//call UnitAddAbility(f, ABILITY2_ID)
call SetUnitAbilityLevel(f, ABILITY2_ID, level)
//call UnitAddAbility(f, ABILITY3_ID)
call SetUnitAbilityLevel(f, ABILITY3_ID, level)
//call UnitAddAbility(f, ABILITY4_ID)
call SetUnitAbilityLevel(f, ABILITY4_ID, level)
endif
endif
endloop
set copy = CopyGroup(affected)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set fX = GetUnitX(f)
set fY = GetUnitY(f)
if(IsUnitDead(f)) then
call GroupRemoveUnit(affected, f)
//call UnitRemoveAbility(f, ABILITY1_ID)
//call UnitRemoveAbility(f, ABILITY2_ID)
//call UnitRemoveAbility(f, ABILITY3_ID)
//call UnitRemoveAbility(f, ABILITY4_ID)
call SetUnitAbilityLevel(f, ABILITY1_ID, 1)
call SetUnitAbilityLevel(f, ABILITY2_ID, 1)
call SetUnitAbilityLevel(f, ABILITY3_ID, 1)
call SetUnitAbilityLevel(f, ABILITY4_ID, 1)
else
if(GetUnitTypeId(f) == 'U000') then
call GroupRemoveUnit(affected, f)
//call UnitRemoveAbility(f, ABILITY1_ID)
//call UnitRemoveAbility(f, ABILITY2_ID)
//call UnitRemoveAbility(f, ABILITY3_ID)
//call UnitRemoveAbility(f, ABILITY4_ID)
call SetUnitAbilityLevel(f, ABILITY1_ID, 1)
call SetUnitAbilityLevel(f, ABILITY2_ID, 1)
call SetUnitAbilityLevel(f, ABILITY3_ID, 1)
call SetUnitAbilityLevel(f, ABILITY4_ID, 1)
else
if(not ((GetRectMinX(rct) <= fX) and /*
*/ (fX <= GetRectMaxX(rct)) and /*
*/ (GetRectMinY(rct) <= fY) and /*
*/ (fY <= GetRectMaxY(rct)))) then
call GroupRemoveUnit(affected, f)
//call UnitRemoveAbility(f, ABILITY1_ID)
//call UnitRemoveAbility(f, ABILITY2_ID)
//call UnitRemoveAbility(f, ABILITY3_ID)
//call UnitRemoveAbility(f, ABILITY4_ID)
call SetUnitAbilityLevel(f, ABILITY1_ID, 1)
call SetUnitAbilityLevel(f, ABILITY2_ID, 1)
call SetUnitAbilityLevel(f, ABILITY3_ID, 1)
call SetUnitAbilityLevel(f, ABILITY4_ID, 1)
else
endif
endif
endif
endloop
if(PhenomenonTime <= 30.0) then
call UnitRemoveAbility(Guardian[0], Tower_Predict_Phenomenon_Icon[PHENOMENON_BLIGHT])
call UnitAddAbility(Guardian[0], Tower_Predict_Phenomenon_Icon[0])
endif
else
loop
set f = FirstOfGroup(affected)
exitwhen(f == null)
call GroupRemoveUnit(affected, f)
//call UnitRemoveAbility(f, ABILITY1_ID)
//call UnitRemoveAbility(f, ABILITY2_ID)
//call UnitRemoveAbility(f, ABILITY3_ID)
//call UnitRemoveAbility(f, ABILITY4_ID)
call SetUnitAbilityLevel(f, ABILITY1_ID, 1)
call SetUnitAbilityLevel(f, ABILITY2_ID, 1)
call SetUnitAbilityLevel(f, ABILITY3_ID, 1)
call SetUnitAbilityLevel(f, ABILITY4_ID, 1)
endloop
set PhenomenonOn = false
set CurrentPhenomenon = PHENOMENON_NONE
set open = false
call DisableTrigger(BlightTrg)
call EnableWeatherEffect(Weather_Effect_Center, false)
call RemoveWeatherEffect(Weather_Effect_Center)
set Weather_Effect_Center = null
endif
set f = null
endfunction
//----------------------------------------------------------------
function Trigger_Blight takes nothing returns nothing
local integer i = 0
if(not PhenomenonOn) then
set PhenomenonOn = true
set PhenomenonTime = DURATION
set CurrentPhenomenon = PHENOMENON_BLIGHT
set open = false
//call Awake_Revenants()
call EnableTrigger(BlightTrg)
call Tips_Blight()
set i = 0
loop
exitwhen(i >= TotalPhenomenon)
call UnitRemoveAbility(Guardian[0], Tower_Predict_Phenomenon_Icon[i])
set i = i + 1
endloop
call UnitAddAbility(Guardian[0], Tower_Predict_Phenomenon_Icon[PHENOMENON_BLIGHT])
else
if(CurrentPhenomenon == PHENOMENON_BLIGHT) then
set PhenomenonTime = DURATION
call Awake_Revenants()
call Tips_Blight()
set i = 0
loop
exitwhen(i >= TotalPhenomenon)
call UnitRemoveAbility(Guardian[0], Tower_Predict_Phenomenon_Icon[i])
set i = i + 1
endloop
call UnitAddAbility(Guardian[0], Tower_Predict_Phenomenon_Icon[PHENOMENON_BLIGHT])
endif
endif
endfunction
//----------------------------------------------------------------
function Clear_Blight takes nothing returns nothing
local unit f = null
if(PhenomenonOn and CurrentPhenomenon == PHENOMENON_BLIGHT) then
set PhenomenonOn = false
set CurrentPhenomenon = PHENOMENON_NONE
set open = false
loop
set f = FirstOfGroup(affected)
exitwhen(f == null)
call GroupRemoveUnit(affected, f)
if(not IsUnitDead(f)) then
//call UnitRemoveAbility(f, ABILITY1_ID)
//call UnitRemoveAbility(f, ABILITY2_ID)
//call UnitRemoveAbility(f, ABILITY3_ID)
//call UnitRemoveAbility(f, ABILITY4_ID)
call SetUnitAbilityLevel(f, ABILITY1_ID, 1)
call SetUnitAbilityLevel(f, ABILITY2_ID, 1)
call SetUnitAbilityLevel(f, ABILITY3_ID, 1)
call SetUnitAbilityLevel(f, ABILITY4_ID, 1)
endif
endloop
call UnitRemoveAbility(Guardian[0], Tower_Predict_Phenomenon_Icon[PHENOMENON_BLIGHT])
call UnitAddAbility(Guardian[0], Tower_Predict_Phenomenon_Icon[0])
call DisableTrigger(BlightTrg)
call EnableWeatherEffect(Weather_Effect_Center, false)
call RemoveWeatherEffect(Weather_Effect_Center)
set Weather_Effect_Center = null
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set BlightTrg = CreateTrigger()
call TriggerRegisterTimerEventPeriodic(BlightTrg, 1.0)
call TriggerAddAction(BlightTrg, function Actions)
call DisableTrigger(BlightTrg)
//setting globals
set bexpr = Condition(function Pick)
set all = CreateGroup()
set copy = CreateGroup()
set open = false
set affected = CreateGroup()
set rct = gg_rct_Temple_Center
set revenant_index = 0
endfunction
endscope
//TESH.scrollpos=50
//TESH.alwaysfold=0
globals
trigger HindranceTrg
endglobals
scope Hindrance initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant real DURATION = 240.0 //Duration of a phenomenon
endglobals
//Interval
private function Interval takes nothing returns real
return 1.0
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private boolean open
endglobals
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local integer i = 0
local integer j = 0
local player p = null
local boolean exist = false
local boolean check = false
local integer random = 0
if(not PausePhenomenon) then
if(PhenomenonTime > 0) then
if(not open) then
set check = false
set i = 0
loop
exitwhen(i >= totalGate)
set p = Player(8 + i)
set exist = false
if(PhenomenonForce != null) then
if(PhenomenonCaster != null) then
if(IsPlayerAlly(p, GetOwningPlayer(PhenomenonCaster))) then
set exist = true
endif
endif
else
if(i + 1 == totalGate and (not check)) then
set exist = false
else
set random = GetRandomInt(1, 2)
if(random == 1) then
set exist = true
endif
endif
endif
if(not exist) then
if(IsPlayerAlly(p, Player(13))) then
call Operate_Allied_Gate("close", 13)
elseif(IsPlayerAlly(p, Player(14))) then
call Operate_Allied_Gate("close", 14)
endif
call DestructableRestoreLife(Wall[i], GetDestructableMaxLife(Wall[i]), false)
call SetDestructableAnimation(Wall[i], "stand")
set j = 0
loop
exitwhen(j >= TOTAL_GATE_PART)
call DestructableRestoreLife(Wall_Part[i][j], GetDestructableMaxLife(Wall_Part[i][j]), false)
set j = j + 1
endloop
else
set check = true
endif
set i = i + 1
endloop
endif
set PhenomenonTime = PhenomenonTime - Interval()
else
call Operate_Allied_Gate("open", 13)
call Operate_Allied_Gate("open", 14)
set i = 0
loop
exitwhen(i >= totalGate)
call KillDestructable(Wall[i])
set j = 0
loop
exitwhen(j >= TOTAL_GATE_PART)
call KillDestructable(Wall_Part[i][j])
set j = j + 1
endloop
set i = i + 1
endloop
call StartSound(gg_snd_Switch)
call DisableTrigger(HindranceTrg)
endif
endif
set p = null
endfunction
//----------------------------------------------------------------
function Trigger_Hindrance takes nothing returns nothing
local integer i = 0
if(not PhenomenonOn) then
set PhenomenonOn = true
set PhenomenonTime = DURATION
set CurrentPhenomenon = PHENOMENON_HINDRANCE
set open = false
call EnableTrigger(HindranceTrg)
call Tips_Hindrance()
set i = 0
loop
exitwhen(i >= TotalPhenomenon)
call UnitRemoveAbility(Guardian[0], Tower_Predict_Phenomenon_Icon[i])
set i = i + 1
endloop
call UnitAddAbility(Guardian[0], Tower_Predict_Phenomenon_Icon[PHENOMENON_HINDRANCE])
else
if(CurrentPhenomenon == PHENOMENON_HINDRANCE) then
set PhenomenonTime = DURATION
call Tips_Hindrance()
set i = 0
loop
exitwhen(i >= TotalPhenomenon)
call UnitRemoveAbility(Guardian[0], Tower_Predict_Phenomenon_Icon[i])
set i = i + 1
endloop
call UnitAddAbility(Guardian[0], Tower_Predict_Phenomenon_Icon[PHENOMENON_HINDRANCE])
endif
endif
endfunction
//----------------------------------------------------------------
function Clear_Hindrance takes nothing returns nothing
if(PhenomenonOn and CurrentPhenomenon == PHENOMENON_HINDRANCE) then
set PhenomenonOn = false
set CurrentPhenomenon = PHENOMENON_NONE
set open = false
set PhenomenonTime = 0.0
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set HindranceTrg = CreateTrigger()
call TriggerRegisterTimerEventPeriodic(HindranceTrg, 1.0)
call TriggerAddAction(HindranceTrg, function Actions)
call DisableTrigger(HindranceTrg)
//setting globals
set open = false
endfunction
endscope
//TESH.scrollpos=404
//TESH.alwaysfold=0
globals
boolean WeatherOn
boolean WeatherDecided
integer CurrentWeather = 0
integer FutureWeather = 0
boolean PauseWeather = true
integer TotalWeather = 4
integer TotalEnvironment = 5
unit WeatherCaster = null
force WeatherForce = null
constant integer WEATHER_NONE = 0
constant integer WEATHER_LIGHT_RAIN = 1
constant integer WEATHER_HEAVY_RAIN = 2
constant integer WEATHER_WINDY = 3
constant integer WEATHER_HEAVY_FOG_WHITE = 4
constant integer WEATHER_LIGHT_FOG_WHITE = 5
integer array Tower_Predict_Weather_Icon[4]
weathereffect array Weather_Effect[9]
boolean array Weather_Effect_Valid[9]
endglobals
scope Weather initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer WEATHER_LIGHT_RAIN_PROB = 1 //Probability of light rain in 100
private constant integer WEATHER_HEAVY_RAIN_PROB = 60 //Probability of heavy rain in 100
private constant integer WEATHER_WINDY_PROB = 100 //Probability of windy rain in 100
private constant integer WEATHER_LIGHT_RAIN_ID = 'RAlr' //Weather light rain environment rawcode
private constant integer WEATHER_HEAVY_RAIN_ID = 'RAhr' //Weather heavy rain environment rawcode
private constant integer WEATHER_WINDY_ID = 'WOlw' //'WNcw' //Weather windy rain environment rawcode
private constant integer WEATHER_LIGHT_FOG_WHITE_ID = 'FDwl' //Weather light white fog environment rawcode
private constant integer WEATHER_HEAVY_FOG_WHITE_ID = 'FDwh' //Weather heavy white fog environment rawcode
private constant real MIN_DURATION_LIGHT_RAIN = 240.0 //Min duration of weather
private constant real MAX_DURATION_LIGHT_RAIN = 240.0 //Max duration of weather
private constant real MIN_DURATION_HEAVY_RAIN = 60.0 //Min duration of weather
private constant real MAX_DURATION_HEAVY_RAIN = 60.0 //Max duration of weather
private constant real MIN_DURATION_WINDY = 120.0 //Min duration of weather
private constant real MAX_DURATION_WINDY = 120.0 //Max duration of weather
//private constant real MIN_WEATHER = 0.0
//private constant real MAX_WEATHER = 360.0
private constant integer VOLUME = 200 //Volume of weather sound
private constant real EARLY_TIME = 210.0//270.0 //Time from beginning before start weather
private constant real PREDICT_TIME = 30.0 //Time before weather start after prediction
private constant real STORM_DELAY = 10.0 //Delay before lightning strike
endglobals
//Interval
private function Interval takes nothing returns real
return 1.0
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Weather_Data
real et //Early time
real pd //Predicting duration
real d //Duration
real dm //Duration max
real ed //Weather effect delay
real cd //Cooldown
boolean c //Is cooldown
endstruct
//----------------------------------------------------------------
globals
private integer totalWeatherEffectRect
private rect array Weather_Effect_Rect[12]
private integer Early_Time
private Weather_Data wd
private integer Total
private timer Tim
private sound s
endglobals
//----------------------------------------------------------------
private function Remove_Tornado takes nothing returns nothing
call KillUnit(GetEnumUnit())
call GroupRemoveUnit(Tornado, GetEnumUnit())
endfunction
//----------------------------------------------------------------
private function SetTowerPrediction takes integer weather returns nothing
local integer i = 0
loop
exitwhen(i >= TotalWeather)
call UnitRemoveAbility(gg_unit_nmrc_0002, Tower_Predict_Weather_Icon[i])
call UnitRemoveAbility(gg_unit_nmrc_0030, Tower_Predict_Weather_Icon[i])
set i = i + 1
endloop
call UnitAddAbility(gg_unit_nmrc_0002, Tower_Predict_Weather_Icon[weather])
call UnitAddAbility(gg_unit_nmrc_0030, Tower_Predict_Weather_Icon[weather])
endfunction
//----------------------------------------------------------------
function Change_Weather takes integer weather, real time returns nothing
local integer i = 0
if(not PauseWeather) then
if(not WeatherOn) then
if(weather == WEATHER_NONE) then
set wd.et = time
set wd.pd = PREDICT_TIME
set wd.d = 0
set wd.dm = 0
set wd.ed = 0
set wd.cd = 0
set wd.c = false
set WeatherOn = false
set WeatherDecided = false
set WeatherForce = null
set WeatherCaster = null
set CurrentWeather = 0
set FutureWeather = 0
call SetTowerPrediction(WEATHER_NONE)
else
set wd.et = 0.0
set wd.pd = 0.0
set FutureWeather = weather
set WeatherDecided = true
set WeatherOn = true
set CurrentWeather = weather
set wd.d = time
set wd.dm = time
set wd.ed = 0
set wd.cd = 0
set wd.c = false
if(weather == WEATHER_WINDY) then
call SetTowerPrediction(WEATHER_WINDY)
set s = gg_snd_Tornado
if(s != null) then
call StartSound(s)
endif
call SetSoundVolume(s, VOLUME)
set i = 1
loop
exitwhen(i >= totalWeatherEffectRect+1)
set Weather_Effect[i] = AddWeatherEffect(Weather_Effect_Rect[i-1], WEATHER_WINDY_ID)
set Weather_Effect_Valid[i] = true
call EnableWeatherEffect(Weather_Effect[i], true)
set i = i + 1
endloop
call EnableTrigger(TornadoTrg)
call Tips_Tornado()
elseif(weather == WEATHER_HEAVY_RAIN) then
call SetTowerPrediction(WEATHER_HEAVY_RAIN)
set s = gg_snd_Storm
if(s != null) then
call StartSound(s)
endif
call SetSoundVolume(s, VOLUME)
set i = 1
loop
exitwhen(i >= totalWeatherEffectRect+1)
set Weather_Effect[i] = AddWeatherEffect(Weather_Effect_Rect[i-1], WEATHER_HEAVY_RAIN_ID)
set Weather_Effect_Valid[i] = true
call EnableWeatherEffect(Weather_Effect[i], true)
set i = i + 1
endloop
set wd.ed = STORM_DELAY
call Tips_Storm()
elseif(weather == WEATHER_LIGHT_RAIN) then
call SetTowerPrediction(WEATHER_LIGHT_RAIN)
set s = gg_snd_Overgrow
call EnableTrigger(OvergrowTrg)
set TREE_REVIVE_TIME = 5.0
call ReviveAllTree()
call CreateExtraTree()
if(s != null) then
call StartSound(s)
endif
call SetSoundVolume(s, VOLUME)
set i = 1
loop
exitwhen(i >= totalWeatherEffectRect+1)
set Weather_Effect[i] = AddWeatherEffect(Weather_Effect_Rect[i-1], WEATHER_LIGHT_RAIN_ID)
set Weather_Effect_Valid[i] = true
call EnableWeatherEffect(Weather_Effect[i], true)
set i = i + 1
endloop
call Tips_Rain()
endif
endif
else
set wd.et = 0.0
call StopSound(s, false, true)
set i = 0
loop
exitwhen(i >= totalWeatherEffectRect+1)
if(Weather_Effect_Valid[i]) then
call EnableWeatherEffect(Weather_Effect[i], false)
call RemoveWeatherEffect(Weather_Effect[i])
set Weather_Effect[i] = null
set Weather_Effect_Valid[i] = false
endif
set i = i + 1
endloop
if(IsTriggerEnabled(TornadoTrg)) then
call ForGroup(Tornado, function Remove_Tornado)
call DisableTrigger(TornadoTrg)
endif
if(IsTriggerEnabled(StormTrg)) then
call DisableTrigger(StormTrg)
endif
if(IsTriggerEnabled(OvergrowTrg)) then
call DisableTrigger(OvergrowTrg)
set TREE_REVIVE_TIME = 90.0
endif
call RemoveExtraTree()
set WeatherOn = true
set CurrentWeather = weather
set WeatherForce = null
set WeatherCaster = null
set wd.d = time
set wd.dm = time
set wd.cd = time
set wd.c = false
if(weather == WEATHER_NONE) then
set wd.et = time
set wd.pd = PREDICT_TIME
set wd.d = 0
set wd.dm = 0
set wd.ed = 0
set wd.cd = 0
set wd.c = false
set WeatherOn = false
set WeatherDecided = false
set CurrentWeather = 0
set FutureWeather = 0
call SetTowerPrediction(WEATHER_NONE)
elseif(weather == WEATHER_WINDY) then
call SetTowerPrediction(WEATHER_WINDY)
set s = gg_snd_Tornado
if(s != null) then
call StartSound(s)
endif
call SetSoundVolume(s, VOLUME)
set i = 1
loop
exitwhen(i >= totalWeatherEffectRect+1)
set Weather_Effect[i] = AddWeatherEffect(Weather_Effect_Rect[i-1], WEATHER_WINDY_ID)
set Weather_Effect_Valid[i] = true
call EnableWeatherEffect(Weather_Effect[i], true)
set i = i + 1
endloop
call EnableTrigger(TornadoTrg)
call Tips_Tornado()
elseif(weather == WEATHER_HEAVY_RAIN) then
call SetTowerPrediction(WEATHER_HEAVY_RAIN)
set s = gg_snd_Storm
if(s != null) then
call StartSound(s)
endif
call SetSoundVolume(s, VOLUME)
set i = 1
loop
exitwhen(i >= totalWeatherEffectRect+1)
set Weather_Effect[i] = AddWeatherEffect(Weather_Effect_Rect[i-1], WEATHER_HEAVY_RAIN_ID)
set Weather_Effect_Valid[i] = true
call EnableWeatherEffect(Weather_Effect[i], true)
set i = i + 1
endloop
set wd.ed = STORM_DELAY
call Tips_Storm()
elseif(weather == WEATHER_LIGHT_RAIN) then
call SetTowerPrediction(WEATHER_LIGHT_RAIN)
set s = gg_snd_Overgrow
call EnableTrigger(OvergrowTrg)
set TREE_REVIVE_TIME = 5.0
call ReviveAllTree()
call CreateExtraTree()
if(s != null) then
call StartSound(s)
endif
call SetSoundVolume(s, VOLUME)
set i = 1
loop
exitwhen(i >= totalWeatherEffectRect+1)
set Weather_Effect[i] = AddWeatherEffect(Weather_Effect_Rect[i-1], WEATHER_LIGHT_RAIN_ID)
set Weather_Effect_Valid[i] = true
call EnableWeatherEffect(Weather_Effect[i], true)
set i = i + 1
endloop
call Tips_Rain()
endif
endif
else
//Message weather is turned off
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local integer randomWeather = 0
local real randomDuration = 0.0
local integer i = 0
if(not PauseWeather) then
if(wd.et > 0) then
set wd.et = wd.et - Interval()
elseif(not WeatherDecided) then
set randomWeather = GetRandomInt(1, 100)
set WeatherDecided = true
if(randomWeather > WEATHER_WINDY_PROB) then
set FutureWeather = WEATHER_WINDY
call SetTowerPrediction(WEATHER_WINDY)
elseif(randomWeather > WEATHER_HEAVY_RAIN_PROB) then
set FutureWeather = WEATHER_HEAVY_RAIN
call SetTowerPrediction(WEATHER_HEAVY_RAIN)
elseif(randomWeather > WEATHER_LIGHT_RAIN_PROB) then
set FutureWeather = WEATHER_LIGHT_RAIN
call SetTowerPrediction(WEATHER_LIGHT_RAIN)
endif
elseif(wd.pd > 0) then
set wd.pd = wd.pd - Interval()
elseif(not WeatherOn) then
set WeatherOn = true
set CurrentWeather = FutureWeather
if(FutureWeather == WEATHER_WINDY) then
set wd.d = GetRandomReal(MIN_DURATION_WINDY, MAX_DURATION_WINDY)
set wd.dm = wd.d
set s = gg_snd_Tornado
if(s != null) then
call StartSound(s)
endif
call SetSoundVolume(s, VOLUME)
set i = 1
loop
exitwhen(i >= totalWeatherEffectRect+1)
set Weather_Effect[i] = AddWeatherEffect(Weather_Effect_Rect[i-1], WEATHER_WINDY_ID)
set Weather_Effect_Valid[i] = true
call EnableWeatherEffect(Weather_Effect[i], true)
set i = i + 1
endloop
call EnableTrigger(TornadoTrg)
call Tips_Tornado()
elseif(FutureWeather == WEATHER_HEAVY_RAIN) then
set wd.d = GetRandomReal(MIN_DURATION_HEAVY_RAIN, MAX_DURATION_HEAVY_RAIN)
set wd.dm = wd.d
set s = gg_snd_Storm
if(s != null) then
call StartSound(s)
endif
call SetSoundVolume(s, VOLUME)
set i = 1
loop
exitwhen(i >= totalWeatherEffectRect+1)
set Weather_Effect[i] = AddWeatherEffect(Weather_Effect_Rect[i-1], WEATHER_HEAVY_RAIN_ID)
set Weather_Effect_Valid[i] = true
call EnableWeatherEffect(Weather_Effect[i], true)
set i = i + 1
endloop
set wd.ed = STORM_DELAY
set i = 0
loop
exitwhen(i >= 8)
set StormDamagePercent[i] = 0.0
set i = i + 1
endloop
call Tips_Storm()
elseif(FutureWeather == WEATHER_LIGHT_RAIN) then
set wd.d = GetRandomReal(MIN_DURATION_LIGHT_RAIN, MAX_DURATION_LIGHT_RAIN)
set wd.dm = wd.d
set s = gg_snd_Overgrow
call EnableTrigger(OvergrowTrg)
set TREE_REVIVE_TIME = 5.0
call ReviveAllTree()
call CreateExtraTree()
if(s != null) then
call StartSound(s)
endif
call SetSoundVolume(s, VOLUME)
set i = 1
loop
exitwhen(i >= totalWeatherEffectRect+1)
set Weather_Effect[i] = AddWeatherEffect(Weather_Effect_Rect[i-1], WEATHER_LIGHT_RAIN_ID)
set Weather_Effect_Valid[i] = true
call EnableWeatherEffect(Weather_Effect[i], true)
set i = i + 1
endloop
call Tips_Rain()
endif
elseif(not wd.c) then
if(wd.dm > 0) then
set wd.dm = wd.dm - Interval()
if(CurrentWeather == WEATHER_HEAVY_RAIN) then
if(wd.ed > 0) then
set wd.ed = wd.ed - Interval()
else
call EnableTrigger(StormTrg)
endif
endif
if(wd.dm <= PREDICT_TIME and FutureWeather != WEATHER_NONE) then
set FutureWeather = WEATHER_NONE
call SetTowerPrediction(WEATHER_NONE)
endif
else
call StopSound(s, false, true)
set i = 0
loop
exitwhen(i >= totalWeatherEffectRect+1)
if(Weather_Effect_Valid[i]) then
call EnableWeatherEffect(Weather_Effect[i], false)
call RemoveWeatherEffect(Weather_Effect[i])
set Weather_Effect[i] = null
set Weather_Effect_Valid[i] = false
else
endif
set i = i + 1
endloop
if(IsTriggerEnabled(TornadoTrg)) then
call ForGroup(Tornado, function Remove_Tornado)
call DisableTrigger(TornadoTrg)
endif
if(IsTriggerEnabled(StormTrg)) then
call DisableTrigger(StormTrg)
endif
if(IsTriggerEnabled(OvergrowTrg)) then
call DisableTrigger(OvergrowTrg)
set TREE_REVIVE_TIME = 90.0
call KillExtraTree()
endif
if(CurrentWeather == WEATHER_LIGHT_RAIN) then
set CurrentWeather = WEATHER_HEAVY_FOG_WHITE
set wd.dm = EARLY_TIME //wd.d / 4
call RemoveExtraTree()
set i = 1
loop
exitwhen(i >= totalWeatherEffectRect+1)
set Weather_Effect[i] = AddWeatherEffect(Weather_Effect_Rect[i-1], WEATHER_LIGHT_FOG_WHITE_ID)
set Weather_Effect_Valid[i] = true
call EnableWeatherEffect(Weather_Effect[i], true)
set i = i + 1
endloop
elseif(CurrentWeather == WEATHER_HEAVY_RAIN) then
set CurrentWeather = WEATHER_HEAVY_FOG_WHITE
set wd.dm = wd.d / 4
set i = 1
loop
exitwhen(i >= totalWeatherEffectRect+1)
set Weather_Effect[i] = AddWeatherEffect(Weather_Effect_Rect[i-1], WEATHER_HEAVY_FOG_WHITE_ID)
set Weather_Effect_Valid[i] = true
call EnableWeatherEffect(Weather_Effect[i], true)
set i = i + 1
endloop
else
set wd.cd = wd.d
set wd.c = true
endif
endif
else
if(wd.cd > 0) then
set wd.cd = wd.cd - Interval()
else
set wd.c = false
set WeatherOn = false
set WeatherDecided = false
set WeatherForce = null
set WeatherCaster = null
set wd.pd = PREDICT_TIME
set CurrentWeather = WEATHER_NONE
endif
endif
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local integer i = 0
set wd = Weather_Data.create()
set WeatherOn = false
set WeatherDecided = false
set Early_Time = 0
set Tim = CreateTimer()
set Total = 0
set wd.et = EARLY_TIME
set wd.pd = PREDICT_TIME
set wd.d = 0
set wd.dm = 0
set wd.ed = 0
set wd.cd = 0
set wd.c = false
set totalWeatherEffectRect = 8
set Weather_Effect_Rect[0] = gg_rct_Temple_North_West
set Weather_Effect_Rect[1] = gg_rct_Temple_West
set Weather_Effect_Rect[2] = gg_rct_Temple_South_West
set Weather_Effect_Rect[3] = gg_rct_Temple_South
set Weather_Effect_Rect[4] = gg_rct_Temple_South_East
set Weather_Effect_Rect[5] = gg_rct_Temple_East
set Weather_Effect_Rect[6] = gg_rct_Temple_North_East
set Weather_Effect_Rect[7] = gg_rct_Temple_North
set i = 0
loop
exitwhen(i >= 9)
set Weather_Effect[i] = null
set Weather_Effect_Valid[i] = false
set i = i + 1
endloop
call TimerStart(Tim, Interval(), true, function Actions)
set Tower_Predict_Weather_Icon[0] = 'A046'
set Tower_Predict_Weather_Icon[1] = 'A045'
set Tower_Predict_Weather_Icon[2] = 'A044'
set Tower_Predict_Weather_Icon[3] = 'A043'
call UnitAddAbility(Guardian[0], Tower_Predict_Weather_Icon[0])
endfunction
endscope
//TESH.scrollpos=5
//TESH.alwaysfold=0
globals
sound array Weather_Sound_Thunder[4]
integer Weather_Sound_Thunder_Count = 4
trigger StormTrg
real array StormDamagePercent[8]
endglobals
scope Storm initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer MIN_HIT = 1 //Minimum percentage to hit heroes
private constant integer MAX_HIT = 100 //Maximum percentage to hit heroes
private constant integer MIN_DISTANCE = 0 //Minimum distance from Thunder
private constant integer MAX_DISTANCE = 100 //Maximum distance from Thunder
private constant integer MIN_SOURCE = 0 //Minimum source of Thunder
private constant integer MAX_SOURCE = 2000 //Maximum source of Thunder
private constant real MIN_SOUND_TIME = 1.0 //Min sound time
private constant real MAX_SOUND_TIME = 3.0 //Max sound time
private constant real MIN_LIGHTNING_TIME = 0.5 //Min lightning time
private constant real MAX_LIGHTNING_TIME = 1.0 //Max lightning time
private constant real RADIUS = 200.0 //Radius of Thunder
private constant integer LIGHTNING_ID = 'n00E' //Lightning dummy
private constant real MIN_LIGHTNING_DURATION = 0.5 //Lightning duration
private constant real MAX_LIGHTNING_DURATION = 1.0 //Lightning duration
private constant damagetype D_TYPE = DAMAGE_TYPE_UNIVERSAL //Spell attack type
private constant attacktype A_TYPE = ATTACK_TYPE_CHAOS //Spell damage type
private constant string SPELL_EFFECT = "Abilities\\Weapons\\Bolt\\BoltImpact.mdl" //War stomp effect
endglobals
//Probability percentage
private function Probability takes integer level returns integer
return 100 + (0 * level)
endfunction
//Min damage percentage
private function Min_Damage takes integer level returns real
return 0.05 + (0.00 * level)
endfunction
//Min damage
private function Max_Damage takes integer level returns real
return 0.05 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and /*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and /*
*/(IsUnitType(target, UNIT_TYPE_ANCIENT) == false) and /*
*/(IsUnitType(target, UNIT_TYPE_HERO) == true) and /*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Storm_Data
real st //Sound time
real lt //Lightning unit time
real gt //Lightning time
real x //Sound x
real y //Sound y
unit l //Lightning unit
lightning g //Lightning
endstruct
//----------------------------------------------------------------
globals
private group all
private boolexpr bexpr
private location loc
private Storm_Data array Ar[100]
private timer Tim
private integer Total
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
return Targets(GetFilterUnit())
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Storm_Data sd
local integer i = 0
local sound thunderSound = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.st > 0) then
set sd.st = sd.st - Interval()
else
/*set thunderSound = Weather_Sound_Thunder[GetRandomInt(0, Weather_Sound_Thunder_Count - 1)]
call SetSoundPosition(thunderSound, sd.x, sd.y, 0)
call SetSoundVolume(thunderSound, 100)
call StartSound(thunderSound)*/
endif
if(sd.lt > 0) then
set sd.lt = sd.lt - Interval()
else
call RemoveUnit(sd.l)
endif
if(sd.gt > 0) then
set sd.gt = sd.gt - Interval()
else
call DestroyLightning(sd.g)
set sd.g = null
endif
if(sd.st <= 0 and sd.lt <= 0 and sd.gt <= 0) then
set sd.l = null
set sd.g = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set thunderSound = null
endfunction
//----------------------------------------------------------------
private function Thunder_Actions takes nothing returns nothing
local Storm_Data sd
local unit enumU = GetEnumUnit()
local real enumX = GetUnitX(enumU)
local real enumY = GetUnitY(enumU)
local player owner = GetOwningPlayer(enumU)
local integer ownerNum = GetPlayerId(owner)
local real targetX = 0.0
local real targetY = 0.0
local real damage = 0.0
local real distance = 0.0
local real source = 0.0
local real angle = 0.0
local real angle2 = 0.0
local integer hit = GetRandomInt(MIN_HIT, MAX_HIT)
local real life = GetUnitState(enumU, UNIT_STATE_LIFE)
local real maxLife = GetUnitState(enumU, UNIT_STATE_MAX_LIFE)
local unit f = null
if(hit <= Probability(GameLevel) and /*
*/IsUnitInGroup(enumU, Unit_Outside_Temple) and /*
*/(GetUnitAbilityLevel(enumU, 'Avul') <= 0) and /*
*/not ((enumX >= GetRectMinX(gg_rct_Temple_Center) and enumX <= GetRectMaxX(gg_rct_Temple_Center)) and /*
*/(enumY >= GetRectMinY(gg_rct_Temple_Center) and enumY <= GetRectMaxY(gg_rct_Temple_Center))) and /*
*/GetUnitAbilityLevel(enumU, 'B027') <= 0 and /*
*/(not IsUnitDead(enumU)) and /*
*/(not IsUnitInForce(enumU, WeatherForce))) then
set sd = Storm_Data.create()
set StormDamagePercent[ownerNum] = StormDamagePercent[ownerNum] + GetRandomReal(Min_Damage(GameLevel), Max_Damage(GameLevel))
set damage = life * StormDamagePercent[ownerNum]//I2R(GetRandomInt(Min_Damage(GameLevel), Max_Damage(GameLevel)))
set distance = I2R(GetRandomInt(MIN_DISTANCE, MAX_DISTANCE))
set source = I2R(GetRandomInt(MIN_SOURCE, MAX_SOURCE))
set angle = I2R(GetRandomInt(0, 360)) * bj_DEGTORAD
set angle2 = I2R(GetRandomInt(0, 360)) * bj_DEGTORAD
set targetX = enumX + distance * Cos(angle)
set targetY = enumY + distance * Sin(angle)
call MoveLocation(loc, targetX, targetY)
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, targetX, targetY))
set sd.g = AddLightningEx("FORK", true, enumX + source * Cos(angle2), enumY + source * Sin(angle2), 4000.0, targetX, targetY, GetLocationZ(loc))
set sd.gt = GetRandomReal(MIN_LIGHTNING_DURATION, MAX_LIGHTNING_DURATION)
set sd.st = GetRandomReal(MIN_SOUND_TIME, MAX_SOUND_TIME)
set sd.lt = GetRandomReal(MIN_LIGHTNING_TIME, MAX_LIGHTNING_TIME)
set sd.x = targetX
set sd.y = targetY
set sd.l = CreateUnit(Player(PLAYER_NEUTRAL_AGGRESSIVE), LIGHTNING_ID, targetX, targetY, bj_UNIT_FACING)
call SetUnitScale(sd.l, 100, 100, 1)
call GroupEnumUnitsInRange(all, targetX, targetY, RADIUS, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(WeatherForce != null) then
if(not IsUnitInForce(f, WeatherForce)) then
if(WeatherCaster != null) then
call UnitDamageTarget(WeatherCaster, f, damage, false, false, A_TYPE, D_TYPE, null)
else
call UnitDamageTarget(sd.l, f, damage, false, false, A_TYPE, D_TYPE, null)
endif
endif
else
call UnitDamageTarget(sd.l, f, damage, false, false, A_TYPE, D_TYPE, null)
endif
endloop
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
set enumU = null
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
call ForGroup(Heroes, function Thunder_Actions)
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return not PauseWeather
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local integer i = 0
set StormTrg = CreateTrigger()
call TriggerRegisterTimerEventPeriodic(StormTrg, 5.0)
call TriggerAddCondition(StormTrg, Condition(function Conditions))
call TriggerAddAction(StormTrg, function Actions)
call DisableTrigger(StormTrg)
//setting globals
set all = CreateGroup()
set bexpr = Condition(function Pick)
set loc = Location(0, 0)
set Tim = CreateTimer()
set Total = 0
set Weather_Sound_Thunder_Count = 0
//set Weather_Sound_Thunder[0] = gg_snd_Lightning_Strike1
//set Weather_Sound_Thunder[1] = gg_snd_Lightning_Strike2
//set Weather_Sound_Thunder[2] = gg_snd_Lightning_Strike3
set i = 0
loop
exitwhen(i >= 8)
set StormDamagePercent[i] = 0.0
set i = i + 1
endloop
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
globals
trigger OvergrowTrg
endglobals
scope Overgrow initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer CAST_ID = 'Aenr' //Cast Overgrow rawcode
endglobals
//Probability to entangle
private function Probability takes integer level returns integer
return 100 + (0 * level)
endfunction
//Radius to entangle
private function Radius takes integer level returns real
return 300.0 + (0.0 * level)
endfunction
//Trees nearby
private function Targets takes unit target returns boolean
local destructable enumD = GetFilterDestructable()
local integer enumID = GetDestructableTypeId(enumD)
return (GetDestructableLife(enumD) > 0 and /*
*/ (enumID == TREE1_ID or/*
*/ enumID == TREE2_ID))
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private boolexpr bexpr
private rect rt
private integer count
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
return Targets(GetFilterUnit())
endfunction
//----------------------------------------------------------------
private function Count takes nothing returns nothing
set count = count + 1
endfunction
//----------------------------------------------------------------
private function Overgrow_Actions takes nothing returns nothing
local unit enumU = GetEnumUnit()
local real enumX = GetUnitX( enumU)
local real enumY = GetUnitY( enumU)
call SetRect(rt, enumX - Radius(GameLevel), enumY - Radius(GameLevel), /*
*/enumX + Radius(GameLevel), enumY + Radius(GameLevel))
set count = 0
call EnumDestructablesInRect(rt, bexpr, function Count)
if(count > 0) then
if(WeatherForce != null) then
if(WeatherCaster != null) then
call TargetCast(GetOwningPlayer(WeatherCaster), enumX, enumY, 2.0, CAST_ID, ModuloInteger(GameLevel, 3), "", 0, enumU)
else
//call TargetCast(Player(PLAYER_NEUTRAL_AGGRESSIVE), enumX, enumY, 2.0, CAST_ID, ModuloInteger(GameLevel, 3), "", 0, enumU)
endif
else
//call TargetCast(Player(PLAYER_NEUTRAL_AGGRESSIVE), enumX, enumY, 2.0, CAST_ID, ModuloInteger(GameLevel, 3), "", 0, enumU)
endif
endif
set enumU = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local integer hit = 0 //GetRandomInt(1, 100)
if(hit <= Probability(GameLevel)) then
call ForGroup(Heroes, function Overgrow_Actions)
endif
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return not PauseWeather
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set OvergrowTrg = CreateTrigger()
call TriggerRegisterTimerEventPeriodic(OvergrowTrg, 4.0)
call TriggerAddCondition(OvergrowTrg, Condition(function Conditions))
call TriggerAddAction(OvergrowTrg, function Actions)
call DisableTrigger(OvergrowTrg)
//setting globals
set bexpr = Condition(function Pick)
set rt = Rect(0, 0, 0, 0)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
globals
trigger TornadoTrg = CreateTrigger()
group Tornado = CreateGroup()
endglobals
scope Tornado initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer TORNADO_ID = 'ntor' //Unit tornado rawcode
private constant integer ABILITY_ID = 'Aasl' //Ability slow aura rawcode
endglobals
//Number of tornado per location
private function Max_Tornado takes integer level returns integer
return 3 + (0 * level)
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private integer Total_Tornado
private rect array Spawn_Tornado[4]
private group TornadoNorthWest
private group TornadoSouthWest
private group TornadoNorthEast
private group TornadoSouthEast
endglobals
//----------------------------------------------------------------
private function Count_Tornado takes nothing returns nothing
local unit enumU = GetEnumUnit()
if(not IsUnitDead(enumU)) then
set Total_Tornado = Total_Tornado + 1
else
call GroupRemoveUnit(Tornado, enumU)
if(IsUnitInGroup(enumU, TornadoNorthWest)) then
call GroupRemoveUnit(TornadoNorthWest, enumU)
endif
if(IsUnitInGroup(enumU, TornadoSouthWest)) then
call GroupRemoveUnit(TornadoSouthWest, enumU)
endif
if(IsUnitInGroup(enumU, TornadoNorthEast)) then
call GroupRemoveUnit(TornadoNorthEast, enumU)
endif
if(IsUnitInGroup(enumU, TornadoSouthEast)) then
call GroupRemoveUnit(TornadoSouthEast, enumU)
endif
endif
set enumU = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local integer spawnNum = 0
local unit u = null
local integer totalNW = 0
local integer totalSW = 0
local integer totalNE = 0
local integer totalSE = 0
local player owner = Player(PLAYER_NEUTRAL_AGGRESSIVE)
set Total_Tornado = 0
call ForGroup(TornadoNorthWest, function Count_Tornado)
set totalNW = Total_Tornado
set Total_Tornado = 0
call ForGroup(TornadoSouthWest, function Count_Tornado)
set totalSW = Total_Tornado
set Total_Tornado = 0
call ForGroup(TornadoNorthEast, function Count_Tornado)
set totalNE = Total_Tornado
set Total_Tornado = 0
call ForGroup(TornadoSouthWest, function Count_Tornado)
set totalSE = Total_Tornado
if(WeatherForce != null) then
if(WeatherCaster != null) then
set owner = GetOwningPlayer(WeatherCaster)
endif
endif
if(totalNW < Max_Tornado(GameLevel)) then
set spawnNum = 0
set u = CreateUnitAtLoc(owner, TORNADO_ID, /*
*/Location(GetRandomReal(GetRectMinX(Spawn_Tornado[spawnNum]), GetRectMaxX(Spawn_Tornado[spawnNum])), /*
*/GetRandomReal(GetRectMinY(Spawn_Tornado[spawnNum]), GetRectMaxY(Spawn_Tornado[spawnNum]))), bj_UNIT_FACING)
call SetUnitAbilityLevel(u, ABILITY_ID, GameLevel)
call GroupAddUnit(TornadoNorthWest, u)
call GroupAddUnit(Tornado, u)
call GroupAddUnit(Unit_Outside_Temple, u)
endif
if(totalSW < Max_Tornado(GameLevel)) then
set spawnNum = 1
set u = CreateUnitAtLoc(owner, TORNADO_ID, /*
*/Location(GetRandomReal(GetRectMinX(Spawn_Tornado[spawnNum]), GetRectMaxX(Spawn_Tornado[spawnNum])), /*
*/GetRandomReal(GetRectMinY(Spawn_Tornado[spawnNum]), GetRectMaxY(Spawn_Tornado[spawnNum]))), bj_UNIT_FACING)
call SetUnitAbilityLevel(u, ABILITY_ID, GameLevel)
call GroupAddUnit(TornadoSouthWest, u)
call GroupAddUnit(Tornado, u)
call GroupAddUnit(Unit_Outside_Temple, u)
endif
if(totalNE < Max_Tornado(GameLevel)) then
set spawnNum = 2
set u = CreateUnitAtLoc(owner, TORNADO_ID, /*
*/Location(GetRandomReal(GetRectMinX(Spawn_Tornado[spawnNum]), GetRectMaxX(Spawn_Tornado[spawnNum])), /*
*/GetRandomReal(GetRectMinY(Spawn_Tornado[spawnNum]), GetRectMaxY(Spawn_Tornado[spawnNum]))), bj_UNIT_FACING)
call SetUnitAbilityLevel(u, ABILITY_ID, GameLevel)
call GroupAddUnit(TornadoNorthEast, u)
call GroupAddUnit(Tornado, u)
call GroupAddUnit(Unit_Outside_Temple, u)
endif
if(totalSE < Max_Tornado(GameLevel)) then
set spawnNum = 3
set u = CreateUnitAtLoc(owner, TORNADO_ID, /*
*/Location(GetRandomReal(GetRectMinX(Spawn_Tornado[spawnNum]), GetRectMaxX(Spawn_Tornado[spawnNum])), /*
*/GetRandomReal(GetRectMinY(Spawn_Tornado[spawnNum]), GetRectMaxY(Spawn_Tornado[spawnNum]))), bj_UNIT_FACING)
call SetUnitAbilityLevel(u, ABILITY_ID, GameLevel)
call GroupAddUnit(TornadoSouthEast, u)
call GroupAddUnit(Tornado, u)
call GroupAddUnit(Unit_Outside_Temple, u)
endif
set u = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterTimerEventPeriodic(TornadoTrg, 5.0)
call TriggerAddAction(TornadoTrg, function Actions)
call DisableTrigger(TornadoTrg)
set Spawn_Tornado[0] = gg_rct_AI_Farm_Location_North_West
set Spawn_Tornado[1] = gg_rct_AI_Farm_Location_South_West
set Spawn_Tornado[2] = gg_rct_AI_Farm_Location_South_East
set Spawn_Tornado[3] = gg_rct_AI_Farm_Location_North_East
set TornadoNorthWest = CreateGroup()
set TornadoSouthWest = CreateGroup()
set TornadoNorthEast = CreateGroup()
set TornadoSouthEast = CreateGroup()
endfunction
endscope
//TESH.scrollpos=287
//TESH.alwaysfold=0
globals
constant integer CREEP_SKELETON_GIANT_ID = 'uabo' //Unit creep rawcode
constant integer CREEP_SKELETON_WARRIOR_ID = 'uske' //Unit creep rawcode
constant integer CREEP_SKELETON_ARCHER_ID = 'uskm' //Unit creep rawcode
constant integer CREEP_SKELETON_MAGE_ID = 'unec' //Unit creep rawcode
boolean array spawnAllow[4]
group Creature
endglobals
scope Creep initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant real SPAWN_TIME = 30.0 //Spawn group interval
private constant integer TYPE_KEY = 0 //Type hostile or creep
private constant integer PATROL_POINT_KEY = 1 //Creep next point
private constant integer PATROL_TARGET_X_KEY = 2 //Creep target x
private constant integer PATROL_TARGET_Y_KEY = 3 //Creep target y
private constant integer POSITION_X_KEY = 4 //Creep position x
private constant integer POSITION_Y_KEY = 5 //Creep position y
private constant integer POSITION_COUNT_KEY = 6 //Creep positioning
private constant integer LIFE_TIME_KEY = 7 //Life time
private constant integer MODE_KEY = 8 //Mode
private constant integer MODE_TIME_KEY = 9 //Mode timer
private constant real MIN_DISTANCE_PATROL = 200.0 //Target patrol distance end
private constant real RADIUS = 100.0 //Radius move
private constant real CYCLE_DURATION = 120.0 //Spawn cycle duration
private constant integer ALLY_BONUS_EXP = 10 //Bonus experience
private constant integer ALLY_BONUS_GOLD = 5 //Bonus gold
private constant real LIFE_TIME = 60.0 //Life time of skeletons
private constant real SCALE_PER_GAME_LEVEL = 0.02 //Scale per game level
private constant real HOSTILE_ACQUIRE_RANGE = 200.0 //Acquire range of hostile
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Items\\TomeOfRetraining\\TomeOfRetrainingCaster.mdl" //Start game hero effect
endglobals
private function Max_Skeleton_Giant_Count takes integer level returns integer
if(level <= 5) then
return 2
elseif(level <= 10) then
return 2
elseif(level <= 15) then
return 2
else
return 0
endif
endfunction
private function Num_Skeleton_Giant_Count takes integer level returns integer
if(level <= 5) then
return 1
elseif(level <= 10) then
return 1
elseif(level <= 15) then
return 1
else
return 0
endif
endfunction
private function Max_Skeleton_Warrior_Count takes integer level returns integer
if(level <= 5) then
return 12
elseif(level <= 10) then
return 12
elseif(level <= 15) then
return 12
else
return 0
endif
endfunction
private function Num_Skeleton_Warrior_Count takes integer level returns integer
if(level <= 5) then
return 4
elseif(level <= 10) then
return 4
elseif(level <= 15) then
return 4
else
return 0
endif
endfunction
private function Max_Skeleton_Archer_Count takes integer level returns integer
if(level <= 5) then
return 6
elseif(level <= 10) then
return 6
elseif(level <= 15) then
return 6
else
return 0
endif
endfunction
private function Num_Skeleton_Archer_Count takes integer level returns integer
if(level <= 5) then
return 2
elseif(level <= 10) then
return 2
elseif(level <= 15) then
return 2
else
return 0
endif
endfunction
private function Max_Skeleton_Mage_Count takes integer level returns integer
if(level <= 5) then
return 6
elseif(level <= 10) then
return 6
elseif(level <= 15) then
return 6
else
return 0
endif
endfunction
private function Num_Skeleton_Mage_Count takes integer level returns integer
if(level <= 5) then
return 2
elseif(level <= 10) then
return 2
elseif(level <= 15) then
return 2
else
return 0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false)
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private rect array spawnPoint[4]
private integer numSpawnPoint
private rect array hostileSmallPoint[4]
private rect array hostileSmallPointChecker[4]
private rect array hostileLargePoint[4]
private rect array hostileLargePointChecker[4]
private real array hostileSmallFace[4]
private real array hostileLargeFace[4]
private rect array patrolPoint[5]
private integer numPatrolPoint
private integer array spawnPlayerNum[4]
private integer array spawnSkeletonGiantNumber[4]
private integer array spawnSkeletonWarriorNumber[4]
private integer array spawnSkeletonArcherNumber[4]
private integer array spawnSkeletonMageNumber[4]
private hashtable ht
private group copy
private group all
private boolexpr bexpr
private trigger SpawnSkeletonCycleTrg
private trigger SpawnSkeletonTrg
private trigger CreepTrg
private boolean patrolIn1
private boolean patrolOut1
private boolean patrolOut2
private boolean spawn
private integer spawnSet
private boolean spawnSkeletonGiant
private boolean spawnSkeletonWarrior
private boolean spawnSkeletonArcher
private boolean spawnSkeletonMage
private integer cycle
private integer cycleMax
private integer spawnType
private real spawnTime
private real cycleDuration
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
return Targets(GetFilterUnit())
endfunction
//----------------------------------------------------------------
function Skeleton_onDamage takes unit attacker, unit attacked, real amount returns nothing
local integer attackedID = GetUnitUserData(attacked)
local integer attackedType = GetUnitTypeId(attacked)
local real lifeTime = 0.0
if(attackedType == CREEP_SKELETON_WARRIOR_ID or /*
*/attackedType == CREEP_SKELETON_ARCHER_ID or /*
*/attackedType == CREEP_SKELETON_GIANT_ID or /*
*/attackedType == CREEP_SKELETON_MAGE_ID) then
if(LoadInteger(ht, attackedID, TYPE_KEY) == 1) then
set lifeTime = LoadReal(ht, attackedID, LIFE_TIME_KEY)
if(lifeTime < LIFE_TIME - 10.0) then
set lifeTime = lifeTime + 10.0
else
set lifeTime = LIFE_TIME
endif
call SaveReal(ht, attackedID, LIFE_TIME_KEY, lifeTime)
endif
endif
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local integer targetPoint = 0
local real targetX = 0.0
local real targetY = 0.0
local unit f = null
local integer fID = 0
local integer fType = 0
local real fX = 0.0
local real fY = 0.0
local real patrolX = 0.0
local real patrolY = 0.0
local real minX = 0.0
local real maxX = 0.0
local real minY = 0.0
local real maxY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local integer numPlayer = 0
local integer counter = 0
local integer i = 0
local player owner = null
local unit g = null
local integer randomSound = 0
local real delay = 0.0
local real angle = 0.0
local real lifeTime = 0.0
local integer mode = 0
local real modeTime = 0.0
local integer colorRed = 0
local integer colorGreen = 0
local integer colorBlue = 0
set copy = CopyGroup(Creature)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set owner = GetOwningPlayer(f)
set numPlayer = GetPlayerId(owner)
if(numPlayer >= 8 and numPlayer < 12) then
if(IsUnitType(f, UNIT_TYPE_SUMMONED)) then
set targetPoint = 0
set targetX = GetRandomReal(GetRectMinX(patrolPoint[targetPoint]), GetRectMaxX(patrolPoint[targetPoint]))
set targetY = GetRandomReal(GetRectMinY(patrolPoint[targetPoint]), GetRectMaxY(patrolPoint[targetPoint]))
call IssuePointOrder(f, "patrol", targetX, targetY)
else
set fID = GetUnitUserData(f)
set fType = GetUnitTypeId(f)
if(LoadInteger(ht, fID, TYPE_KEY) == 1) then
set lifeTime = LoadReal(ht, fID, LIFE_TIME_KEY)
if(lifeTime > 0.0) then
set lifeTime = lifeTime - 0.5
call SaveReal(ht, fID, LIFE_TIME_KEY, lifeTime)
if(lifeTime <= 10.0) then
set colorRed = 255
set colorGreen = 255
set colorBlue = 100
if(IsUnitAlly(f, Player(13))) then
if(IsPlayerInForce(GetLocalPlayer(), All_Luminous)) then
set colorRed = 100
set colorGreen = 100
set colorBlue = 100
endif
call SetUnitVertexColor(f, colorRed, colorGreen, colorBlue, 255)
elseif(IsUnitAlly(f, Player(14))) then
if(IsPlayerInForce(GetLocalPlayer(), All_Overcast)) then
set colorRed = 100
set colorGreen = 100
set colorBlue = 100
endif
call SetUnitVertexColor(f, colorRed, colorGreen, colorBlue, 255)
else
call SetUnitVertexColor(f, colorRed, colorGreen, colorBlue, 255)
endif
else
set colorRed = 255
set colorGreen = 255
set colorBlue = 255
if(IsUnitEnemy(f, Player(13))) then
if(IsPlayerInForce(GetLocalPlayer(), All_Luminous)) then
set colorGreen = 100
set colorBlue = 100
endif
call SetUnitVertexColor(f, colorRed, colorGreen, colorBlue, 255)
else
call SetUnitVertexColor(f, colorRed, colorGreen, colorBlue, 255)
endif
if(IsUnitEnemy(f, Player(14))) then
if(IsPlayerInForce(GetLocalPlayer(), All_Overcast)) then
set colorGreen = 100
set colorBlue = 100
endif
call SetUnitVertexColor(f, colorRed, colorGreen, colorBlue, 255)
else
call SetUnitVertexColor(f, colorRed, colorGreen, colorBlue, 255)
endif
endif
else
call KillUnit(f)
endif
if(not IsUnitPaused(f)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set patrolX = LoadReal(ht, fID, PATROL_TARGET_X_KEY)
set patrolY = LoadReal(ht, fID, PATROL_TARGET_Y_KEY)
set mode = LoadInteger(ht, fID, MODE_KEY)
set modeTime = LoadReal(ht, fID, MODE_TIME_KEY)
set dx = fX - patrolX
set dy = fY - patrolY
set distance = SquareRoot(dx * dx + dy * dy)
set i = 0
loop
exitwhen(i >= 4)
if(numPlayer == 8 + i) then
if(not spawnAllow[i]) then
set minX = GetRectMinX(spawnPoint[i])
set maxX = GetRectMaxX(spawnPoint[i])
set minY = GetRectMinY(spawnPoint[i])
set maxY = GetRectMaxY(spawnPoint[i])
if(fX > minX and /*
*/fX < maxX and /*
*/fY > minY and /*
*/fY < maxY) then
call KillUnit(f)
endif
endif
set i = 4
endif
set i = i + 1
endloop
call GroupEnumUnitsInRange(all, fX, fY, RADIUS, bexpr)
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
if(IsUnitType(g, UNIT_TYPE_HERO) and IsUnitAlly(g, owner)) then
set angle = Atan2(fY - GetUnitY(g), fX - GetUnitX(g))
call IssuePointOrder(f, "move", fX + 200.0 * Cos(angle), fY + 200.0 * Sin(angle))
set mode = 1
set modeTime = 1.0
endif
endloop
if(fX == LoadReal(ht, fID, POSITION_X_KEY) and fY == LoadReal(ht, fID, POSITION_Y_KEY)) then
set counter = LoadInteger( ht, fID, POSITION_COUNT_KEY)
if(counter > 120) then
//set distance = 0
call KillUnit(f)
else
call SaveInteger(ht, fID, POSITION_COUNT_KEY, counter + 1)
endif
else
call SaveReal(ht, fID, POSITION_X_KEY, fX)
call SaveReal(ht, fID, POSITION_Y_KEY, fY)
endif
if(distance < MIN_DISTANCE_PATROL) then
set targetPoint = LoadInteger(ht, fID, PATROL_POINT_KEY)
if(targetPoint >= 0) then
set targetX = GetRandomReal(GetRectMinX(patrolPoint[targetPoint]), GetRectMaxX(patrolPoint[targetPoint]))
set targetY = GetRandomReal(GetRectMinY(patrolPoint[targetPoint]), GetRectMaxY(patrolPoint[targetPoint]))
call SaveReal(ht, fID, PATROL_TARGET_X_KEY, targetX)
call SaveReal(ht, fID, PATROL_TARGET_Y_KEY, targetY)
call IssuePointOrder(f, "patrol", targetX, targetY)
if(fType == CREEP_SKELETON_WARRIOR_ID or fType == CREEP_SKELETON_ARCHER_ID) then
if(numPlayer == 8) then
if(targetPoint == 2 or targetPoint == 4) then
set targetPoint = 3
elseif(targetPoint == 3) then
set targetPoint = 1
elseif(targetPoint == 1) then
set targetPoint = 3
endif
elseif(numPlayer == 9) then
if(targetPoint == 1 or targetPoint == 3) then
set targetPoint = 4
elseif(targetPoint == 4) then
set targetPoint = 2
elseif(targetPoint == 2) then
set targetPoint = 4
endif
elseif(numPlayer == 10) then
if(targetPoint == 2 or targetPoint == 4) then
set targetPoint = 1
elseif(targetPoint == 1) then
set targetPoint = 3
elseif(targetPoint == 3) then
set targetPoint = 1
endif
elseif(numPlayer == 11) then
if(targetPoint == 1 or targetPoint == 3) then
set targetPoint = 2
elseif(targetPoint == 2) then
set targetPoint = 4
elseif(targetPoint == 4) then
set targetPoint = 2
endif
endif
else
if(targetPoint > 0) then
set targetPoint = 0
endif
endif
call SaveInteger(ht, fID, PATROL_POINT_KEY, targetPoint)
endif
else
if(mode == 1) then
if(modeTime > 0.0) then
set modeTime = modeTime - 1.0
else
set mode = 0
set modeTime = 0.0
call IssuePointOrder(f, "patrol", patrolX, patrolY)
endif
endif
endif
call SaveInteger(ht, fID, MODE_KEY, mode)
call SaveReal(ht, fID, MODE_TIME_KEY, modeTime)
endif
endif
endif
endif
endloop
set owner = null
set f = null
set g = null
endfunction
//----------------------------------------------------------------
private function Skeleton_Spawn_Cycle takes nothing returns nothing
if(cycle == 0) then
set cycle = cycle + 1
set cycleDuration = CYCLE_DURATION
set patrolIn1 = false
set patrolOut1 = true
set patrolOut2 = false
elseif(cycle == 1) then
set cycle = cycle + 1
set cycleDuration = CYCLE_DURATION
set patrolIn1 = false
set patrolOut1 = false
set patrolOut2 = true
elseif(cycle == 2) then
set cycle = 0
set cycleDuration = CYCLE_DURATION
set patrolIn1 = true
set patrolOut1 = false
set patrolOut2 = false
endif
endfunction
//----------------------------------------------------------------
private function Check_Hostile_Area takes player p, rect rct returns boolean
local unit f = null
local boolean check = false
call GroupEnumUnitsInRect(all, rct, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(not check) then
if(IsUnitType(f, UNIT_TYPE_HERO)) then
set check = true
elseif(GetOwningPlayer(f) == p) then
set check = true
endif
endif
endloop
set p = null
set rct = null
set f = null
return check
endfunction
//----------------------------------------------------------------
private function Spawn_Skeleton_Giants takes nothing returns nothing
local integer i = 0
local integer j = 0
local integer num = 0
local unit spawned = null
local integer spawnedID = 0
local integer targetSpawnPoint = 0
local integer targetSpawnNumber = 0
local integer targetPoint = 0
local integer nextPoint = 0
local integer numPlayer = 0
local real targetX = 0.0
local real targetY = 0.0
local integer colorRed = 0
local integer colorGreen = 0
local integer colorBlue = 0
set i = 8
loop
exitwhen(i >= 12)
set targetSpawnPoint = i - 8
set numPlayer = spawnPlayerNum[targetSpawnPoint]
set targetSpawnNumber = GetRandomInt(1, 1)
if(spawnAllow[targetSpawnPoint]) then
set num = IMinBJ(Num_Skeleton_Giant_Count(GameLevel), Max_Skeleton_Giant_Count(GameLevel) - spawnSkeletonGiantNumber[targetSpawnPoint])
if(num > 0) then
set j = 0
loop
exitwhen(j >= num)
if(numPlayer == 8) then
set targetPoint = 1
elseif(numPlayer == 9) then
set targetPoint = 2
elseif(numPlayer == 10) then
set targetPoint = 3
elseif(numPlayer == 11) then
set targetPoint = 4
endif
if(numPlayer == 8) then
set nextPoint = 0
elseif(numPlayer == 9) then
set nextPoint = 0
elseif(numPlayer == 10) then
set nextPoint = 0
elseif(numPlayer == 11) then
set nextPoint = 0
endif
set targetX = GetRectCenterX(patrolPoint[targetPoint])
set targetY = GetRectCenterY(patrolPoint[targetPoint])
set spawned = CreateUnit(Player(numPlayer), CREEP_SKELETON_GIANT_ID, GetRectCenterX(spawnPoint[targetSpawnPoint]), GetRectCenterY(spawnPoint[targetSpawnPoint]), bj_UNIT_FACING)
set spawnedID = GetUnitUserData(spawned)
call IssuePointOrder(spawned, "patrol", targetX, targetY)
call GroupAddUnit(Creature, spawned)
call GroupAddUnit(Unit_Outside_Temple, spawned)
call SaveInteger(ht, spawnedID, TYPE_KEY, 1)
call SaveInteger(ht, spawnedID, PATROL_POINT_KEY, nextPoint)
call SaveReal(ht, spawnedID, PATROL_TARGET_X_KEY, targetX)
call SaveReal(ht, spawnedID, PATROL_TARGET_Y_KEY, targetY)
call SaveReal(ht, spawnedID, POSITION_X_KEY, GetUnitX(spawned))
call SaveReal(ht, spawnedID, POSITION_Y_KEY, GetUnitY(spawned))
call SaveInteger(ht, spawnedID, POSITION_COUNT_KEY, 0)
call SaveReal(ht, spawnedID, LIFE_TIME_KEY, LIFE_TIME)
call SaveInteger(ht, spawnedID, MODE_KEY, 0)
call SaveReal(ht, spawnedID, MODE_TIME_KEY, 0.0)
call SetUnitScale(spawned, 1.2 + GameLevel * SCALE_PER_GAME_LEVEL, 1.2 + GameLevel * SCALE_PER_GAME_LEVEL, 1.2 + GameLevel * SCALE_PER_GAME_LEVEL)
set colorRed = 255
set colorGreen = 100
set colorBlue = 100
if(IsUnitAlly(spawned, Player(13))) then
if(IsPlayerInForce(GetLocalPlayer(), All_Luminous)) then
set colorRed = 255
set colorGreen = 255
set colorBlue = 255
endif
call SetUnitVertexColor(spawned, colorRed, colorGreen, colorBlue, 255)
elseif(IsUnitAlly(spawned, Player(14))) then
if(IsPlayerInForce(GetLocalPlayer(), All_Overcast)) then
set colorRed = 255
set colorGreen = 255
set colorBlue = 255
endif
call SetUnitVertexColor(spawned, colorRed, colorGreen, colorBlue, 255)
else
call SetUnitVertexColor(spawned, colorRed, colorGreen, colorBlue, 255)
endif
set spawnSkeletonGiantNumber[targetSpawnPoint] = spawnSkeletonGiantNumber[targetSpawnPoint] + 1
set spawned = null
set j = j + 1
endloop
endif
endif
set i = i + 1
endloop
set spawned = null
endfunction
//----------------------------------------------------------------
private function Spawn_Skeleton_Warriors takes nothing returns nothing
local integer i = 0
local integer j = 0
local integer num = 0
local unit spawned = null
local integer spawnedID = 0
local integer targetSpawnPoint = 0
local integer targetSpawnNumber = 0
local integer targetPoint = 0
local integer nextPoint = 0
local integer numPlayer = 0
local real targetX = 0.0
local real targetY = 0.0
local integer colorRed = 0
local integer colorGreen = 0
local integer colorBlue = 0
set i = 8
loop
exitwhen(i >= 12)
set targetSpawnPoint = i - 8
set numPlayer = spawnPlayerNum[targetSpawnPoint]
set targetSpawnNumber = GetRandomInt(1, 1)
if(spawnAllow[targetSpawnPoint]) then
set num = IMinBJ(Num_Skeleton_Warrior_Count(GameLevel), Max_Skeleton_Warrior_Count(GameLevel) - spawnSkeletonWarriorNumber[targetSpawnPoint])
if(num > 0) then
set j = 0
loop
exitwhen(j >= num)
if(numPlayer == 8) then
set targetPoint = 1
elseif(numPlayer == 9) then
set targetPoint = 2
elseif(numPlayer == 10) then
set targetPoint = 3
elseif(numPlayer == 11) then
set targetPoint = 4
endif
if(numPlayer == 8) then
if(patrolOut1) then
set nextPoint = 2
elseif(patrolOut2) then
set nextPoint = 4
elseif(patrolIn1) then
set nextPoint = 0
else
set nextPoint = 0
endif
elseif(numPlayer == 9) then
if(patrolOut1) then
set nextPoint = 1
elseif(patrolOut2) then
set nextPoint = 3
elseif(patrolIn1) then
set nextPoint = 0
else
set nextPoint = 0
endif
elseif(numPlayer == 10) then
if(patrolOut1) then
set nextPoint = 4
elseif(patrolOut2) then
set nextPoint = 2
elseif(patrolIn1) then
set nextPoint = 0
else
set nextPoint = 0
endif
elseif(numPlayer == 11) then
if(patrolOut1) then
set nextPoint = 3
elseif(patrolOut2) then
set nextPoint = 1
elseif(patrolIn1) then
set nextPoint = 0
else
set nextPoint = 0
endif
endif
set targetX = GetRectCenterX(patrolPoint[targetPoint])
set targetY = GetRectCenterY(patrolPoint[targetPoint])
set spawned = CreateUnit(Player(numPlayer), CREEP_SKELETON_WARRIOR_ID, GetRectCenterX(spawnPoint[targetSpawnPoint]), GetRectCenterY(spawnPoint[targetSpawnPoint]), bj_UNIT_FACING)
set spawnedID = GetUnitUserData(spawned)
call IssuePointOrder(spawned, "patrol", targetX, targetY)
call GroupAddUnit(Creature, spawned)
call GroupAddUnit(Unit_Outside_Temple, spawned)
call SaveInteger(ht, spawnedID, TYPE_KEY, 1)
call SaveInteger(ht, spawnedID, PATROL_POINT_KEY, nextPoint)
call SaveReal(ht, spawnedID, PATROL_TARGET_X_KEY, targetX)
call SaveReal(ht, spawnedID, PATROL_TARGET_Y_KEY, targetY)
call SaveReal(ht, spawnedID, POSITION_X_KEY, GetUnitX(spawned))
call SaveReal(ht, spawnedID, POSITION_Y_KEY, GetUnitY(spawned))
call SaveInteger(ht, spawnedID, POSITION_COUNT_KEY, 0)
call SaveReal(ht, spawnedID, LIFE_TIME_KEY, LIFE_TIME)
call SaveInteger(ht, spawnedID, MODE_KEY, 0)
call SaveReal(ht, spawnedID, MODE_TIME_KEY, 0.0)
call SetUnitScale(spawned, 1.0 + GameLevel * SCALE_PER_GAME_LEVEL, 1.0 + GameLevel * SCALE_PER_GAME_LEVEL, 1.0 + GameLevel * SCALE_PER_GAME_LEVEL)
set colorRed = 255
set colorGreen = 100
set colorBlue = 100
if(IsUnitAlly(spawned, Player(13))) then
if(IsPlayerInForce(GetLocalPlayer(), All_Luminous)) then
set colorRed = 255
set colorGreen = 255
set colorBlue = 255
endif
call SetUnitVertexColor(spawned, colorRed, colorGreen, colorBlue, 255)
elseif(IsUnitAlly(spawned, Player(14))) then
if(IsPlayerInForce(GetLocalPlayer(), All_Overcast)) then
set colorRed = 255
set colorGreen = 255
set colorBlue = 255
endif
call SetUnitVertexColor(spawned, colorRed, colorGreen, colorBlue, 255)
else
call SetUnitVertexColor(spawned, colorRed, colorGreen, colorBlue, 255)
endif
set spawnSkeletonWarriorNumber[targetSpawnPoint] = spawnSkeletonWarriorNumber[targetSpawnPoint] + 1
set spawned = null
set j = j + 1
endloop
endif
endif
set i = i + 1
endloop
set spawned = null
endfunction
//----------------------------------------------------------------
private function Spawn_Skeleton_Archers takes nothing returns nothing
local integer i = 0
local integer j = 0
local integer num = 0
local unit spawned = null
local integer spawnedID = 0
local integer targetSpawnPoint = 0
local integer targetSpawnNumber = 0
local integer targetPoint = 0
local integer nextPoint = 0
local integer numPlayer = 0
local real targetX = 0.0
local real targetY = 0.0
local integer colorRed = 0
local integer colorGreen = 0
local integer colorBlue = 0
set i = 8
loop
exitwhen(i >= 12)
set targetSpawnPoint = i - 8
set numPlayer = spawnPlayerNum[targetSpawnPoint]
set targetSpawnNumber = GetRandomInt(1, 1)
if(spawnAllow[targetSpawnPoint]) then
set num = IMinBJ(Num_Skeleton_Archer_Count(GameLevel), Max_Skeleton_Archer_Count(GameLevel) - spawnSkeletonArcherNumber[targetSpawnPoint])
if(num > 0) then
set j = 0
loop
exitwhen(j >= num)
set targetPoint = -1
if(numPlayer == 8) then
set targetPoint = 1
elseif(numPlayer == 9) then
set targetPoint = 2
elseif(numPlayer == 10) then
set targetPoint = 3
elseif(numPlayer == 11) then
set targetPoint = 4
endif
if(numPlayer == 8) then
if(patrolOut1) then
set nextPoint = 2
elseif(patrolOut2) then
set nextPoint = 4
elseif(patrolIn1) then
set nextPoint = 0
else
set nextPoint = 0
endif
elseif(numPlayer == 9) then
if(patrolOut1) then
set nextPoint = 1
elseif(patrolOut2) then
set nextPoint = 3
elseif(patrolIn1) then
set nextPoint = 0
else
set nextPoint = 0
endif
elseif(numPlayer == 10) then
if(patrolOut1) then
set nextPoint = 4
elseif(patrolOut2) then
set nextPoint = 2
elseif(patrolIn1) then
set nextPoint = 0
else
set nextPoint = 0
endif
elseif(numPlayer == 11) then
if(patrolOut1) then
set nextPoint = 3
elseif(patrolOut2) then
set nextPoint = 1
elseif(patrolIn1) then
set nextPoint = 0
else
set nextPoint = 0
endif
endif
set targetX = GetRectCenterX(patrolPoint[targetPoint])
set targetY = GetRectCenterY(patrolPoint[targetPoint])
set spawned = CreateUnit(Player(numPlayer), CREEP_SKELETON_ARCHER_ID, GetRectCenterX(spawnPoint[targetSpawnPoint]), GetRectCenterY(spawnPoint[targetSpawnPoint]), bj_UNIT_FACING)
set spawnedID = GetUnitUserData(spawned)
call IssuePointOrder(spawned, "patrol", targetX, targetY)
call GroupAddUnit(Creature, spawned)
call GroupAddUnit(Unit_Outside_Temple, spawned)
call SaveInteger(ht, spawnedID, TYPE_KEY, 1)
call SaveInteger(ht, spawnedID, PATROL_POINT_KEY, nextPoint)
call SaveReal(ht, spawnedID, PATROL_TARGET_X_KEY, targetX)
call SaveReal(ht, spawnedID, PATROL_TARGET_Y_KEY, targetY)
call SaveReal(ht, spawnedID, POSITION_X_KEY, GetUnitX(spawned))
call SaveReal(ht, spawnedID, POSITION_Y_KEY, GetUnitY(spawned))
call SaveInteger(ht, spawnedID, POSITION_COUNT_KEY, 0)
call SaveReal(ht, spawnedID, LIFE_TIME_KEY, LIFE_TIME)
call SaveInteger(ht, spawnedID, MODE_KEY, 0)
call SaveReal(ht, spawnedID, MODE_TIME_KEY, 0.0)
call SetUnitScale(spawned, 1.0 + GameLevel * SCALE_PER_GAME_LEVEL, 1.0 + GameLevel * SCALE_PER_GAME_LEVEL, 1.0 + GameLevel * SCALE_PER_GAME_LEVEL)
set colorRed = 255
set colorGreen = 100
set colorBlue = 100
if(IsUnitAlly(spawned, Player(13))) then
if(IsPlayerInForce(GetLocalPlayer(), All_Luminous)) then
set colorRed = 255
set colorGreen = 255
set colorBlue = 255
endif
call SetUnitVertexColor(spawned, colorRed, colorGreen, colorBlue, 255)
elseif(IsUnitAlly(spawned, Player(14))) then
if(IsPlayerInForce(GetLocalPlayer(), All_Overcast)) then
set colorRed = 255
set colorGreen = 255
set colorBlue = 255
endif
call SetUnitVertexColor(spawned, colorRed, colorGreen, colorBlue, 255)
else
call SetUnitVertexColor(spawned, colorRed, colorGreen, colorBlue, 255)
endif
set spawnSkeletonArcherNumber[targetSpawnPoint] = spawnSkeletonArcherNumber[targetSpawnPoint] + 1
set spawned = null
set j = j + 1
endloop
endif
endif
set i = i + 1
endloop
set spawned = null
endfunction
//----------------------------------------------------------------
private function Spawn_Skeleton_Mages takes nothing returns nothing
local integer i = 0
local integer j = 0
local integer num = 0
local unit spawned = null
local integer spawnedID = 0
local integer targetSpawnPoint = 0
local integer targetSpawnNumber = 0
local integer targetPoint = 0
local integer nextPoint = 0
local integer numPlayer = 0
local real targetX = 0.0
local real targetY = 0.0
local integer colorRed = 0
local integer colorGreen = 0
local integer colorBlue = 0
set i = 8
loop
exitwhen(i >= 12)
set targetSpawnPoint = i - 8
set numPlayer = spawnPlayerNum[targetSpawnPoint]
set targetSpawnNumber = GetRandomInt(1, 1)
if(spawnAllow[targetSpawnPoint]) then
set num = IMinBJ(Num_Skeleton_Mage_Count(GameLevel), Max_Skeleton_Mage_Count(GameLevel) - spawnSkeletonMageNumber[targetSpawnPoint])
if(num > 0) then
set j = 0
loop
exitwhen(j >= num)
set targetPoint = -1
if(numPlayer == 8) then
set targetPoint = 1
elseif(numPlayer == 9) then
set targetPoint = 2
elseif(numPlayer == 10) then
set targetPoint = 3
elseif(numPlayer == 11) then
set targetPoint = 4
endif
if(numPlayer == 8) then
set nextPoint = 0
elseif(numPlayer == 9) then
set nextPoint = 0
elseif(numPlayer == 10) then
set nextPoint = 0
elseif(numPlayer == 11) then
set nextPoint = 0
endif
set targetX = GetRectCenterX(patrolPoint[targetPoint])
set targetY = GetRectCenterY(patrolPoint[targetPoint])
set spawned = CreateUnit(Player(numPlayer), CREEP_SKELETON_MAGE_ID, GetRectCenterX(spawnPoint[targetSpawnPoint]), GetRectCenterY(spawnPoint[targetSpawnPoint]), bj_UNIT_FACING)
set spawnedID = GetUnitUserData(spawned)
call IssuePointOrder(spawned, "patrol", targetX, targetY)
call GroupAddUnit(Creature, spawned)
call GroupAddUnit(Unit_Outside_Temple, spawned)
call SaveInteger(ht, spawnedID, TYPE_KEY, 1)
call SaveInteger(ht, spawnedID, PATROL_POINT_KEY, nextPoint)
call SaveReal(ht, spawnedID, PATROL_TARGET_X_KEY, targetX)
call SaveReal(ht, spawnedID, PATROL_TARGET_Y_KEY, targetY)
call SaveReal(ht, spawnedID, POSITION_X_KEY, GetUnitX(spawned))
call SaveReal(ht, spawnedID, POSITION_Y_KEY, GetUnitY(spawned))
call SaveInteger(ht, spawnedID, POSITION_COUNT_KEY, 0)
call SaveReal(ht, spawnedID, LIFE_TIME_KEY, LIFE_TIME)
call SaveInteger(ht, spawnedID, MODE_KEY, 0)
call SaveReal(ht, spawnedID, MODE_TIME_KEY, 0.0)
call SetUnitScale(spawned, 1.0 + GameLevel * SCALE_PER_GAME_LEVEL, 1.0 + GameLevel * SCALE_PER_GAME_LEVEL, 1.0 + GameLevel * SCALE_PER_GAME_LEVEL)
set colorRed = 255
set colorGreen = 100
set colorBlue = 100
if(IsUnitAlly(spawned, Player(13))) then
if(IsPlayerInForce(GetLocalPlayer(), All_Luminous)) then
set colorRed = 255
set colorGreen = 255
set colorBlue = 255
endif
call SetUnitVertexColor(spawned, colorRed, colorGreen, colorBlue, 255)
elseif(IsUnitAlly(spawned, Player(14))) then
if(IsPlayerInForce(GetLocalPlayer(), All_Overcast)) then
set colorRed = 255
set colorGreen = 255
set colorBlue = 255
endif
call SetUnitVertexColor(spawned, colorRed, colorGreen, colorBlue, 255)
else
call SetUnitVertexColor(spawned, colorRed, colorGreen, colorBlue, 255)
endif
set spawnSkeletonMageNumber[targetSpawnPoint] = spawnSkeletonMageNumber[targetSpawnPoint] + 1
set spawned = null
set j = j + 1
endloop
endif
endif
set i = i + 1
endloop
set spawned = null
endfunction
//----------------------------------------------------------------
private function Spawn_Hostile_Location takes player p, integer unitType, location loc, real face returns nothing
local unit spawned = CreateUnit(p, unitType, GetLocationX(loc), GetLocationY(loc), face)
local integer spawnedID = 0
set spawnedID = GetUnitUserData(spawned)
call SetUnitAcquireRange(spawned, HOSTILE_ACQUIRE_RANGE)
call QueueUnitAnimation(spawned, "stand")
call GroupAddUnit(Creature, spawned)
call GroupAddUnit(Unit_Outside_Temple, spawned)
call SaveInteger(ht, spawnedID, TYPE_KEY, 0)
call SaveReal(ht, spawnedID, PATROL_TARGET_X_KEY, GetUnitX(spawned))
call SaveReal(ht, spawnedID, PATROL_TARGET_Y_KEY, GetUnitY(spawned))
call SaveReal(ht, spawnedID, POSITION_X_KEY, GetUnitX(spawned))
call SaveReal(ht, spawnedID, POSITION_Y_KEY, GetUnitY(spawned))
call SaveInteger(ht, spawnedID, POSITION_COUNT_KEY, 0)
call SaveReal(ht, spawnedID, LIFE_TIME_KEY, 0.0)
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, spawned, "origin"))
set p = null
set loc = null
set spawned = null
endfunction
//----------------------------------------------------------------
function SetSpawnTime takes real time returns nothing
set spawnTime = time
endfunction
//----------------------------------------------------------------
private function Skeleton_Spawn_Actions takes nothing returns nothing
local integer i = 0
local integer random = 0
if(spawn) then
if(spawnTime > 0.0) then
set spawnTime = spawnTime - 1.0
else
if(spawnType == 0) then
set spawnType = 1
set i = 0
loop
exitwhen(i >= 4)
if(not Check_Hostile_Area(Player(12), hostileSmallPointChecker[i])) then
set random = GetRandomInt(0, 2)
if(random == 0) then
call Spawn_Hostile_Location(Player(12), 'nscb', GetRandomLocInRect(hostileSmallPoint[i]), hostileSmallFace[i])
call Spawn_Hostile_Location(Player(12), 'nsc2', GetRandomLocInRect(hostileSmallPoint[i]), hostileSmallFace[i])
call Spawn_Hostile_Location(Player(12), 'nsc3', GetRandomLocInRect(hostileSmallPoint[i]), hostileSmallFace[i])
elseif(random == 1) then
call Spawn_Hostile_Location(Player(12), 'nmsc', GetRandomLocInRect(hostileSmallPoint[i]), hostileSmallFace[i])
call Spawn_Hostile_Location(Player(12), 'nmtw', GetRandomLocInRect(hostileSmallPoint[i]), hostileSmallFace[i])
call Spawn_Hostile_Location(Player(12), 'nmbg', GetRandomLocInRect(hostileSmallPoint[i]), hostileSmallFace[i])
elseif(random == 2) then
call Spawn_Hostile_Location(Player(12), 'ntrd', GetRandomLocInRect(hostileSmallPoint[i]), hostileSmallFace[i])
call Spawn_Hostile_Location(Player(12), 'ntrt', GetRandomLocInRect(hostileSmallPoint[i]), hostileSmallFace[i])
endif
endif
if(not Check_Hostile_Area(Player(12), hostileLargePointChecker[i])) then
set random = GetRandomInt(0, 2)
if(random == 0) then
call Spawn_Hostile_Location(Player(12), 'njgb', GetRandomLocInRect(hostileLargePoint[i]), hostileLargeFace[i])
call Spawn_Hostile_Location(Player(12), 'njga', GetRandomLocInRect(hostileLargePoint[i]), hostileLargeFace[i])
elseif(random == 1) then
call Spawn_Hostile_Location(Player(12), 'nlkl', GetRandomLocInRect(hostileLargePoint[i]), hostileLargeFace[i])
call Spawn_Hostile_Location(Player(12), 'nlsn', GetRandomLocInRect(hostileLargePoint[i]), hostileLargeFace[i])
elseif(random == 2) then
call Spawn_Hostile_Location(Player(12), 'nahy', GetRandomLocInRect(hostileLargePoint[i]), hostileLargeFace[i])
call Spawn_Hostile_Location(Player(12), 'nehy', GetRandomLocInRect(hostileLargePoint[i]), hostileLargeFace[i])
call Spawn_Hostile_Location(Player(12), 'nhyd', GetRandomLocInRect(hostileLargePoint[i]), hostileLargeFace[i])
endif
endif
set i = i + 1
endloop
set i = 0
loop
exitwhen(i >= cycleMax)
call Skeleton_Spawn_Cycle()
if(i == 0) then
if(spawnType == 1) then
if(spawnSkeletonWarrior) then
call Spawn_Skeleton_Warriors()
endif
if(spawnSkeletonArcher) then
call Spawn_Skeleton_Archers()
endif
endif
elseif(i == 1) then
if(spawnType == 0) then
if(spawnSkeletonWarrior) then
call Spawn_Skeleton_Warriors()
endif
if(spawnSkeletonArcher) then
call Spawn_Skeleton_Archers()
endif
endif
elseif(i == 2) then
if(spawnSkeletonGiant) then
call Spawn_Skeleton_Giants()
endif
if(spawnSkeletonMage) then
call Spawn_Skeleton_Mages()
endif
endif
set i = i + 1
endloop
else
set spawnType = 0
endif
set spawnTime = SPAWN_TIME - 1.0
endif
endif
endfunction
//----------------------------------------------------------------
private function Die_Actions takes nothing returns nothing
local unit dying = GetDyingUnit()
local integer dyingID = GetUnitUserData(dying)
local player owner = GetOwningPlayer( dying)
local integer ownerId = GetPlayerId( owner)
local player controller = null
local integer controllerId = -1
local unit hero = null
local integer id = -1
local unit killer = GetKillingUnit()
local player ownerKiller = GetOwningPlayer(killer)
local integer ownerKillerId = GetPlayerId(ownerKiller)
local string textDeny = "!"
if(ownerId == 8) then
set id = 0
elseif(ownerId == 9) then
set id = 1
elseif(ownerId == 10) then
set id = 2
elseif(ownerId == 11) then
set id = 3
endif
call GroupRemoveUnit(Creature, dying)
call FlushChildHashtable(ht, dyingID)
if(GetUnitTypeId(dying) == CREEP_SKELETON_GIANT_ID) then
set spawnSkeletonGiantNumber[id] = spawnSkeletonGiantNumber[id] - 1
endif
if(GetUnitTypeId(dying) == CREEP_SKELETON_WARRIOR_ID) then
set spawnSkeletonWarriorNumber[id] = spawnSkeletonWarriorNumber[id] - 1
endif
if(GetUnitTypeId(dying) == CREEP_SKELETON_ARCHER_ID) then
set spawnSkeletonArcherNumber[id] = spawnSkeletonArcherNumber[id] - 1
endif
if(GetUnitTypeId(dying) == CREEP_SKELETON_MAGE_ID) then
set spawnSkeletonMageNumber[id] = spawnSkeletonMageNumber[id] - 1
endif
if(IsPlayerAlly(ownerKiller, owner)) then
call TextTag_AttachUnit(textDeny, 10.0 * 0.023 / 10.0, dying, 30.0, /*
*/GetPlayerColorRedTinting(ownerKillerId), GetPlayerColorGreenTinting(ownerKillerId), GetPlayerColorBlueTinting(ownerKillerId), 255, /*
*/Cos(90.0 * bj_DEGTORAD) * 64.0 * 0.071 / 128, Sin(90.0 * bj_DEGTORAD) * 64.0 * 0.071 / 128,/*
*/false, 3.00, 2.0)
endif
set dying = null
set owner = null
set controller = null
set hero = null
set textDeny = null
endfunction
//----------------------------------------------------------------
private function Die_Conditions takes nothing returns boolean
local unit dying = GetDyingUnit()
local player owner = GetOwningPlayer(dying)
local boolean okey = (GetUnitTypeId(dying) == CREEP_SKELETON_WARRIOR_ID or /*
*/GetUnitTypeId(dying) == CREEP_SKELETON_ARCHER_ID or /*
*/GetUnitTypeId(dying) == CREEP_SKELETON_GIANT_ID or /*
*/GetUnitTypeId(dying) == CREEP_SKELETON_MAGE_ID) and /*
*/(owner == Player(8) or /*
*/owner == Player(9) or /*
*/owner == Player(10) or /*
*/owner == Player(11))
set dying = null
set owner = null
return okey
endfunction
//----------------------------------------------------------------
function Initialize_Spawn_Skeleton takes nothing returns nothing
call TriggerRegisterTimerEventPeriodic(SpawnSkeletonCycleTrg, 30.0)
endfunction
//----------------------------------------------------------------
function OnAllSpawn_Skeleton takes nothing returns nothing
call EnableTrigger(SpawnSkeletonCycleTrg)
call EnableTrigger(SpawnSkeletonTrg)
call EnableTrigger(CreepTrg)
endfunction
//----------------------------------------------------------------
function OffAllSpawn_Skeleton takes nothing returns nothing
call DisableTrigger(SpawnSkeletonCycleTrg)
call DisableTrigger(SpawnSkeletonTrg)
call DisableTrigger(CreepTrg)
endfunction
//----------------------------------------------------------------
function GetSkeletonSpawning takes integer spawnId returns boolean
return spawnAllow[spawnId]
endfunction
//----------------------------------------------------------------
function SetSkeletonSpawning takes boolean west, boolean north, boolean east, boolean south returns nothing
set spawnAllow[0] = west
set spawnAllow[1] = north
set spawnAllow[2] = east
set spawnAllow[3] = south
endfunction
//----------------------------------------------------------------
function SetSkeletonSpawningWest takes boolean west returns nothing
set spawnAllow[0] = west
endfunction
//----------------------------------------------------------------
function SetSkeletonSpawningNorth takes boolean north returns nothing
set spawnAllow[1] = north
endfunction
//----------------------------------------------------------------
function SetSkeletonSpawningEast takes boolean east returns nothing
set spawnAllow[2] = east
endfunction
//----------------------------------------------------------------
function SetSkeletonSpawningSouth takes boolean south returns nothing
set spawnAllow[3] = south
endfunction
//----------------------------------------------------------------
function SetSkeletonPatrols takes boolean in, boolean out returns nothing
set patrolIn1 = in
set patrolOut1 = out
endfunction
//----------------------------------------------------------------
function InstantOrderSkeletonWarrior takes string order returns nothing
local unit f = null
set copy = CopyGroup(Creature)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
call IssueImmediateOrder(f, order)
endloop
endfunction
//----------------------------------------------------------------
function KillAllSkeleton takes nothing returns nothing
local unit f = null
set copy = CopyGroup(Creature)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
call KillUnit(f)
endloop
endfunction
//----------------------------------------------------------------
function KillSkeletonByOwner takes player p returns nothing
local unit f = null
set copy = CopyGroup(Creature)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == p) then
call KillUnit(f)
endif
endloop
set p = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger SpawnSkeletonDieTrg = CreateTrigger()
local integer i = 0
set SpawnSkeletonCycleTrg = CreateTrigger()
set SpawnSkeletonTrg = CreateTrigger()
set CreepTrg = CreateTrigger()
//call TriggerRegisterTimerEventPeriodic(SpawnSkeletonCycleTrg, 30.0)
call DisableTrigger(SpawnSkeletonCycleTrg)
//call TriggerAddAction(SpawnSkeletonCycleTrg, function Skeleton_Spawn_Cycle_Actions)
call TriggerRegisterTimerEventPeriodic(SpawnSkeletonTrg, 1.0)
call DisableTrigger(SpawnSkeletonTrg)
call TriggerAddAction(SpawnSkeletonTrg, function Skeleton_Spawn_Actions)
call TriggerRegisterTimerEventPeriodic(CreepTrg, 0.5)
call DisableTrigger(CreepTrg)
call TriggerAddAction(CreepTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(SpawnSkeletonDieTrg, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(SpawnSkeletonDieTrg, Condition(function Die_Conditions))
call TriggerAddAction(SpawnSkeletonDieTrg, function Die_Actions)
//setting globals
set ht = InitHashtable()
set Creature = CreateGroup()
set copy = CreateGroup()
set all = CreateGroup()
set bexpr = Condition( function Pick)
set numSpawnPoint = 4
set spawnPoint[0] = gg_rct_Crypt_Spawn_West //Gray 8
set spawnPoint[1] = gg_rct_Crypt_Spawn_North //Light Blue 9
set spawnPoint[2] = gg_rct_Crypt_Spawn_East //Dark Green 10
set spawnPoint[3] = gg_rct_Crypt_Spawn_South //Brown 11
set hostileSmallPoint[0] = gg_rct_Neutral_Creep_Small_South_West
set hostileSmallPoint[1] = gg_rct_Neutral_Creep_Small_North_West
set hostileSmallPoint[2] = gg_rct_Neutral_Creep_Small_North_East
set hostileSmallPoint[3] = gg_rct_Neutral_Creep_Small_South_East
set hostileSmallPointChecker[0] = gg_rct_Neutral_Creep_Small_South_West_Checker
set hostileSmallPointChecker[1] = gg_rct_Neutral_Creep_Small_North_West_Checker
set hostileSmallPointChecker[2] = gg_rct_Neutral_Creep_Small_North_East_Checker
set hostileSmallPointChecker[3] = gg_rct_Neutral_Creep_Small_South_East_Checker
set hostileLargePoint[0] = gg_rct_Neutral_Creep_Large_South_West
set hostileLargePoint[1] = gg_rct_Neutral_Creep_Large_North_West
set hostileLargePoint[2] = gg_rct_Neutral_Creep_Large_North_East
set hostileLargePoint[3] = gg_rct_Neutral_Creep_Large_South_East
set hostileLargePointChecker[0] = gg_rct_Neutral_Creep_Large_South_West_Checker
set hostileLargePointChecker[1] = gg_rct_Neutral_Creep_Large_North_West_Checker
set hostileLargePointChecker[2] = gg_rct_Neutral_Creep_Large_North_East_Checker
set hostileLargePointChecker[3] = gg_rct_Neutral_Creep_Large_South_East_Checker
set hostileSmallFace[0] = 315.0
set hostileSmallFace[1] = 315.0
set hostileSmallFace[2] = 135.0
set hostileSmallFace[3] = 135.0
set hostileLargeFace[0] = 90.0
set hostileLargeFace[1] = 90.0
set hostileLargeFace[2] = 270.0
set hostileLargeFace[3] = 270.0
set i = 0
loop
exitwhen(i >= 4)
set spawnAllow[i] = true
set spawnSkeletonGiantNumber[i] = 0
set spawnSkeletonWarriorNumber[i] = 0
set spawnSkeletonArcherNumber[i] = 0
set spawnSkeletonMageNumber[i] = 0
set i = i + 1
endloop
set patrolIn1 = true
set patrolOut1 = false
set patrolOut2 = false
set spawn = true
set spawnSet = 0
set spawnSkeletonGiant = true
set spawnSkeletonWarrior = true
set spawnSkeletonArcher = true
set spawnSkeletonMage = true
set cycle = 0
set cycleMax = 3
set cycleDuration = CYCLE_DURATION
set spawnTime = 0.0
set spawnType = 0
set spawnPlayerNum[0] = 8
set spawnPlayerNum[1] = 9
set spawnPlayerNum[2] = 10
set spawnPlayerNum[3] = 11
set numPatrolPoint = 5
set patrolPoint[0] = gg_rct_Temple_High_Center
set patrolPoint[1] = gg_rct_Creep_Defend_West
set patrolPoint[2] = gg_rct_Creep_Defend_North
set patrolPoint[3] = gg_rct_Creep_Defend_East
set patrolPoint[4] = gg_rct_Creep_Defend_South
set patrolPoint[5] = gg_rct_Creep_Attack_South_West
set patrolPoint[6] = gg_rct_Creep_Attack_North_East
set patrolPoint[7] = gg_rct_Creep_Attack_South_East
set patrolPoint[8] = gg_rct_Creep_Attack_North_West
endfunction
endscope
//TESH.scrollpos=78
//TESH.alwaysfold=0
globals
unit array Power_Tower[4]
effect array Power_Tower_Effect[4]
player array Power_Tower_Controller[4]
string array Power_Tower_Effect_Id[10]
integer array Power_Tower_Gold_Bonus[4]
endglobals
scope PowerTower initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer UNIT_ID = 'hatw' //Tower unit id
private constant string CAPTURE_TIPS = "A |cff00ff00Crypt|r has been |cffff0000captured.|r" //Capture both Power_Tower message
private constant string CONTROL_TIPS = "Destroying |cff00ff00Power Towers|r will gives you alliance with its skeletons" //Control Power_Tower message
private constant string CONTROL_EFFECT = "war3mapImported\\GainLife.mdx" //Control
private constant real DURATION_CONTROL = 120.0 //Duration invulnerable tower
private constant real DEFEND_PERCENTAGE = 0.25 //Defend aura protection
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
endglobals
//----------------------------------------------------------------
function Defend_Aura_onDamage takes unit attacker, unit attacked, real amount returns nothing
local real heal = amount * DEFEND_PERCENTAGE
call SetUnitState(attacked, UNIT_STATE_LIFE, GetUnitState(attacked, UNIT_STATE_LIFE) + heal)
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit dying = GetTriggerUnit()
local real dyingX = GetUnitX(dying)
local real dyingY = GetUnitY(dying)
local player ownerDying = GetOwningPlayer(dying)
local unit killer = GetKillingUnit()
local player ownerKiller = GetOwningPlayer(killer)
local integer ownerKillerId = GetPlayerId(ownerKiller)
local boolean isOwnedPlayer = (ownerKillerId >= 0 and ownerKillerId < 8)
local force forceKiller = GetPlayerAllForce(ownerKiller)
local force forceController = null
local integer i = 0
local player p = null
local unit powerTower = null
local integer mode = 0
local effect sfx = null
local effect controlSfx = null
local real x = dyingX
local real y = dyingY
if(not isOwnedPlayer) then
set powerTower = CreateUnit(ownerDying, UNIT_ID, dyingX, dyingY, bj_UNIT_FACING)
set controlSfx = AddSpecialEffect(CONTROL_EFFECT, dyingX, dyingY)
//call RemoveUnit(dying)
call SetUnitX(powerTower, x)
call SetUnitY(powerTower, y)
else
//if(IsPlayerInForce(ownerKiller, Players_Luminous)) then
//set powerTower = CreateUnit(Player(13), UNIT_ID, dyingX, dyingY, bj_UNIT_FACING)
//elseif(IsPlayerInForce(ownerKiller, Players_Overcast)) then
//set powerTower = CreateUnit(Player(14), UNIT_ID, dyingX, dyingY, bj_UNIT_FACING)
//else
set powerTower = CreateUnit(ownerDying, UNIT_ID, dyingX, dyingY, bj_UNIT_FACING)
set controlSfx = AddSpecialEffect(CONTROL_EFFECT, dyingX, dyingY)
//endif
if(dying == Power_Tower[0]) then
if(Power_Tower_Controller[0] != null) then
set forceController = GetPlayerAllForce(Power_Tower_Controller[0])
call ForceRemovePlayer(forceController, Player(8))
call SetForceAllianceStateBJ(forceController, Creep_West, bj_ALLIANCE_UNALLIED)
call SetForceAllianceStateBJ(Creep_West, forceController, bj_ALLIANCE_UNALLIED)
endif
call SetForceAllianceStateBJ(forceKiller, Creep_West, bj_ALLIANCE_ALLIED_VISION)
call SetForceAllianceStateBJ(Creep_West, forceKiller, bj_ALLIANCE_ALLIED_VISION)
set Power_Tower_Controller[0] = ownerKiller
call ForceAddPlayer(forceKiller, Player(8))
set x = GetRectCenterX(gg_rct_Power_Tower_West)
set y = GetRectCenterY(gg_rct_Power_Tower_West)
elseif(dying == Power_Tower[1]) then
if(Power_Tower_Controller[1] != null) then
set forceController = GetPlayerAllForce(Power_Tower_Controller[1])
call ForceRemovePlayer(forceController, Player(9))
call SetForceAllianceStateBJ(forceController, Creep_North, bj_ALLIANCE_UNALLIED)
call SetForceAllianceStateBJ(Creep_North, forceController, bj_ALLIANCE_UNALLIED)
endif
call SetForceAllianceStateBJ(forceKiller, Creep_North, bj_ALLIANCE_ALLIED_VISION)
call SetForceAllianceStateBJ(Creep_North, forceKiller, bj_ALLIANCE_ALLIED_VISION)
set Power_Tower_Controller[1] = ownerKiller
call ForceAddPlayer(forceKiller, Player(9))
set x = GetRectCenterX(gg_rct_Power_Tower_North)
set y = GetRectCenterY(gg_rct_Power_Tower_North)
elseif(dying == Power_Tower[2]) then
if(Power_Tower_Controller[2] != null) then
set forceController = GetPlayerAllForce(Power_Tower_Controller[2])
call ForceRemovePlayer(forceController, Player(10))
call SetForceAllianceStateBJ(forceController, Creep_East, bj_ALLIANCE_UNALLIED)
call SetForceAllianceStateBJ(Creep_East, forceController, bj_ALLIANCE_UNALLIED)
endif
call SetForceAllianceStateBJ(forceKiller, Creep_East, bj_ALLIANCE_ALLIED_VISION)
call SetForceAllianceStateBJ(Creep_East, forceKiller, bj_ALLIANCE_ALLIED_VISION)
set Power_Tower_Controller[2] = ownerKiller
call ForceAddPlayer(forceKiller, Player(10))
set x = GetRectCenterX(gg_rct_Power_Tower_East)
set y = GetRectCenterY(gg_rct_Power_Tower_East)
elseif(dying == Power_Tower[3]) then
if(Power_Tower_Controller[3] != null) then
set forceController = GetPlayerAllForce(Power_Tower_Controller[3])
call ForceRemovePlayer(forceController, Player(11))
call SetForceAllianceStateBJ(forceController, Creep_South, bj_ALLIANCE_UNALLIED)
call SetForceAllianceStateBJ(Creep_South, forceController, bj_ALLIANCE_UNALLIED)
endif
call SetForceAllianceStateBJ(forceKiller, Creep_South, bj_ALLIANCE_ALLIED_VISION)
call SetForceAllianceStateBJ(Creep_South, forceKiller, bj_ALLIANCE_ALLIED_VISION)
set Power_Tower_Controller[3] = ownerKiller
call ForceAddPlayer(forceKiller, Player(11))
set x = GetRectCenterX(gg_rct_Power_Tower_South)
set y = GetRectCenterY(gg_rct_Power_Tower_South)
endif
if(IsPlayerAlly(ownerKiller, Player(13))) then
call Operate_Allied_Gate("open", 13)
elseif(IsPlayerAlly(ownerKiller, Player(14))) then
call Operate_Allied_Gate("open", 14)
endif
call KillSkeletonByOwner(ownerDying)
call SetUnitInvulnerable(powerTower, true)
call SetUnitX(powerTower, x)
call SetUnitY(powerTower, y)
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, TipsForce)) then
call DisplayTextToPlayer(p, 0, 0, CAPTURE_TIPS)
endif
set i = i + 1
endloop
if(IsPlayerInForce(ownerKiller, TipsForce)) then
call DisplayTextToPlayer(ownerKiller, 0, 0, CONTROL_TIPS)
endif
set i = 0
loop
exitwhen(i >= 4)
if(dying == Power_Tower[i]) then
if(Power_Tower_Effect[i] != null) then
call DestroyEffect(Power_Tower_Effect[i])
set Power_Tower_Effect[i] = null
set i = 4
endif
endif
set i = i + 1
endloop
set sfx = AddSpecialEffectTarget(Power_Tower_Effect_Id[ownerKillerId], powerTower, "weapon")
endif
set i = 0
loop
exitwhen(i >= 4)
if(dying == Power_Tower[i]) then
if(powerTower != null) then
set Power_Tower[i] = powerTower
endif
if(sfx != null) then
set Power_Tower_Effect[i] = sfx
endif
set i = 4
endif
set i = i + 1
endloop
call TriggerSleepAction(DURATION_CONTROL)
call SetUnitInvulnerable(powerTower, false)
call DestroyEffect(controlSfx)
set dying = null
set ownerDying = null
set killer = null
set ownerKiller = null
set powerTower = null
set forceKiller = null
set forceController = null
set p = null
set powerTower = null
set sfx = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return IsUnitType(GetTriggerUnit(), UNIT_TYPE_STRUCTURE) and /*
*/GetUnitTypeId(GetTriggerUnit()) == UNIT_ID
endfunction
//----------------------------------------------------------------
function Power_Tower_onDamage takes unit attacker, unit attacked, real amount returns nothing
local integer attackerType = GetUnitTypeId(attacker)
if(attackerType == 'uske' or attackerType == 'uskm' or attackerType == 'uabo' or attackerType == 'unec') then
if(GetUnitState(attacked, UNIT_STATE_LIFE) < 0.1 * GetUnitState(attacked, UNIT_STATE_MAX_LIFE)) then
call SetUnitState(attacked, UNIT_STATE_LIFE, GetUnitState(attacked, UNIT_STATE_LIFE) + amount)
endif
endif
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger Power_TowerTrg = CreateTrigger()
local integer i = 0
local real x = 0.0
local real y = 0.0
call TriggerRegisterAnyUnitEventBJ(Power_TowerTrg, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(Power_TowerTrg, Condition(function Conditions))
call TriggerAddAction(Power_TowerTrg, function Actions)
//setting globals
set Power_Tower[0] = gg_unit_hatw_0075
set Power_Tower[1] = gg_unit_hatw_0076
set Power_Tower[2] = gg_unit_hatw_0077
set Power_Tower[3] = gg_unit_hatw_0078
set i = 0
loop
exitwhen(i >= 4)
call SetUnitInvulnerable(Power_Tower[i], true)
set Power_Tower_Effect[i] = null
set Power_Tower_Gold_Bonus[i] = 0
set i = i + 1
endloop
set i = 0
loop
exitwhen(i >= 4)
set Power_Tower_Controller[i] = null
set i = i + 1
endloop
set Power_Tower_Effect_Id[0] = "Doodads\\Cinematic\\GlowingRunes\\GlowingRunes0.mdl"
set Power_Tower_Effect_Id[1] = "Doodads\\Cinematic\\GlowingRunes\\GlowingRunes4.mdl"
set Power_Tower_Effect_Id[2] = "Doodads\\Cinematic\\GlowingRunes\\GlowingRunes1.mdl"
set Power_Tower_Effect_Id[3] = "Doodads\\Cinematic\\GlowingRunes\\GlowingRunes7.mdl"
set Power_Tower_Effect_Id[4] = "Doodads\\Cinematic\\GlowingRunes\\GlowingRunes3.mdl"
set Power_Tower_Effect_Id[5] = "Doodads\\Cinematic\\GlowingRunes\\GlowingRunes8.mdl"
set Power_Tower_Effect_Id[6] = "Doodads\\Cinematic\\GlowingRunes\\GlowingRunes6.mdl"
set Power_Tower_Effect_Id[7] = "Doodads\\Cinematic\\GlowingRunes\\GlowingRunes5.mdl"
set Power_Tower_Effect_Id[8] = "Doodads\\Cityscape\\Props\\MagicRunes\\MagicRunes0.mdl"
set Power_Tower_Effect_Id[9] = "Doodads\\Cityscape\\Props\\MagicRunes\\MagicRunes2.mdl"
endfunction
endscope
//TESH.scrollpos=15
//TESH.alwaysfold=0
globals
unit array Obelisk_Luminous[3]
unit array Obelisk_Overcast[3]
integer array Player_Rune[8]
unit array Rune[8]
rect Pick_Circle
rect array Boat_Location[8]
real array Boat_Angle[8]
unit array Boat[8]
group Boats
constant integer LUMINOUS_BOAT_ID = 'hbot'
constant integer OVERCAST_BOAT_ID = 'hbot'
constant string STRENGTH_EFFECT = "Abilities\\Spells\\Items\\AIsm\\AIsmTarget.mdl" //Strength gain
constant string AGILITY_EFFECT = "Abilities\\Spells\\Items\\AIam\\AIamTarget.mdl" //Strength gain
constant string INTELLIGENCE_EFFECT = "Abilities\\Spells\\Items\\AIim\\AIimTarget.mdl" //Strength gain
endglobals
scope Modes initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set Obelisk_Luminous[0] = gg_unit_nrat_0014
set Obelisk_Luminous[1] = gg_unit_nech_0023
set Obelisk_Luminous[2] = gg_unit_ncrb_0024
set Obelisk_Overcast[0] = gg_unit_ndog_0025
set Obelisk_Overcast[1] = gg_unit_ndwm_0034
set Obelisk_Overcast[2] = gg_unit_nfbr_0035
set Player_Rune[0] = 'n005'
set Player_Rune[1] = 'n006'
set Player_Rune[2] = 'n007'
set Player_Rune[3] = 'n008'
set Player_Rune[4] = 'n009'
set Player_Rune[5] = 'n00A'
set Player_Rune[6] = 'n00B'
set Player_Rune[7] = 'n00C'
set Pick_Circle = gg_rct_Hero_Rune
set Boat_Location[0] = gg_rct_Boat_1
set Boat_Location[1] = gg_rct_Boat_2
set Boat_Location[2] = gg_rct_Boat_3
set Boat_Location[3] = gg_rct_Boat_4
set Boat_Location[4] = gg_rct_Boat_5
set Boat_Location[5] = gg_rct_Boat_6
set Boat_Location[6] = gg_rct_Boat_7
set Boat_Location[7] = gg_rct_Boat_8
set Boat_Angle[0] = 225.0
set Boat_Angle[1] = 225.0
set Boat_Angle[2] = 225.0
set Boat_Angle[3] = 225.0
set Boat_Angle[4] = 45.0
set Boat_Angle[5] = 45.0
set Boat_Angle[6] = 45.0
set Boat_Angle[7] = 45.0
set Boats = CreateGroup()
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope Phase0Time0 initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant string QUEST_MESSAGE = "|cffffff00Info (f9)|r for more information.\n"
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local integer i = 0
local player p = null
loop
exitwhen(i >= bj_MAX_PLAYERS)
set p = Player(i)
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, QUEST_MESSAGE)
endif
set i = i + 1
endloop
set p = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger Phase0Time0Trg = CreateTrigger()
call TriggerRegisterTimerEventSingle(Phase0Time0Trg, 5.0)
call TriggerAddAction(Phase0Time0Trg, function Actions)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
globals
trigger Phase0Time1Trg
endglobals
scope Phase0Time1 initializer Init
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
if(IsTriggerEnabled(NormalPickTrg)) then
call TriggerExecute(NormalPickTrg)
endif
call DisableTrigger(Phase0Time1Trg)
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set Phase0Time1Trg = CreateTrigger()
call TriggerRegisterTimerEventSingle(Phase0Time1Trg, 14.0)
call TriggerAddAction(Phase0Time1Trg, function Actions)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
globals
trigger Phase0Time2Trg
endglobals
scope Phase0Time2 initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer RANDOM_ID = 'Rhst' //Random upgrade rawcode
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local integer i = 0
if(GameMode != MODE_ALLRANDOM) then
call EnableTrigger(RandomHeroTrg)
call DisableTrigger(RandomHeroWaitTrg)
set i = 0
loop
exitwhen(i >= 8)
call SetPlayerTechResearched(Player(i), RANDOM_ID, 2)
set i = i + 1
endloop
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set Phase0Time2Trg = CreateTrigger()
call TriggerRegisterTimerEventSingle(Phase0Time2Trg, 15.0)
call TriggerAddAction(Phase0Time2Trg, function Actions)
endfunction
endscope
//TESH.scrollpos=246
//TESH.alwaysfold=0
globals
trigger Phase1Time0Trg
endglobals
scope Phase1Time0 initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer NORMAL_ABILITY_ID = 'Aall' //Ability Select Unit rawcode
private constant integer ALLPICK_ABILITY_ID = 'Ane2' //Ability Select Unit rawcode
private constant string NORMAL_TEXT = "Normal mode" //Normal texttag
private constant string ALLPICK_TEXT = "All pick mode" //All pick texttag
private constant string ALLRANDOM_TEXT = "All random mode" //All random texttag
private constant string ALLSAME_TEXT = "All same mode" //All same texttag
private constant string TEST_TEXT = "Test mode" //Test texttag
private constant real TEXT_SIZE = 10.0 //Text size
private constant real TEXT_HEIGHT = 50.0 //Text height
private constant real PING_DURATION = 10.0 //Ping duration
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Normal_Game_Setting takes nothing returns nothing
local texttag tt = null
local real shift = RMinBJ(StringLength(NORMAL_TEXT)*5.5, 200.0)
call SetUnitOwner(Obelisk_Luminous[0], Player(13), true)
call SetUnitOwner(Obelisk_Luminous[1], Player(13), true)
call SetUnitOwner(Obelisk_Luminous[2], Player(13), true)
call SetUnitOwner(Obelisk_Overcast[0], Player(14), true)
call SetUnitOwner(Obelisk_Overcast[1], Player(14), true)
call SetUnitOwner(Obelisk_Overcast[2], Player(14), true)
call UnitAddAbility(Obelisk_Luminous[0], NORMAL_ABILITY_ID)
call UnitAddAbility(Obelisk_Luminous[1], NORMAL_ABILITY_ID)
call UnitAddAbility(Obelisk_Luminous[2], NORMAL_ABILITY_ID)
call UnitAddAbility(Obelisk_Overcast[0], NORMAL_ABILITY_ID)
call UnitAddAbility(Obelisk_Overcast[1], NORMAL_ABILITY_ID)
call UnitAddAbility(Obelisk_Overcast[2], NORMAL_ABILITY_ID)
call EnableTrigger(PickHeroTrg)
//call EnableTrigger(AntiMaphackTrg)
set tt = CreateTextTag()
call SetTextTagText(tt, NORMAL_TEXT, TEXT_SIZE * 0.023 / 10)
call SetTextTagColor(tt, 255, 255, 255, 255)
call SetTextTagPos(tt, GetRectCenterX(gg_rct_Mode_Show) - shift, GetRectCenterY(gg_rct_Mode_Show), TEXT_HEIGHT)
call SetTextTagPermanent(tt, true)
set tt = null
endfunction
//----------------------------------------------------------------
private function AllPick_Game_Setting takes nothing returns nothing
local texttag tt = null
local real shift = RMinBJ(StringLength(ALLPICK_TEXT)*5.5, 200.0)
call UnitAddAbility(Obelisk_Luminous[0], ALLPICK_ABILITY_ID)
call UnitAddAbility(Obelisk_Luminous[1], ALLPICK_ABILITY_ID)
call UnitAddAbility(Obelisk_Luminous[2], ALLPICK_ABILITY_ID)
call UnitAddAbility(Obelisk_Overcast[0], ALLPICK_ABILITY_ID)
call UnitAddAbility(Obelisk_Overcast[1], ALLPICK_ABILITY_ID)
call UnitAddAbility(Obelisk_Overcast[2], ALLPICK_ABILITY_ID)
call EnableTrigger(PickHeroTrg)
call DisableTrigger(Phase0Time1Trg)
//call EnableTrigger(AntiMaphackTrg)
set tt = CreateTextTag()
call SetTextTagText(tt, ALLPICK_TEXT, TEXT_SIZE * 0.023 / 10)
call SetTextTagColor(tt, 255, 255, 255, 255)
call SetTextTagPos(tt, GetRectCenterX(gg_rct_Mode_Show) - shift, GetRectCenterY(gg_rct_Mode_Show), TEXT_HEIGHT)
call SetTextTagPermanent(tt, true)
set tt = null
endfunction
//----------------------------------------------------------------
private function AllRandom_Game_Setting takes nothing returns nothing
local integer i = 0
local integer j = 0
local player p = null
local integer randomInt = 0
local boolean exist = false
local texttag tt = null
local real shift = RMinBJ(StringLength(ALLRANDOM_TEXT)*5.5, 200.0)
call DisableTrigger(Phase0Time1Trg)
call DisableTrigger(Phase0Time2Trg)
call DisableTrigger(PickHeroTrg)
call DisableTrigger(RandomHeroTrg)
call DisableTrigger(RandomHeroWaitTrg)
set tt = CreateTextTag()
call SetTextTagText(tt, ALLRANDOM_TEXT, TEXT_SIZE * 0.023 / 10)
call SetTextTagColor(tt, 255, 255, 255, 255)
call SetTextTagPos(tt, GetRectCenterX(gg_rct_Mode_Show) - shift, GetRectCenterY(gg_rct_Mode_Show), TEXT_HEIGHT)
call SetTextTagPermanent(tt, true)
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
set randomInt = GetRandomInt(0, Total_Heroes - 1)
set exist = false
set j = 0
loop
exitwhen(j >= i)
if(randomInt == Hero_Selected_Player[j]) then
set i = i - 1
set j = i
set exist = true
endif
set j = j + 1
endloop
if(not exist and (Allow_Heroes[randomInt])) then
set Hero_Selected_Player[i] = randomInt
else
set i = i - 1
endif
endif
set i = i + 1
endloop
call EnableTrigger(PickHeroTrg)
call DisableTrigger(Phase0Time1Trg)
//call EnableTrigger(AntiMaphackTrg)
set p = null
set tt = null
endfunction
//----------------------------------------------------------------
private function AllSame_Game_Setting takes nothing returns nothing
local texttag tt = null
local real shift = RMinBJ(StringLength(ALLSAME_TEXT)*5.5, 200.0)
call SetUnitOwner(Obelisk_Luminous[0], Player(13), true)
call SetUnitOwner(Obelisk_Luminous[1], Player(13), true)
call SetUnitOwner(Obelisk_Luminous[2], Player(13), true)
call SetUnitOwner(Obelisk_Overcast[0], Player(13), true)
call SetUnitOwner(Obelisk_Overcast[1], Player(13), true)
call SetUnitOwner(Obelisk_Overcast[2], Player(13), true)
call UnitAddAbility(Obelisk_Luminous[0], NORMAL_ABILITY_ID)
call UnitAddAbility(Obelisk_Luminous[1], NORMAL_ABILITY_ID)
call UnitAddAbility(Obelisk_Luminous[2], NORMAL_ABILITY_ID)
call UnitAddAbility(Obelisk_Overcast[0], NORMAL_ABILITY_ID)
call UnitAddAbility(Obelisk_Overcast[1], NORMAL_ABILITY_ID)
call UnitAddAbility(Obelisk_Overcast[2], NORMAL_ABILITY_ID)
call EnableTrigger(PickSameHeroTrg)
call DisableTrigger(Phase0Time1Trg)
call DisableTrigger(RandomHeroTrg)
//call EnableTrigger(AntiMaphackTrg)
set tt = CreateTextTag()
call SetTextTagText(tt, ALLSAME_TEXT, TEXT_SIZE * 0.023 / 10)
call SetTextTagColor(tt, 255, 255, 255, 255)
call SetTextTagPos(tt, GetRectCenterX(gg_rct_Mode_Show) - shift, GetRectCenterY(gg_rct_Mode_Show), TEXT_HEIGHT)
call SetTextTagPermanent(tt, true)
set tt = null
endfunction
//----------------------------------------------------------------
private function Test_Game_Setting takes nothing returns nothing
local texttag tt = null
local real shift = RMinBJ(StringLength(TEST_TEXT)*5.5, 200.0)
call UnitAddAbility(Obelisk_Luminous[0], ALLPICK_ABILITY_ID)
call UnitAddAbility(Obelisk_Luminous[1], ALLPICK_ABILITY_ID)
call UnitAddAbility(Obelisk_Luminous[2], ALLPICK_ABILITY_ID)
call UnitAddAbility(Obelisk_Overcast[0], ALLPICK_ABILITY_ID)
call UnitAddAbility(Obelisk_Overcast[1], ALLPICK_ABILITY_ID)
call UnitAddAbility(Obelisk_Overcast[2], ALLPICK_ABILITY_ID)
call EnableTrigger(PickHeroTrg)
call DisableTrigger(Phase0Time1Trg)
set tt = CreateTextTag()
call SetTextTagText(tt, TEST_TEXT, TEXT_SIZE * 0.023 / 10)
call SetTextTagColor(tt, 255, 255, 255, 255)
call SetTextTagPos(tt, GetRectCenterX(gg_rct_Mode_Show) - shift, GetRectCenterY(gg_rct_Mode_Show), TEXT_HEIGHT)
call SetTextTagPermanent(tt, true)
set tt = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local real x = GetRectCenterX(gg_rct_Hero_Rune)
local real y = GetRectCenterY(gg_rct_Hero_Rune)
local integer random = 0
if(GameMode == MODE_NORMAL) then
call Normal_Game_Setting()
if(IsPlayerInForce(GetLocalPlayer(), Players)) then
call PingMinimap(x, y, PING_DURATION)
endif
elseif(GameMode == MODE_ALLPICK) then
call AllPick_Game_Setting()
if(IsPlayerInForce(GetLocalPlayer(), Players)) then
call PingMinimap(x, y, PING_DURATION)
endif
elseif(GameMode == MODE_ALLRANDOM) then
call AllRandom_Game_Setting()
elseif(GameMode == MODE_ALLSAME) then
call AllSame_Game_Setting()
if(GetLocalPlayer() == Player(0)) then
call PingMinimap(x, y, PING_DURATION)
endif
elseif(GameMode == MODE_TEST) then
call Test_Game_Setting()
if(IsPlayerInForce(GetLocalPlayer(), Players)) then
call PingMinimap(x, y, PING_DURATION)
endif
endif
set random = GetRandomInt(1, 2)
if(random == 0) then
call SetForceAllianceStateBJ(All_Luminous, Creep_West, bj_ALLIANCE_ALLIED_VISION)
call SetForceAllianceStateBJ(Creep_West, All_Luminous, bj_ALLIANCE_ALLIED_VISION)
call ForceAddPlayer(All_Luminous, Player(8))
set Power_Tower_Controller[0] = Player(13)
set Power_Tower_Effect[0] = AddSpecialEffectTarget(Power_Tower_Effect_Id[8], Power_Tower[0], "weapon")
elseif(random == 1) then
call SetForceAllianceStateBJ(All_Luminous, Creep_North, bj_ALLIANCE_ALLIED_VISION)
call SetForceAllianceStateBJ(Creep_North, All_Luminous, bj_ALLIANCE_ALLIED_VISION)
call ForceAddPlayer(All_Luminous, Player(9))
set Power_Tower_Controller[1] = Player(13)
set Power_Tower_Effect[1] = AddSpecialEffectTarget(Power_Tower_Effect_Id[8], Power_Tower[1], "weapon")
elseif(random == 2) then
call SetForceAllianceStateBJ(All_Luminous, Creep_East, bj_ALLIANCE_ALLIED_VISION)
call SetForceAllianceStateBJ(Creep_East, All_Luminous, bj_ALLIANCE_ALLIED_VISION)
call ForceAddPlayer(All_Luminous, Player(10))
set Power_Tower_Controller[2] = Player(13)
set Power_Tower_Effect[2] = AddSpecialEffectTarget(Power_Tower_Effect_Id[8], Power_Tower[2], "weapon")
elseif(random == 3) then
call SetForceAllianceStateBJ(All_Luminous, Creep_South, bj_ALLIANCE_ALLIED_VISION)
call SetForceAllianceStateBJ(Creep_South, All_Luminous, bj_ALLIANCE_ALLIED_VISION)
call ForceAddPlayer(All_Luminous, Player(11))
set Power_Tower_Controller[3] = Player(13)
set Power_Tower_Effect[3] = AddSpecialEffectTarget(Power_Tower_Effect_Id[8], Power_Tower[3], "weapon")
endif
if(random == 0) then
call SetForceAllianceStateBJ(All_Overcast, Creep_East, bj_ALLIANCE_ALLIED_VISION)
call SetForceAllianceStateBJ(Creep_East, All_Overcast, bj_ALLIANCE_ALLIED_VISION)
call ForceAddPlayer(All_Overcast, Player(10))
set Power_Tower_Controller[2] = Player(14)
set Power_Tower_Effect[2] = AddSpecialEffectTarget(Power_Tower_Effect_Id[9], Power_Tower[2], "weapon")
elseif(random == 1) then
call SetForceAllianceStateBJ(All_Overcast, Creep_South, bj_ALLIANCE_ALLIED_VISION)
call SetForceAllianceStateBJ(Creep_South, All_Overcast, bj_ALLIANCE_ALLIED_VISION)
call ForceAddPlayer(All_Overcast, Player(11))
set Power_Tower_Controller[3] = Player(14)
set Power_Tower_Effect[3] = AddSpecialEffectTarget(Power_Tower_Effect_Id[9], Power_Tower[3], "weapon")
elseif(random == 2) then
call SetForceAllianceStateBJ(All_Overcast, Creep_West, bj_ALLIANCE_ALLIED_VISION)
call SetForceAllianceStateBJ(Creep_West, All_Overcast, bj_ALLIANCE_ALLIED_VISION)
call ForceAddPlayer(All_Overcast, Player(8))
set Power_Tower_Controller[0] = Player(14)
set Power_Tower_Effect[0] = AddSpecialEffectTarget(Power_Tower_Effect_Id[9], Power_Tower[0], "weapon")
elseif(random == 3) then
call SetForceAllianceStateBJ(All_Overcast, Creep_North, bj_ALLIANCE_ALLIED_VISION)
call SetForceAllianceStateBJ(Creep_North, All_Overcast, bj_ALLIANCE_ALLIED_VISION)
call ForceAddPlayer(All_Overcast, Player(9))
set Power_Tower_Controller[1] = Player(14)
set Power_Tower_Effect[1] = AddSpecialEffectTarget(Power_Tower_Effect_Id[9], Power_Tower[1], "weapon")
endif
call TriggerExecute(AIBirthTrg)
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set Phase1Time0Trg = CreateTrigger()
call TriggerAddAction(Phase1Time0Trg, function Actions)
endfunction
endscope
//TESH.scrollpos=147
//TESH.alwaysfold=0
globals
trigger Phase1Time1Trg
endglobals
scope Phase1Time1 initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant string MULTIBOARD_TITLE_MOVE_BOAT = " [|cffffffe1Move Boat|r]"
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private integer Total
endglobals
//----------------------------------------------------------------
private function Players_Multiboard takes nothing returns nothing
local player enumPlayer = GetEnumPlayer()
local integer playerNum = GetPlayerId(enumPlayer)
local integer position = Total + 1
local multiboarditem mbItem = null
call SaveInteger(Info_Ht, playerNum, MULTIBOARD_ROW_KEY, Total + 1)
set mbItem = MultiboardGetItem(MultiB, position, MULTIBOARD_PLAYER_NAME)
call MultiboardSetItemValue(mbItem, Player_Name[playerNum])
call MultiboardSetItemIcon(mbItem, "ReplaceableTextures\\CommandButtons\\BTNSelectHeroOn.blp")
call MultiboardSetItemWidth(mbItem, MULTIBOARD_PLAYER_NAME_LENGTH)
set mbItem = MultiboardGetItem(MultiB, position, MULTIBOARD_PLAYER_REVIVE)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_REVIVE_COLOR_CODE+"0"+"|r")
call MultiboardSetItemStyle(mbItem, true, false)
call MultiboardSetItemWidth(mbItem, MULTIBOARD_PLAYER_REVIVE_LENGTH)
set mbItem = MultiboardGetItem(MultiB, position, MULTIBOARD_PLAYER_LEVEL)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_LEVEL_COLOR_CODE+"?"+"|r")
call MultiboardSetItemStyle(mbItem, true, false)
call MultiboardSetItemWidth(mbItem, MULTIBOARD_PLAYER_LEVEL_LENGTH)
set mbItem = MultiboardGetItem(MultiB, position, MULTIBOARD_PLAYER_KILL)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_KILL_COLOR_CODE+"0"+"|r")
call MultiboardSetItemStyle(mbItem, true, false)
call MultiboardSetItemWidth(mbItem, MULTIBOARD_PLAYER_KILL_LENGTH)
set mbItem = MultiboardGetItem(MultiB, position, MULTIBOARD_PLAYER_DEATH)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_DEATH_COLOR_CODE+"0"+"|r")
call MultiboardSetItemStyle(mbItem, true, false)
call MultiboardSetItemWidth(mbItem, MULTIBOARD_PLAYER_DEATH_LENGTH)
set mbItem = MultiboardGetItem(MultiB, position, MULTIBOARD_PLAYER_ASSIST)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_ASSIST_COLOR_CODE+"0"+"|r")
call MultiboardSetItemStyle(mbItem, true, false)
call MultiboardSetItemWidth(mbItem, MULTIBOARD_PLAYER_ASSIST_LENGTH)
set mbItem = MultiboardGetItem(MultiB, position, MULTIBOARD_PLAYER_GOLD)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_GOLD_COLOR_CODE+""+"|r")
call MultiboardSetItemStyle(mbItem, true, false)
call MultiboardSetItemWidth(mbItem, MULTIBOARD_PLAYER_GOLD_LENGTH)
set Total = Total + 1
set enumPlayer = null
set mbItem = null
endfunction
//----------------------------------------------------------------
private function Set_Force_Multiboard takes player p, integer num, integer position returns nothing
local multiboarditem mbItem = null
call SaveInteger(Info_Ht, num, MULTIBOARD_ROW_KEY, Total + 1)
set mbItem = MultiboardGetItem(MultiB, position, MULTIBOARD_PLAYER_NAME)
call MultiboardSetItemValue(mbItem, Player_Name[num])
call MultiboardSetItemStyle(mbItem, true, false)
call MultiboardSetItemWidth(mbItem, MULTIBOARD_PLAYER_NAME_LENGTH)
set mbItem = MultiboardGetItem(MultiB, position, MULTIBOARD_PLAYER_REVIVE)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_REVIVE_COLOR_CODE+""+"|r")
call MultiboardSetItemStyle(mbItem, true, false)
call MultiboardSetItemWidth(mbItem, MULTIBOARD_PLAYER_REVIVE_LENGTH)
set mbItem = MultiboardGetItem(MultiB, position, MULTIBOARD_PLAYER_LEVEL)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_LEVEL_COLOR_CODE+""+"|r")
call MultiboardSetItemStyle(mbItem, true, false)
call MultiboardSetItemWidth(mbItem, MULTIBOARD_PLAYER_LEVEL_LENGTH)
set mbItem = MultiboardGetItem(MultiB, position, MULTIBOARD_PLAYER_KILL)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_KILL_COLOR_CODE+"0"+"|r")
call MultiboardSetItemStyle(mbItem, true, false)
call MultiboardSetItemWidth(mbItem, MULTIBOARD_PLAYER_KILL_LENGTH)
set mbItem = MultiboardGetItem(MultiB, position, MULTIBOARD_PLAYER_DEATH)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_DEATH_COLOR_CODE+"0"+"|r")
call MultiboardSetItemStyle(mbItem, true, false)
call MultiboardSetItemWidth(mbItem, MULTIBOARD_PLAYER_DEATH_LENGTH)
set mbItem = MultiboardGetItem(MultiB, position, MULTIBOARD_PLAYER_ASSIST)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_ASSIST_COLOR_CODE+"0"+"|r")
call MultiboardSetItemStyle(mbItem, true, false)
call MultiboardSetItemWidth(mbItem, MULTIBOARD_PLAYER_ASSIST_LENGTH)
set mbItem = MultiboardGetItem(MultiB, position, MULTIBOARD_PLAYER_GOLD)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_GOLD_COLOR_CODE+""+"|r")
call MultiboardSetItemStyle(mbItem, true, false)
call MultiboardSetItemWidth(mbItem, MULTIBOARD_PLAYER_GOLD_LENGTH)
set Total = Total + 1
set p = null
set mbItem = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local multiboarditem mbItem = null
local integer i = 0
local player p = null
local integer total = 0
local integer increaseRow = 1
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
set total = total + 1
endif
set i = i + 1
endloop
if(Players_Luminous_Count > 0) then
set increaseRow = increaseRow + 1
endif
if(Players_Overcast_Count > 0) then
set increaseRow = increaseRow + 1
endif
set MultiB = CreateMultiboard()
call MultiboardSetRowCount(MultiB, total + increaseRow)
call MultiboardSetColumnCount(MultiB, MULTIBOARD_TOTAL_ROW)
call MultiboardSetTitleText(MultiB, MULTIBOARD_TITLE + MULTIBOARD_TITLE_MOVE_BOAT)
call MultiboardDisplay(MultiB, true)
set mbItem = MultiboardGetItem(MultiB, 0, MULTIBOARD_PLAYER_NAME)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_NAME_DESC)
call MultiboardSetItemIcon(mbItem, MULTIBOARD_PLAYER_NAME_ICON)
call MultiboardSetItemWidth(mbItem, MULTIBOARD_PLAYER_NAME_LENGTH)
set mbItem = MultiboardGetItem(MultiB, 0, MULTIBOARD_PLAYER_LEVEL)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_LEVEL_DESC)
call MultiboardSetItemStyle(mbItem, true, false)
call MultiboardSetItemWidth(mbItem, MULTIBOARD_PLAYER_LEVEL_LENGTH)
set mbItem = MultiboardGetItem(MultiB, 0, MULTIBOARD_PLAYER_REVIVE)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_REVIVE_DESC)
call MultiboardSetItemStyle(mbItem, true, false)
call MultiboardSetItemWidth(mbItem, MULTIBOARD_PLAYER_REVIVE_LENGTH)
set mbItem = MultiboardGetItem(MultiB, 0, MULTIBOARD_PLAYER_KILL)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_KILL_DESC)
call MultiboardSetItemStyle(mbItem, true, false)
call MultiboardSetItemWidth(mbItem, MULTIBOARD_PLAYER_KILL_LENGTH)
set mbItem = MultiboardGetItem(MultiB, 0, MULTIBOARD_PLAYER_DEATH)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_DEATH_DESC)
call MultiboardSetItemStyle(mbItem, true, false)
call MultiboardSetItemWidth(mbItem, MULTIBOARD_PLAYER_DEATH_LENGTH)
set mbItem = MultiboardGetItem(MultiB, 0, MULTIBOARD_PLAYER_ASSIST)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_ASSIST_DESC)
call MultiboardSetItemStyle(mbItem, true, false)
call MultiboardSetItemWidth(mbItem, MULTIBOARD_PLAYER_ASSIST_LENGTH)
set mbItem = MultiboardGetItem(MultiB, 0, MULTIBOARD_PLAYER_GOLD)
call MultiboardSetItemValue(mbItem, MULTIBOARD_PLAYER_GOLD_DESC)
call MultiboardSetItemStyle(mbItem, true, false)
call MultiboardSetItemWidth(mbItem, MULTIBOARD_PLAYER_GOLD_LENGTH)
set Total = 0
if(Players_Luminous_Count > 0) then
call Set_Force_Multiboard(Player(13), 13, Total + 1)
call ForForce(Players_Luminous, function Players_Multiboard)
endif
if(Players_Overcast_Count > 0) then
call Set_Force_Multiboard(Player(14), 14, Total + 1)
call ForForce(Players_Overcast, function Players_Multiboard)
endif
call MultiboardMinimize(MultiB, false)
set mbItem = null
set p = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set Phase1Time1Trg = CreateTrigger()
call TriggerAddAction(Phase1Time1Trg, function Actions)
//setting globals
set Total = 0
endfunction
endscope
//TESH.scrollpos=251
//TESH.alwaysfold=0
globals
trigger Phase1Time2Trg
endglobals
scope Phase1Time2 initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer ABILITY_ID = 'A08D' //Ability Rune Function rawcode
private constant integer ABILITY1_ID = 'ACtc' //Ability Rune (Pick) rawcode
private constant integer ABILITY2_ID = 'Awrh' //Ability Rune (Random) rawcode
private constant integer ABILITY3_ID = 'A08B' //Ability Tips and Setting rawcode
private constant integer ABILITY4_ID = 'Amgl' //Ability Hero Item Suggestion (Luminous) rawcode
private constant integer ABILITY5_ID = 'Amgr' //Ability Hero Item Suggestion (Overcast) rawcode
private constant integer RANDOM_COST = 300 //Cost of getting a random hero
private constant string RANDOM = " has randomed " //Random message
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Items\\ClarityPotion\\ClarityTarget.mdl" //Special effect to boat
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Create_Rune takes nothing returns nothing
local unit rune = null
local integer i = 0
local real angle = 0.0
local real x = 0.0
local real y = 0.0
local player p = null
set i = 0
loop
exitwhen(i >= 8)
set angle = (-45 + (45 * (i + 1))) * bj_DEGTORAD
set x = GetRectCenterX(gg_rct_Hero_Rune) + 100 * Cos(angle)
set y = GetRectCenterY(gg_rct_Hero_Rune) + 100 * Sin(angle)
set p = Player(i)
set rune = CreateUnit(p, Player_Rune[i], x, y, bj_UNIT_FACING)
call UnitAddAbility(rune, 'Arav')
call UnitRemoveAbility(rune, 'Arav')
call SetUnitPathing(rune, false)
call SetUnitX(rune, x)
call SetUnitY(rune, y)
set Rune[i] = rune
if(not IsPlayerInForce(p, Players)) then
call SetUnitVertexColor(rune, 255, 255, 255, 100)
endif
set i = i + 1
endloop
set rune = null
set p = null
endfunction
//----------------------------------------------------------------
private function Pick_Actions takes nothing returns nothing
local player enumPlayer = GetEnumPlayer()
local integer playerNum = GetPlayerId(enumPlayer)
local unit rune = Rune[playerNum]
local unit boat = null
call SetPlayerTechMaxAllowed(enumPlayer, 'HERO', 1)
call ForceAddPlayer(TipsForce, enumPlayer)
call UnitAddAbility(rune, ABILITY_ID)
if(GameMode == MODE_NORMAL) then
call SetUnitAbilityLevel(rune, ABILITY_ID, 1)
elseif(GameMode == MODE_ALLPICK) then
call SetUnitAbilityLevel(rune, ABILITY_ID, 2)
elseif(GameMode == MODE_TEST) then
call SetUnitAbilityLevel(rune, ABILITY_ID, 3)
endif
call UnitAddAbility(rune, ABILITY1_ID)
call UnitAddAbility(rune, ABILITY2_ID)
if(IsPlayerInForce(enumPlayer, Players_Luminous)) then
set boat = CreateUnit(enumPlayer, LUMINOUS_BOAT_ID, GetRectCenterX(Boat_Location[playerNum]), GetRectCenterY(Boat_Location[playerNum]), Boat_Angle[playerNum])
call AddSpecialEffectTarget(SPECIAL_EFFECT, boat, "origin")
call UnitAddAbility(boat, ABILITY3_ID)
call GroupAddUnit(Boats, boat)
elseif(IsPlayerInForce(enumPlayer, Players_Overcast)) then
set boat = CreateUnit(enumPlayer, OVERCAST_BOAT_ID, GetRectCenterX(Boat_Location[playerNum]), GetRectCenterY(Boat_Location[playerNum]), Boat_Angle[playerNum])
call AddSpecialEffectTarget(SPECIAL_EFFECT, boat, "origin")
call UnitAddAbility(boat, ABILITY3_ID)
call GroupAddUnit(Boats, boat)
endif
call IssueImmediateOrder(boat, "holdposition")
set Boat[playerNum] = boat
if(rune != null) then
if(GetLocalPlayer() == enumPlayer) then
call ClearSelection()
call SelectUnit(rune, true)
endif
endif
set enumPlayer = null
set rune = null
set boat = null
endfunction
//----------------------------------------------------------------
private function Random_Actions takes player enumPlayer returns nothing
local integer playerNum = GetPlayerId(enumPlayer)
local integer position = LoadInteger(Info_Ht, playerNum, MULTIBOARD_ROW_KEY)
local multiboarditem mbItem = MultiboardGetItem(MultiB, position, MULTIBOARD_PLAYER_NAME)
local unit hero = null
local integer heroID = 0
local unit boat = null
local integer i = 0
local player p = null
local real x = 0.0
local real y = 0.0
call SetPlayerState(enumPlayer, PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(enumPlayer, PLAYER_STATE_RESOURCE_GOLD) - RANDOM_COST)
call SetPlayerTechMaxAllowed(enumPlayer, 'HERO', 1)
call SetPlayerTechResearched(enumPlayer, 'HERO', 1)
call ForceAddPlayer(TipsForce, enumPlayer)
set x = GetRectCenterX(gg_rct_Hero_Rune)
set y = GetRectCenterY(gg_rct_Hero_Rune)
set hero = CreateUnit(enumPlayer, All_Heroes[Hero_Selected_Player[playerNum]], x, y, bj_UNIT_FACING)
set heroID = GetUnitTypeId(hero)
call AppendPlayerNameHero(enumPlayer, hero)
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, Player_Name[playerNum] + RANDOM + Player_Colors[playerNum] + GetUnitName(hero) + ".|r")
endif
endif
set i = i + 1
endloop
//call ShowUnit(hero, false)
call GroupAddUnit(Unit_Outside_Temple, hero)
call GroupAddUnit(Heroes, hero)
call MultiboardSetItemIcon(mbItem, GetHeroIcon(heroID))
call HeroesSetup(hero)
call UnitAddItemById(hero, 'pman')
call UnitAddItemById(hero, 'phea')
call UnitAddItemById(hero, 'pman')
call UnitAddItemById(hero, 'phea')
call UnitAddItemById(hero, 'pman')
call UnitAddItemById(hero, 'phea')
call UnitAddItemById(hero, 'uflg')
call UnitAddItemById(hero, 'wswd')
if(IsPlayerInForce(enumPlayer, Players_Luminous)) then
set boat = CreateUnit(enumPlayer, LUMINOUS_BOAT_ID, GetRectCenterX(Boat_Location[playerNum]), GetRectCenterY(Boat_Location[playerNum]), Boat_Angle[playerNum])
call AddSpecialEffectTarget(SPECIAL_EFFECT, boat, "origin")
call UnitAddAbility(boat, ABILITY3_ID)
call GroupAddUnit(Boats, boat)
elseif(IsPlayerInForce(enumPlayer, Players_Overcast)) then
set boat = CreateUnit(enumPlayer, OVERCAST_BOAT_ID, GetRectCenterX(Boat_Location[playerNum]), GetRectCenterY(Boat_Location[playerNum]), Boat_Angle[playerNum])
call AddSpecialEffectTarget(SPECIAL_EFFECT, boat, "origin")
call UnitAddAbility(boat, ABILITY3_ID)
call GroupAddUnit(Boats, boat)
endif
call IssueImmediateOrder(boat, "holdposition")
set Boat[playerNum] = boat
if(boat != null) then
if(IsHeroLuminous(hero)) then
call UnitAddAbility(boat, ABILITY4_ID)
call SetUnitAbilityLevel(boat, ABILITY4_ID, GetHeroIndex_Luminous(hero)+1)
elseif(IsHeroOvercast(hero)) then
call UnitAddAbility(boat, ABILITY5_ID)
call SetUnitAbilityLevel(boat, ABILITY5_ID, GetHeroIndex_Overcast(hero)+1)
endif
set x = GetUnitX(boat)
set y = GetUnitY(boat)
call SetUnitX(hero, x)
call SetUnitY(hero, y)
call IssueTargetOrder(boat, "load", hero)
if(GetLocalPlayer() == enumPlayer) then
call ClearSelection()
call SelectUnit(boat, true)
call PanCameraToTimed(x, y, 0.0)
endif
endif
set enumPlayer = null
set mbItem = null
set hero = null
set boat = null
set p = null
endfunction
//----------------------------------------------------------------
private function Same_Actions takes nothing returns nothing
local player enumPlayer = GetEnumPlayer()
local integer playerNum = GetPlayerId(enumPlayer)
local unit rune = Rune[playerNum]
local unit boat = null
call ForceAddPlayer(TipsForce, enumPlayer)
call UnitAddAbility(rune, ABILITY_ID)
if(GameMode == MODE_NORMAL) then
call SetUnitAbilityLevel(rune, ABILITY_ID, 1)
elseif(GameMode == MODE_ALLPICK) then
call SetUnitAbilityLevel(rune, ABILITY_ID, 2)
elseif(GameMode == MODE_ALLSAME) then
call SetUnitAbilityLevel(rune, ABILITY_ID, 4)
elseif(GameMode == MODE_TEST) then
call SetUnitAbilityLevel(rune, ABILITY_ID, 3)
endif
call SetPlayerTechMaxAllowed(enumPlayer, 'HERO', 1)
if(playerNum == 0) then
call SetPlayerTechResearched(enumPlayer, 'HERO', 0)
call UnitAddAbility(rune, ABILITY1_ID)
else
call SetPlayerTechResearched(enumPlayer, 'HERO', 1)
call PauseUnit(rune, true)
endif
if(IsPlayerInForce(enumPlayer, Players_Luminous)) then
set boat = CreateUnit(enumPlayer, LUMINOUS_BOAT_ID, GetRectCenterX(Boat_Location[playerNum]), GetRectCenterY(Boat_Location[playerNum]), Boat_Angle[playerNum])
call AddSpecialEffectTarget(SPECIAL_EFFECT, boat, "origin")
call UnitAddAbility(boat, ABILITY3_ID)
call GroupAddUnit(Boats, boat)
elseif(IsPlayerInForce(enumPlayer, Players_Overcast)) then
set boat = CreateUnit(enumPlayer, OVERCAST_BOAT_ID, GetRectCenterX(Boat_Location[playerNum]), GetRectCenterY(Boat_Location[playerNum]), Boat_Angle[playerNum])
call AddSpecialEffectTarget(SPECIAL_EFFECT, boat, "origin")
call UnitAddAbility(boat, ABILITY3_ID)
call GroupAddUnit(Boats, boat)
endif
call IssueImmediateOrder(boat, "holdposition")
set Boat[playerNum] = boat
if(rune != null) then
if(GetLocalPlayer() == enumPlayer) then
call ClearSelection()
call SelectUnit(rune, true)
endif
endif
set enumPlayer = null
set rune = null
set boat = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local integer i = 0
local player p = null
call Create_Rune()
if(GameMode == MODE_NORMAL or /*
*/GameMode == MODE_ALLPICK or /*
*/GameMode == MODE_TEST) then
call ForForce(Players, function Pick_Actions)
elseif(GameMode == MODE_ALLRANDOM) then
//call ForForce(Players, function Random_Actions)
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
call Random_Actions(p)
call TriggerSleepAction(1.0)
endif
set i = i + 1
endloop
elseif(GameMode == MODE_ALLSAME) then
call ForForce(Players, function Same_Actions)
endif
set p = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set Phase1Time2Trg = CreateTrigger()
call TriggerAddAction(Phase1Time2Trg, function Actions)
endfunction
endscope
//TESH.scrollpos=10
//TESH.alwaysfold=0
globals
trigger Phase1Time3Trg
endglobals
scope Phase1Time3 initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local multiboarditem mbItem = null
local integer i = 0
local player p = null
local integer index = 0
local string gold = ""
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
set gold = MULTIBOARD_PLAYER_GOLD_COLOR_CODE + I2S(GetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD)) + "|r"
if(not IsPlayerAlly(GetLocalPlayer(), p)) then
set gold = ""
endif
set index = LoadInteger(Info_Ht, GetPlayerId(p), MULTIBOARD_ROW_KEY)
if(index != 0) then
set mbItem = MultiboardGetItem(MultiB, index, MULTIBOARD_PLAYER_GOLD)
call MultiboardSetItemValue(mbItem, gold)
endif
endif
set i = i + 1
endloop
call EnableTrigger(UpdateMultiBoardTrg)
set mbItem = null
set p = null
set gold = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set Phase1Time3Trg = CreateTrigger()
call TriggerAddAction(Phase1Time3Trg, function Actions)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
globals
trigger Phase1Time4Trg
endglobals
scope Phase1Time4 initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
if(GameMode == MODE_NORMAL) then
if(IsPlayerInForce(GetLocalPlayer(), Players_Luminous)) then
call DestroyEffect(AddSpecialEffect(STRENGTH_EFFECT, GetUnitX(Obelisk_Luminous[0]), GetUnitY(Obelisk_Luminous[0])))
call DestroyEffect(AddSpecialEffect(AGILITY_EFFECT, GetUnitX(Obelisk_Luminous[1]), GetUnitY(Obelisk_Luminous[1])))
call DestroyEffect(AddSpecialEffect(INTELLIGENCE_EFFECT, GetUnitX(Obelisk_Luminous[2]), GetUnitY(Obelisk_Luminous[2])))
elseif(IsPlayerInForce(GetLocalPlayer(), Players_Overcast)) then
call DestroyEffect(AddSpecialEffect(STRENGTH_EFFECT, GetUnitX(Obelisk_Overcast[0]), GetUnitY(Obelisk_Overcast[0])))
call DestroyEffect(AddSpecialEffect(AGILITY_EFFECT, GetUnitX(Obelisk_Overcast[1]), GetUnitY(Obelisk_Overcast[1])))
call DestroyEffect(AddSpecialEffect(INTELLIGENCE_EFFECT, GetUnitX(Obelisk_Overcast[2]), GetUnitY(Obelisk_Overcast[2])))
endif
elseif(GameMode == MODE_ALLPICK or /*
*/GameMode == MODE_ALLSAME or /*
*/GameMode == MODE_TEST) then
call DestroyEffect(AddSpecialEffect(STRENGTH_EFFECT, GetUnitX(Obelisk_Luminous[0]), GetUnitY(Obelisk_Luminous[0])))
call DestroyEffect(AddSpecialEffect(STRENGTH_EFFECT, GetUnitX(Obelisk_Overcast[0]), GetUnitY(Obelisk_Overcast[0])))
call DestroyEffect(AddSpecialEffect(AGILITY_EFFECT, GetUnitX(Obelisk_Luminous[1]), GetUnitY(Obelisk_Luminous[1])))
call DestroyEffect(AddSpecialEffect(AGILITY_EFFECT, GetUnitX(Obelisk_Overcast[1]), GetUnitY(Obelisk_Overcast[1])))
call DestroyEffect(AddSpecialEffect(INTELLIGENCE_EFFECT, GetUnitX(Obelisk_Luminous[2]), GetUnitY(Obelisk_Luminous[2])))
call DestroyEffect(AddSpecialEffect(INTELLIGENCE_EFFECT, GetUnitX(Obelisk_Overcast[2]), GetUnitY(Obelisk_Overcast[2])))
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set Phase1Time4Trg = CreateTrigger()
call TriggerAddAction(Phase1Time4Trg, function Actions)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
globals
trigger Phase1Time5Trg
endglobals
scope Phase1Time5 initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant string REMINDER = "|cff00ff00One more minute|r.\n|cffffff00Boat|r |cff00ffffheals|r when it loads.\n"
private constant string MULTIBOARD_REMINDER = " [|cffffffe1Get Ready!|r]"
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local integer i = 0
local player p = null
local sound s = gg_snd_Hint
set GamePhase = GAME_PHASE_READY
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, REMINDER)
endif
set i = i + 1
endloop
call MultiboardSetTitleText(MultiB, MULTIBOARD_TITLE + MULTIBOARD_REMINDER)
set p = null
set s = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set Phase1Time5Trg = CreateTrigger()
call TriggerAddAction(Phase1Time5Trg, function Actions)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
globals
trigger Phase1Time6Trg
endglobals
scope Phase1Time6 initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant string CONTACT = "This game is brought to you by |cffffff00Heaven Editor.|r\n" + /*
*/"|cff00ff00Good Luck Have Fun!|r\n"
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local integer i = 0
local player p = null
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, CONTACT)
endif
set i = i + 1
endloop
set p = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set Phase1Time6Trg = CreateTrigger()
call TriggerAddAction(Phase1Time6Trg, function Actions)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
globals
trigger Phase1Time7Trg
endglobals
scope Phase1Time7 initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SOUND_VOLUME = 200 //Start game sound volume
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local sound s = gg_snd_Start_Game
call SetSoundVolume(s, SOUND_VOLUME)
call StartSound(s)
set s = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set Phase1Time7Trg = CreateTrigger()
call TriggerAddAction(Phase1Time7Trg, function Actions)
endfunction
endscope
//TESH.scrollpos=45
//TESH.alwaysfold=0
globals
trigger Phase1Time8Trg
endglobals
scope Phase1Time8 initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant string START_TIPS = "\n|cff00ff00The game has started!|r\n" //Start game message
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Items\\TomeOfRetraining\\TomeOfRetrainingCaster.mdl" //Start game hero effect
private constant integer POWER_PILLAR1_ID = 'nmrd' //Power Pillar recreation
private constant integer POWER_PILLAR2_ID = 'nmrb' //Power Pillar recreation
private constant integer POWER_PILLAR3_ID = 'nmra' //Power Pillar recreation
private constant integer POWER_PILLAR4_ID = 'nmr0' //Power Pillar recreation
private constant integer POWER_PILLAR5_ID = 'nmr9' //Power Pillar recreation
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private group copy
endglobals
//----------------------------------------------------------------
private function Players_Actions takes nothing returns nothing
local player enumPlayer = GetEnumPlayer()
if(IsPlayerInForce(enumPlayer, CommentaryForce)) then
call DisplayTextToPlayer(enumPlayer, 0, 0, START_TIPS)
endif
//call ForceAddPlayer(tipsForce, enumPlayer)
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit f = null
local real fX = 0.0
local real fY = 0.0
local unit boat = null
local unit hero = null
local player p = null
local integer i = 0
local real x = 0.0
local real y = 0.0
call UpgradeGame()
call Initialize_Spawn_Skeleton()
call OnAllSpawn_Skeleton()
call Operate_Allied_Gate("open", 13)
call Operate_Allied_Gate("open", 14)
call StartSound(gg_snd_Switch)
call SetSpawnTime(0.0)
call EnableTrigger(FreeGoldTrg)
call ForForce(Players, function Players_Actions)
call EnableTrigger(RuneTrg)
call EnableTrigger(LuminousForceBaseTrg)
call EnableTrigger(OvercastForceBaseTrg)
call TriggerRegisterTimerEventPeriodic(RuneTrg, 60.0)
set GameTime = 0
set GamePhase = GAME_PHASE_START
set PauseWeather = false
set PausePhenomenon = false
//call SetFloatGameState(GAME_STATE_TIME_OF_DAY, 6.0)
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
set boat = null
set hero = null
set copy = CopyGroup(Boats)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(p == GetOwningPlayer(f) and boat == null) then
set boat = f
endif
endloop
if(boat != null) then
if(not IsUnitLoaded(hero)) then
set x = GetUnitX(boat)
set y = GetUnitY(boat)
set hero = GetHero(p)
//call ShowUnit(hero, true)
//call SetUnitPosition(hero, x, y)
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, hero, "origin"))
else
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, boat, "origin"))
endif
endif
set i = i + 1
endloop
set i = 0
loop
exitwhen(i >= 4)
call SetUnitInvulnerable(Power_Tower[i], false)
set i = i + 1
endloop
call PauseUnit(gg_unit_Ogld_0031, false)
call TriggerSleepAction(10.0)
/*set copy = CopyGroup(Heroes)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set fX = GetUnitX(f)
set fY = GetUnitY(f)
call PointCast(GetOwningPlayer(f), fX, fY, 0.5, 'AChw', 2, "healingward", 0, fX, fY)
endloop*/
set boat = null
set hero = null
set p = null
set f = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set Phase1Time8Trg = CreateTrigger()
call TriggerAddAction(Phase1Time8Trg, function Actions)
//Setting globals
set copy = CreateGroup()
endfunction
endscope
//TESH.scrollpos=5
//TESH.alwaysfold=0
globals
trigger Phase1Time9Trg
endglobals
scope Phase1Time9 initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Other\\Andt\\Andt.mdl" //Start game hero effect
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private group copy
private effect array e[4]
endglobals
//----------------------------------------------------------------
private function Players_Actions takes nothing returns nothing
local player enumPlayer = GetEnumPlayer()
local integer i = 0
if(IsPlayerInForce(enumPlayer, TipsForce)) then
call Tips_Objective(enumPlayer)
endif
set i = 0
loop
exitwhen(i >= 4)
if(not IsUnitDead(Guardian[i]) and Guardian[i] != null) then
call UnitShareVision(Guardian[i], enumPlayer, true)
endif
set i = i + 1
endloop
set enumPlayer = null
endfunction
//----------------------------------------------------------------
private function Players_Actions2 takes nothing returns nothing
local player enumPlayer = GetEnumPlayer()
local integer i = 0
set i = 0
loop
exitwhen(i >= 4)
if(Guardian[i] != null) then
if(not IsUnitDead(Guardian[i])) then
call UnitShareVision(Guardian[i], enumPlayer, false)
call SetUnitInvulnerable(Guardian[i], false)
endif
endif
set i = i + 1
endloop
set enumPlayer = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local integer i = 0
call ForForce(Players, function Players_Actions)
set i = 0
loop
exitwhen(i >= 4)
if(not IsUnitDead(Guardian[i]) and Guardian[i] != null) then
set e[i] = AddSpecialEffect(SPECIAL_EFFECT, GetUnitX(Guardian[i]), GetUnitY(Guardian[i]))
endif
set i = i + 1
endloop
call TriggerSleepAction(10.0)
call ForForce(Players, function Players_Actions2)
set i = 0
loop
exitwhen(i >= 4)
if(e[i] != null) then
call DestroyEffect(e[i])
set e[i] = null
endif
set i = i + 1
endloop
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set Phase1Time9Trg = CreateTrigger()
call TriggerAddAction(Phase1Time9Trg, function Actions)
//Setting globals
set copy = CreateGroup()
endfunction
endscope
//TESH.scrollpos=19
//TESH.alwaysfold=0
globals
trigger NormalPickTrg
endglobals
scope NormalPick initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant string NORMAL_MESSAGE = "|cff00ffffNormal|r mode enabled. You may only pick from your Obelisk. The game will start in 120 seconds.\n" //Mode message
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local integer i = 0
local player p = null
call DisableTrigger(NormalPickTrg)
call StartSound(gg_snd_Quest_New)
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_SECRET, NORMAL_MESSAGE)
endif
endif
set i = i + 1
endloop
set GameMode = MODE_NORMAL
set GameTime = 60
call TriggerRegisterTimerEventSingle(Phase1Time0Trg, 1.0)
call TriggerRegisterTimerEventSingle(Phase1Time1Trg, 2.0)
call TriggerRegisterTimerEventSingle(Phase1Time2Trg, 3.0)
call TriggerRegisterTimerEventSingle(Phase1Time3Trg, 4.0)
call TriggerRegisterTimerEventSingle(Phase1Time4Trg, 5.0)
call TriggerRegisterTimerEventSingle(Phase1Time5Trg, 60.0)
call TriggerRegisterTimerEventSingle(Phase1Time6Trg, 90.0)
call TriggerRegisterTimerEventSingle(Phase1Time7Trg, 115.0)
call TriggerRegisterTimerEventSingle(Phase1Time8Trg, 120.0)
call TriggerRegisterTimerEventSingle(Phase1Time9Trg, 150.0)
call DisableTrigger(AllPickTrg)
call DisableTrigger(AllRandomTrg)
call DisableTrigger(AllSameTrg)
call DisableTrigger(TestTrg)
set p = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set NormalPickTrg = CreateTrigger()
call TriggerAddAction(NormalPickTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=30
//TESH.alwaysfold=0
globals
trigger AllPickTrg
endglobals
scope AllPick initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant string ALLPICK_MESSAGE = "|cff00ffffAll Pick|r mode enabled. You may pick from any Obelisk. The game will start in 120 seconds.\n" //Mode message
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local integer i = 0
local player p = null
call DisableTrigger(NormalPickTrg)
call StartSound(gg_snd_Quest_New)
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_SECRET, ALLPICK_MESSAGE)
endif
endif
set i = i + 1
endloop
set GameMode = MODE_ALLPICK
set GameTime = 120
call TriggerRegisterTimerEventSingle(Phase1Time0Trg, 1.0)
call TriggerRegisterTimerEventSingle(Phase1Time1Trg, 2.0)
call TriggerRegisterTimerEventSingle(Phase1Time2Trg, 3.0)
call TriggerRegisterTimerEventSingle(Phase1Time3Trg, 4.0)
call TriggerRegisterTimerEventSingle(Phase1Time4Trg, 5.0)
call TriggerRegisterTimerEventSingle(Phase1Time5Trg, 60.0)
call TriggerRegisterTimerEventSingle(Phase1Time6Trg, 90.0)
call TriggerRegisterTimerEventSingle(Phase1Time7Trg, 115.0)
call TriggerRegisterTimerEventSingle(Phase1Time8Trg, 120.0)
call TriggerRegisterTimerEventSingle(Phase1Time9Trg, 150.0)
call DisableTrigger(NormalPickTrg)
call DisableTrigger(AllRandomTrg)
call DisableTrigger(AllSameTrg)
call DisableTrigger(TestTrg)
set p = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GameMode < 0
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set AllPickTrg = CreateTrigger()
call TriggerRegisterPlayerChatEvent(AllPickTrg, Player(0), "-ap", true)
call TriggerAddCondition(AllPickTrg, Condition(function Conditions))
call TriggerAddAction(AllPickTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=6
//TESH.alwaysfold=0
globals
trigger AllRandomTrg
endglobals
scope AllRandom initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant string ALLRANDOM_MESSAGE = "|cff00ffffAll Random|r mode. You may receive a random Hero soon. The game will start in 120 seconds.\n" //Mode message
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local integer i = 0
local player p = null
call DisableTrigger(NormalPickTrg)
call StartSound(gg_snd_Quest_New)
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_SECRET, ALLRANDOM_MESSAGE)
endif
endif
set i = i + 1
endloop
set GameMode = MODE_ALLRANDOM
set GameTime = 120
call TriggerRegisterTimerEventSingle(Phase1Time0Trg, 1.0)
call TriggerRegisterTimerEventSingle(Phase1Time1Trg, 2.0)
call TriggerRegisterTimerEventSingle(Phase1Time2Trg, 3.0)
call TriggerRegisterTimerEventSingle(Phase1Time3Trg, 4.0)
call TriggerRegisterTimerEventSingle(Phase1Time4Trg, 5.0)
call TriggerRegisterTimerEventSingle(Phase1Time5Trg, 60.0)
call TriggerRegisterTimerEventSingle(Phase1Time6Trg, 90.0)
call TriggerRegisterTimerEventSingle(Phase1Time7Trg, 115.0)
call TriggerRegisterTimerEventSingle(Phase1Time8Trg, 120.0)
call TriggerRegisterTimerEventSingle(Phase1Time9Trg, 150.0)
call DisableTrigger(AllPickTrg)
call DisableTrigger(NormalPickTrg)
call DisableTrigger(AllSameTrg)
call DisableTrigger(TestTrg)
set p = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GameMode < 0
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set AllRandomTrg = CreateTrigger()
call TriggerRegisterPlayerChatEvent(AllRandomTrg, Player(0), "-ar", true)
call TriggerAddCondition(AllRandomTrg, Condition(function Conditions))
call TriggerAddAction(AllRandomTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=30
//TESH.alwaysfold=0
globals
trigger AllSameTrg
endglobals
scope AllSame initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant string ALLSAME_MESSAGE = "|cff00ffffAll Same|r mode enabled. All heroes are similar. The game will start in 60 seconds.\n" //Mode message
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local integer i = 0
local player p = null
call DisableTrigger(NormalPickTrg)
call StartSound(gg_snd_Quest_New)
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_SECRET, ALLSAME_MESSAGE)
endif
endif
set i = i + 1
endloop
set GameMode = MODE_ALLSAME
set GameTime = 60
call TriggerRegisterTimerEventSingle(Phase1Time0Trg, 1.0)
call TriggerRegisterTimerEventSingle(Phase1Time1Trg, 2.0)
call TriggerRegisterTimerEventSingle(Phase1Time2Trg, 3.0)
call TriggerRegisterTimerEventSingle(Phase1Time3Trg, 4.0)
call TriggerRegisterTimerEventSingle(Phase1Time4Trg, 5.0)
call TriggerRegisterTimerEventSingle(Phase1Time5Trg, 15.0)
call TriggerRegisterTimerEventSingle(Phase1Time6Trg, 30.0)
call TriggerRegisterTimerEventSingle(Phase1Time7Trg, 55.0)
call TriggerRegisterTimerEventSingle(Phase1Time8Trg, 60.0)
call TriggerRegisterTimerEventSingle(Phase1Time9Trg, 90.0)
//call EnableTrigger(TestingTrg1)
//call EnableTrigger(TestingTrg2)
//call EnableTrigger(TestingTrg3)
//call EnableTrigger(TestingTrg4)
call DisableTrigger(AllPickTrg)
call DisableTrigger(AllRandomTrg)
call DisableTrigger(NormalPickTrg)
call DisableTrigger(TestTrg)
set p = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GameMode < 0
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set AllSameTrg = CreateTrigger()
call TriggerRegisterPlayerChatEvent(AllSameTrg, Player(0), "-as", true)
call TriggerAddCondition(AllSameTrg, Condition(function Conditions))
call TriggerAddAction(AllSameTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=24
//TESH.alwaysfold=0
globals
trigger TestTrg
trigger TestingTrg1
trigger TestingTrg2
trigger TestingTrg3
trigger TestingTrg4
endglobals
scope Test initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant string TEST_MESSAGE = "|cff00ffffTest|r mode. Press escape (ESC) button to increase level. Press '-' key to refresh hero's state. The game will start in 10 seconds.\n"
private constant attacktype A_TYPE = ATTACK_TYPE_MAGIC //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_DIVINE //Spell attack type
private constant integer ABILITY_IMMORTAL_ID = 'A07U' //Ability Immortal rawcode
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
endglobals
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local integer i = 0
local player p = null
call DisableTrigger(NormalPickTrg)
call StartSound(gg_snd_Quest_New)
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTimedTextToPlayer(p, 0, 0, bj_TEXT_DELAY_SECRET, TEST_MESSAGE)
endif
call SetPlayerTechResearched(p, 'Rhfc', 1)
endif
set i = i + 1
endloop
set GameMode = MODE_TEST
set GameTime = 20
call TriggerRegisterTimerEventSingle(Phase1Time0Trg, 1.0)
call TriggerRegisterTimerEventSingle(Phase1Time1Trg, 2.0)
call TriggerRegisterTimerEventSingle(Phase1Time2Trg, 3.0)
call TriggerRegisterTimerEventSingle(Phase1Time3Trg, 4.0)
call TriggerRegisterTimerEventSingle(Phase1Time4Trg, 5.0)
call TriggerRegisterTimerEventSingle(Phase1Time5Trg, 10.0)
call TriggerRegisterTimerEventSingle(Phase1Time6Trg, 12.0)
call TriggerRegisterTimerEventSingle(Phase1Time7Trg, 15.0)
call TriggerRegisterTimerEventSingle(Phase1Time8Trg, 20.0)
call TriggerRegisterTimerEventSingle(Phase1Time9Trg, 50.0)
call EnableTrigger(TestingTrg1)
call EnableTrigger(TestingTrg2)
call EnableTrigger(TestingTrg3)
call EnableTrigger(TestingTrg4)
call DisableTrigger(AllPickTrg)
call DisableTrigger(AllRandomTrg)
call DisableTrigger(AllSameTrg)
call DisableTrigger(NormalPickTrg)
set p = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GameMode < 0
endfunction
//----------------------------------------------------------------
private function Refresh takes nothing returns nothing
local unit enumU = GetEnumUnit()
local player owner = GetOwningPlayer(enumU)
//if(GameLevel < 15) then
//set GameLevel = GameLevel + 1
//call UpgradeGame()
//endif
if(GetUnitState(enumU, UNIT_STATE_LIFE) > 0) then
call SetHeroLevel(enumU, GetHeroLevel(enumU)+1, false)
call SetPlayerState(owner, PLAYER_STATE_RESOURCE_FOOD_USED, GameLevel)
endif
set enumU = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Test_Actions takes nothing returns nothing
call ForGroup(Heroes, function Refresh)
endfunction
//----------------------------------------------------------------
private function Refresh2 takes nothing returns nothing
local unit enumU = GetEnumUnit()
if(GetUnitState(enumU, UNIT_STATE_LIFE) > 0) then
call SetUnitState(enumU, UNIT_STATE_LIFE, GetUnitState(enumU, UNIT_STATE_MAX_LIFE))
call SetUnitState(enumU, UNIT_STATE_MANA, GetUnitState(enumU, UNIT_STATE_MAX_MANA))
call UnitResetCooldown(enumU)
if(GetUnitAbilityLevel(enumU, ABILITY_IMMORTAL_ID) > 0) then
call GroupAddUnit(ImmortalRefresh, enumU)
endif
endif
set enumU = null
endfunction
//----------------------------------------------------------------
private function Test_Actions2 takes nothing returns nothing
call ForGroup(Heroes, function Refresh2)
endfunction
//----------------------------------------------------------------
private function Refresh3 takes nothing returns nothing
local unit enumU = GetEnumUnit()
if(GetUnitState(enumU, UNIT_STATE_LIFE) > 0) then
call UnitDamageTarget(enumU, enumU, 1000000.0, true, false, A_TYPE, D_TYPE, null)
endif
set enumU = null
endfunction
//----------------------------------------------------------------
private function Test_Actions3 takes nothing returns nothing
call ForGroup(Heroes, function Refresh3)
endfunction
//----------------------------------------------------------------
private function Refresh4 takes nothing returns nothing
local unit enumU = GetEnumUnit()
if(GetUnitState(enumU, UNIT_STATE_LIFE) > 0) then
call SetUnitState(enumU, UNIT_STATE_LIFE, GetUnitState(enumU, UNIT_STATE_MAX_LIFE) * 0.1)
endif
set enumU = null
endfunction
//----------------------------------------------------------------
private function Test_Actions4 takes nothing returns nothing
call ForGroup(Heroes, function Refresh4)
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local integer i
set TestTrg = CreateTrigger()
set TestingTrg1 = CreateTrigger()
set TestingTrg2 = CreateTrigger()
set TestingTrg3 = CreateTrigger()
set TestingTrg4 = CreateTrigger()
call TriggerRegisterPlayerChatEvent(TestTrg, Player(0), "-test", true)
call TriggerAddCondition(TestTrg, Condition(function Conditions))
call TriggerAddAction(TestTrg, function Actions)
set i = 0
loop
exitwhen(i >= 8)
call TriggerRegisterPlayerEventEndCinematic(TestingTrg1, Player(i))
call TriggerRegisterPlayerChatEvent(TestingTrg2, Player(i), "-", true)
//call TriggerRegisterPlayerKeyEventBJ(TestingTrg2, Player(i), bj_KEYEVENTTYPE_DEPRESS, bj_KEYEVENTKEY_RIGHT)
call TriggerRegisterPlayerChatEvent(TestingTrg3, Player(i), ".", true)
call TriggerRegisterPlayerChatEvent(TestingTrg4, Player(i), ",", true)
set i = i + 1
endloop
call TriggerAddAction(TestingTrg1, function Test_Actions)
call DisableTrigger(TestingTrg1)
call TriggerAddAction(TestingTrg2, function Test_Actions2)
call DisableTrigger(TestingTrg2)
call TriggerAddAction(TestingTrg3, function Test_Actions3)
call DisableTrigger(TestingTrg3)
call TriggerAddAction(TestingTrg4, function Test_Actions4)
call DisableTrigger(TestingTrg4)
endfunction
endscope
//TESH.scrollpos=21
//TESH.alwaysfold=0
globals
trigger PickHeroTrg
endglobals
scope PickHero initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer ABILITY3_ID = 'Awrh' //Ability Rune (Random) rawcode
private constant integer ABILITY4_ID = 'ACtc' //Ability Rune (Pick) rawcode
private constant string CHOOSEN_TIPS = " has chosen " //Pick message
private constant string WAIT_TIPS = "|cff00ff00Wait start|r.\n"//Wait message
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Items\\TomeOfRetraining\\TomeOfRetrainingCaster.mdl" //Start game hero effect
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private group copy
endglobals
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit sold = GetSoldUnit()
local integer soldType = GetUnitTypeId(sold)
local player owner = GetOwningPlayer(sold)
local integer ownerNum = GetPlayerId(owner)
local integer position = LoadInteger(Info_Ht, ownerNum, MULTIBOARD_ROW_KEY)
local multiboarditem mbItem = MultiboardGetItem(MultiB, position, MULTIBOARD_PLAYER_NAME)
local integer i = 0
local player p = null
local unit f = null
local unit boat = null
local real x = 0
local real y = 0
local unit dummy = null
call PauseUnit(sold, true)
call TriggerSleepAction(0.1)
call UnitAddItemById(sold, 'pman')
call UnitAddItemById(sold, 'phea')
call UnitAddItemById(sold, 'pman')
call UnitAddItemById(sold, 'phea')
call UnitAddItemById(sold, 'pman')
call UnitAddItemById(sold, 'phea')
call UnitAddItemById(sold, 'uflg')
set i = 0
loop
exitwhen(i >= Total_Heroes)
if(soldType == All_Heroes[i]) then
set Hero_Selected_Player[ownerNum] = i
set i = Total_Heroes
endif
set i = i + 1
endloop
call SetPlayerTechResearched(owner, 'HERO', 1)
call UnitRemoveAbility(Rune[ownerNum], ABILITY3_ID)
call UnitRemoveAbility(Rune[ownerNum], ABILITY4_ID)
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
call SetPlayerTechMaxAllowed(p, soldType, 0)
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, Player_Name[ownerNum] + CHOOSEN_TIPS + Player_Colors[ownerNum] + GetUnitName(sold) + ".|r")
endif
set i = i + 1
endloop
call GroupAddUnit(Heroes, sold)
call GroupAddUnit(Unit_Outside_Temple, sold)
call MultiboardSetItemIcon(mbItem, GetHeroIcon(soldType))
call HeroesSetup(sold)
set copy = CopyGroup(Boats)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(owner == GetOwningPlayer(f) and boat == null) then
set boat = f
endif
endloop
call TriggerSleepAction(0.1)
if(boat != null) then
call AddItemRectify(boat, soldType)
endif
if(GamePhase == GAME_PHASE_READY or GamePhase == GAME_PHASE_INITIALIZE) then
if(sold != null) then
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0, 0, WAIT_TIPS)
endif
if(boat != null) then
set x = GetUnitX(boat)
set y = GetUnitY(boat)
call SetUnitPosition(sold, x, y)
call IssueTargetOrder(boat, "load", sold)
endif
endif
elseif(GamePhase == GAME_PHASE_START) then
if(sold != null) then
if(boat != null) then
set x = GetUnitX(boat)
set y = GetUnitY(boat)
call SetUnitPosition(sold, x, y)
endif
endif
endif
set Players_Ready[ownerNum] = true
call TriggerSleepAction(0.5)
if(GamePhase == GAME_PHASE_READY or GamePhase == GAME_PHASE_INITIALIZE) then
if(sold != null) then
if(boat != null) then
set x = GetUnitX(boat)
set y = GetUnitY(boat)
if(GetLocalPlayer() == owner) then
call PanCameraToTimed(x, y, 1.0)
call ClearSelection()
call SelectUnit(boat, true)
endif
endif
endif
elseif(GamePhase == GAME_PHASE_START) then
if(sold != null) then
if(boat != null) then
set x = GetUnitX(boat)
set y = GetUnitY(boat)
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, sold, "origin"))
if(GetLocalPlayer() == owner) then
call PanCameraToTimed(x, y, 1.0)
call ClearSelection()
call SelectUnit(sold, true)
endif
endif
endif
endif
call PauseUnit(sold, false)
call AppendPlayerNameHero(owner, sold)
set sold = null
set owner = null
set p = null
set mbItem = null
set f = null
set boat = null
set dummy = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit sold = GetSoldUnit()
local boolean okey = (IsUnitType(sold, UNIT_TYPE_HERO) and /*
*/(GameMode == MODE_NORMAL or GameMode == MODE_ALLPICK or GameMode == MODE_TEST))
set sold = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set PickHeroTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(PickHeroTrg, EVENT_PLAYER_UNIT_SELL)
call TriggerAddCondition(PickHeroTrg, Condition(function Conditions))
call TriggerAddAction(PickHeroTrg, function Actions)
call DisableTrigger(PickHeroTrg)
set copy = CreateGroup()
endfunction
endscope
//TESH.scrollpos=118
//TESH.alwaysfold=0
globals
trigger PickSameHeroTrg
endglobals
scope PickSameHero initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer ABILITY3_ID = 'Awrh' //Ability Rune (Random) rawcode
private constant integer ABILITY4_ID = 'ACtc' //Ability Rune (Pick) rawcode
private constant string CHOOSEN_TIPS = " has chosen " //Pick message
private constant string GIVEN_TIPS = " has been given " //Given message
private constant string WAIT_TIPS = "|cff00ff00Wait start|r.\n"//Wait message
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Items\\TomeOfRetraining\\TomeOfRetrainingCaster.mdl" //Start game hero effect
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private group copy
endglobals
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit sold = GetSoldUnit()
local integer soldType = GetUnitTypeId(sold)
local player owner = GetOwningPlayer(sold)
local integer ownerNum = GetPlayerId(owner)
local integer gold = GetPlayerState(owner, PLAYER_STATE_RESOURCE_GOLD)
local integer index = 0
local integer i = 0
local player p = null
local integer pNum = 0
local integer position = 0
local multiboarditem mbItem = null
local unit hero = null
local unit f = null
local unit boat = null
local real x = 0
local real y = 0
set i = 0
loop
exitwhen(i >= Total_Heroes)
if(soldType == All_Heroes[i]) then
set index = i
set i = Total_Heroes
endif
set i = i + 1
endloop
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
call TriggerSleepAction(0.1)
set pNum = GetPlayerId(p)
set Hero_Selected_Player[pNum] = index
set position = LoadInteger(Info_Ht, pNum, MULTIBOARD_ROW_KEY)
set mbItem = MultiboardGetItem(MultiB, position, MULTIBOARD_PLAYER_NAME)
call DisplayTextToPlayer(p, 0, 0, Player_Name[pNum] + GIVEN_TIPS + Player_Colors[pNum] + GetUnitName(sold) + ".|r")
call SetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD, gold)
call SetPlayerTechResearched(p, 'HERO', 1)
call AppendPlayerNameHero(p, sold)
call UnitRemoveAbility(Rune[pNum], ABILITY3_ID)
call UnitRemoveAbility(Rune[pNum], ABILITY4_ID)
call SetPlayerTechMaxAllowed(p, 'HERO', 1)
call SetPlayerTechMaxAllowed(p, soldType, 0)
set boat = null
set copy = CopyGroup(Boats)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(p == GetOwningPlayer(f) and boat == null) then
set boat = f
endif
endloop
if(i != ownerNum) then
if(boat != null) then
set x = GetUnitX(boat)
set y = GetUnitY(boat)
else
set x = 0.0
set y = 0.0
endif
set hero = CreateUnit(p, soldType, x, y, bj_UNIT_FACING)
else
set hero = sold
endif
call GroupAddUnit(Heroes, hero)
call GroupAddUnit(Unit_Outside_Temple, hero)
call MultiboardSetItemIcon(mbItem, GetHeroIcon(soldType))
call HeroesSetup(hero)
call TriggerSleepAction(0.1)
if(boat != null) then
call AddItemRectify(boat, soldType)
endif
if(GamePhase == GAME_PHASE_READY or GamePhase == GAME_PHASE_INITIALIZE) then
if(hero != null) then
//call ShowUnit(sold, false)
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, WAIT_TIPS)
endif
if(boat != null) then
set x = GetUnitX(boat)
set y = GetUnitY(boat)
call SetUnitPosition(hero, x, y)
call IssueTargetOrder(boat, "load", hero)
endif
endif
elseif(GamePhase == GAME_PHASE_START) then
if(hero != null) then
if(boat != null) then
set x = GetUnitX(boat)
set y = GetUnitY(boat)
call SetUnitPosition(hero, x, y)
endif
endif
endif
set Players_Ready[pNum] = true
call UnitAddItemById(hero, 'pman')
call UnitAddItemById(hero, 'phea')
call UnitAddItemById(hero, 'pman')
call UnitAddItemById(hero, 'phea')
call UnitAddItemById(hero, 'pman')
call UnitAddItemById(hero, 'phea')
call UnitAddItemById(hero, 'uflg')
call UnitAddItemById(hero, 'wswd')
endif
set i = i + 1
endloop
call TriggerSleepAction(0.5)
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerInForce(p, Players)) then
set hero = GetHero(p)
set boat = null
set copy = CopyGroup(Boats)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(p == GetOwningPlayer(f) and boat == null) then
set boat = f
endif
endloop
if(GamePhase == GAME_PHASE_READY or GamePhase == GAME_PHASE_INITIALIZE) then
if(hero != null) then
if(boat != null) then
set x = GetUnitX(boat)
set y = GetUnitY(boat)
if(GetLocalPlayer() == p) then
call PanCameraToTimed(x, y, 1.0)
call ClearSelection()
call SelectUnit(boat, true)
endif
endif
endif
elseif(GamePhase == GAME_PHASE_START) then
if(hero != null) then
if(boat != null) then
set x = GetUnitX(boat)
set y = GetUnitY(boat)
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, hero, "origin"))
if(GetLocalPlayer() == p) then
call PanCameraToTimed(x, y, 1.0)
call ClearSelection()
call SelectUnit(hero, true)
endif
endif
endif
endif
endif
set i = i + 1
endloop
set sold = null
set owner = null
set p = null
set mbItem = null
set f = null
set boat = null
set hero = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit sold = GetSoldUnit()
local boolean okey = (IsUnitType(sold, UNIT_TYPE_HERO) and /*
*/(GameMode == MODE_ALLSAME))
set sold = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set PickSameHeroTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(PickSameHeroTrg, EVENT_PLAYER_UNIT_SELL)
call TriggerAddCondition(PickSameHeroTrg, Condition(function Conditions))
call TriggerAddAction(PickSameHeroTrg, function Actions)
call DisableTrigger(PickSameHeroTrg)
set copy = CreateGroup()
endfunction
endscope
//TESH.scrollpos=54
//TESH.alwaysfold=0
globals
trigger RandomHeroTrg
trigger RandomHeroWaitTrg
endglobals
scope RandomHero initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer ABILITY3_ID = 'Awrh' //Ability Rune (Random) rawcode
private constant integer ABILITY4_ID = 'ACtc' //Ability Rune (Pick) rawcode
private constant string RANDOM_TIPS = " has randomed " //Random message
private constant string WAIT_TIPS = "|cff00ff00Wait start|r.\n" //Wait message
private constant string NON_AVAILABLE_TIPS = "|cffff0000No hero available|r. Wait until they are available at Obelisks." //No hero yet message
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Items\\TomeOfRetraining\\TomeOfRetrainingCaster.mdl" //Start game hero effect
private constant integer RANDOM_COST = 100 //Cost of getting a random hero
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
//----------------------------------------------------------------
globals
private group copy
endglobals
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local player playerT = GetTriggerPlayer()
local integer playerNum = GetPlayerId(playerT)
local integer loc = GetPlayerStartLocation(playerT)
local integer position = LoadInteger(Info_Ht, playerNum, MULTIBOARD_ROW_KEY)
local multiboarditem mbItem = MultiboardGetItem(MultiB, position, MULTIBOARD_PLAYER_NAME)
local integer i = 0
local integer j = 0
local integer randomInt = 0
local boolean exist = false
local integer Min = 0
local integer Max = 0
local real startLocX = GetPlayerStartLocationX(playerT)
local real startLocY = GetPlayerStartLocationY(playerT)
local unit hero = null
local integer heroID = 0
local unit boat = null
local unit f = null
local player p = null
local real x = 0
local real y = 0
call TriggerSleepAction(0.1)
call SetPlayerState(playerT, PLAYER_STATE_RESOURCE_GOLD, GetPlayerState( playerT, PLAYER_STATE_RESOURCE_GOLD) - RANDOM_COST)
call UnitRemoveAbility(Rune[playerNum], ABILITY3_ID)
call UnitRemoveAbility(Rune[playerNum], ABILITY4_ID)
if(GameMode == MODE_NORMAL) then
if(IsPlayerInForce(playerT, Players_Luminous)) then
set Min = 0
set Max = Total_Luminous_Heroes - 1
elseif(IsPlayerInForce(playerT, Players_Overcast)) then
set Min = Total_Luminous_Heroes
set Max = Total_Luminous_Heroes + Total_Overcast_Heroes - 1
endif
loop
set exist = false
set randomInt = GetRandomInt(Min, Max)
set j = 0
loop
exitwhen(j >= 8)
if(randomInt == Hero_Selected_Player[j]) then
set j = 8
set exist = true
endif
set j = j + 1
endloop
if(not exist and (Allow_Heroes[randomInt])) then
set Hero_Selected_Player[playerNum] = randomInt
set exist = false
else
set exist = true
endif
exitwhen(exist == false)
endloop
else
set Min = 0
set Max = Total_Heroes - 1
loop
set exist = false
set randomInt = GetRandomInt(Min, Max)
set j = 0
loop
exitwhen(j >= 8)
if(randomInt == Hero_Selected_Player[j]) then
set j = 8
set exist = true
endif
set j = j + 1
endloop
if(not exist and (Allow_Heroes[randomInt])) then
set Hero_Selected_Player[playerNum] = randomInt
set exist = false
else
set exist = true
endif
exitwhen(exist == false)
endloop
endif
set hero = CreateUnit(playerT, All_Heroes[Hero_Selected_Player[playerNum]], startLocX, startLocY, bj_UNIT_FACING)
set heroID = GetUnitTypeId(hero)
call SetPlayerTechResearched(playerT, 'HERO', 1)
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
call SetPlayerTechMaxAllowed(p, heroID, 0)
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, Player_Name[playerNum] + RANDOM_TIPS + Player_Colors[playerNum] + GetUnitName(hero) + ".|r")
endif
set i = i + 1
endloop
call GroupAddUnit(Unit_Outside_Temple, hero)
call GroupAddUnit(Heroes, hero)
call MultiboardSetItemIcon(mbItem, GetHeroIcon(heroID))
call HeroesSetup(hero)
set copy = CopyGroup(Boats)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(playerT == GetOwningPlayer(f) and boat == null) then
set boat = f
endif
endloop
call TriggerSleepAction(0.1)
if(boat != null) then
call AddItemRectify(boat, GetUnitTypeId(hero))
endif
if(GamePhase == GAME_PHASE_READY or GamePhase == GAME_PHASE_INITIALIZE) then
if(hero != null) then
//call ShowUnit(hero, false)
if(IsPlayerInForce(playerT, CommentaryForce)) then
call DisplayTextToPlayer(playerT, 0, 0, WAIT_TIPS)
endif
if(boat != null) then
set x = GetUnitX(boat)
set y = GetUnitY(boat)
call SetUnitPosition(hero, x, y)
call IssueTargetOrder(boat, "load", hero)
endif
endif
elseif(GamePhase == GAME_PHASE_START) then
if(hero != null) then
if(boat != null) then
set x = GetUnitX(boat)
set y = GetUnitY(boat)
call SetUnitPosition(hero, x, y)
endif
endif
endif
set Players_Ready[playerNum] = true
call TriggerSleepAction(0.5)
if(GamePhase == GAME_PHASE_READY or GamePhase == GAME_PHASE_INITIALIZE) then
if(boat != null) then
set x = GetUnitX(boat)
set y = GetUnitY(boat)
if(GetLocalPlayer() == playerT) then
call PanCameraToTimed(x, y, 1.0)
call ClearSelection()
call SelectUnit(boat, true)
endif
endif
elseif(GamePhase == GAME_PHASE_START) then
if(hero != null) then
if(boat != null) then
set x = GetUnitX(boat)
set y = GetUnitY(boat)
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, hero, "origin"))
if(GetLocalPlayer() == playerT) then
call PanCameraToTimed(x, y, 1.0)
call ClearSelection()
call SelectUnit(hero, true)
endif
endif
endif
endif
call UnitAddItemById(hero, 'pman')
call UnitAddItemById(hero, 'phea')
call UnitAddItemById(hero, 'pman')
call UnitAddItemById(hero, 'phea')
call UnitAddItemById(hero, 'pman')
call UnitAddItemById(hero, 'phea')
call UnitAddItemById(hero, 'uflg')
call UnitAddItemById(hero, 'wswd')
call AppendPlayerNameHero(playerT, hero)
set playerT = null
set mbItem = null
set hero = null
set boat = null
set f = null
set p = null
endfunction
//----------------------------------------------------------------
private function Wait_Actions takes nothing returns nothing
local player playerT = GetTriggerPlayer()
if(IsPlayerInForce(playerT, CommentaryForce)) then
call DisplayTextToPlayer(playerT, 0, 0, NON_AVAILABLE_TIPS)
endif
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return (GameMode == MODE_NORMAL or /*
*/GameMode == MODE_ALLPICK or /*
*/GameMode == MODE_TEST) and /*
*/Hero_Selected_Player[GetPlayerId(GetTriggerPlayer())] == -1
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local integer i = 0
set RandomHeroTrg = CreateTrigger()
set RandomHeroWaitTrg = CreateTrigger()
set i = 0
loop
exitwhen(i >= 8)
call TriggerRegisterPlayerChatEvent(RandomHeroTrg, Player(i), "-random", true)
call TriggerRegisterPlayerChatEvent(RandomHeroWaitTrg, Player(i), "-random", true)
set i = i + 1
endloop
call TriggerAddCondition(RandomHeroTrg, Condition(function Conditions))
call TriggerAddAction(RandomHeroTrg, function Actions)
call DisableTrigger(RandomHeroTrg)
call TriggerAddAction(RandomHeroWaitTrg, function Wait_Actions)
set copy = CreateGroup()
endfunction
endscope
//TESH.scrollpos=244
//TESH.alwaysfold=0
globals
hashtable Item_Ht = InitHashtable()
integer Item_Id = 0
integer Total_Share_Item
integer array Share_Item[12]
integer array Item_Value[163][2]
integer Combine_Potion_Charges_Max
integer Combine_Charges_Max
boolean Combine_Charged_Items
integer Total_Combine_Charge_Item = 3
integer array Combine_Charge_Item[13]
constant integer ITEM_OWNER_KEY = 0
constant integer ITEM_SAVE_KEY = 1
//constant integer ITEM_TOTAL_SAVE_KEY = 0
endglobals
scope SetupItems initializer Init
//----------------------------------------------------------------
function ShareItem_Conditions takes item itemPicked returns boolean
local integer itemPickedType = GetItemTypeId(itemPicked)
local boolean found = false
local integer i = 0
loop
exitwhen(i >= Total_Share_Item)
if(not found and Share_Item[i] == itemPickedType) then
set found = true
set i = Total_Share_Item
endif
set i = i + 1
endloop
return found
endfunction
//----------------------------------------------------------------
function IsUnitHasItemType takes unit u, integer itemType returns integer
local integer i = 0
local item cItem = null
local integer cType = 0
local integer count = 0
if(u != null) then
loop
exitwhen(i >= bj_MAX_INVENTORY)
set cItem = UnitItemInSlot(u, i)
set cType = GetItemTypeId(cItem)
if(cType == itemType) then
set count = count + 1
endif
set i = i + 1
endloop
endif
set cItem = null
return count
endfunction
//----------------------------------------------------------------
function Item_OwningConditions takes unit picker, item itemPicked returns boolean
local integer pickerId = GetUnitUserData(picker)
local player owner = GetOwningPlayer(picker)
local integer ownerId = GetPlayerId(owner)
local integer itemPickedId = GetItemUserData(itemPicked)
local real itemPickedX = GetItemX(itemPicked)
local real itemPickedY = GetItemY(itemPicked)
local integer itemPickedType = GetItemTypeId(itemPicked)
local integer itemOwnerId = 0
local integer i = 0
local integer j = 0
local player p = null
local integer pId = 0
local boolean found = false
local boolean allow = true
local item itemF = null
local integer total = 0
set found = ShareItem_Conditions(itemPicked)
if(not found) then
/*set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
set pId = GetPlayerId(p)
if(p != owner) then
if(not (HaveSavedInteger(Item_Ht, pId, ITEM_TOTAL_SAVE_KEY))) then
call SaveInteger(Item_Ht, pId, ITEM_TOTAL_SAVE_KEY, 1)
else
set total = LoadInteger(Item_Ht, pId, ITEM_TOTAL_SAVE_KEY)
set j = 1
loop
exitwhen(j >= total)
set itemF = LoadItemHandle(Item_Ht, pId, j)
if(itemF != null) then
if(itemF == itemPicked) then
call UnitRemoveItem(picker, itemPicked)
call SetItemPosition(itemPicked, itemPickedX, itemPickedY)
set allow = false
set j = total
set i = 8
endif
endif
set j = j + 1
endloop
set i = 8
endif
endif
set i = i + 1
endloop
if(allow) then
set total = LoadInteger(Item_Ht, ownerId, ITEM_TOTAL_SAVE_KEY)
call SaveItemHandle(Item_Ht, ownerId, total, itemPicked)
set total = total + 1
call SaveInteger(Item_Ht, ownerId, ITEM_TOTAL_SAVE_KEY, total)
endif*/
if(not (HaveSavedBoolean(Item_Ht, itemPickedId, ITEM_SAVE_KEY) or /*
*/LoadBoolean(Item_Ht, itemPickedId, ITEM_SAVE_KEY))) then
call SaveInteger(Item_Ht, itemPickedId, ITEM_OWNER_KEY, ownerId)
call SaveBoolean(Item_Ht, itemPickedId, ITEM_SAVE_KEY, true)
set allow = true
else
set itemOwnerId = LoadInteger(Item_Ht, itemPickedId, ITEM_OWNER_KEY)
set allow = (itemOwnerId == ownerId)
if(not allow) then
call UnitRemoveItem(picker, itemPicked)
call SetItemPosition(itemPicked, itemPickedX, itemPickedY)
endif
endif
endif
set owner = null
set p = null
set itemF = null
return allow
endfunction
//----------------------------------------------------------------
function Item_SetId takes item itemPicked returns nothing
local integer itemPickedId = GetItemUserData(itemPicked)
if(itemPickedId == 0) then
call SetItemUserData(itemPicked, Item_Id + 1)
set itemPickedId = Item_Id + 1
set Item_Id = Item_Id + 1
endif
endfunction
//----------------------------------------------------------------
function GetItemCost takes item it returns integer
local integer itType = GetItemTypeId(it)
local integer i = 0
loop
exitwhen(i >= 163)
if(Item_Value[i][0] == itType) then
return Item_Value[i][1]
endif
set i = i + 1
endloop
return 0
endfunction
//----------------------------------------------------------------
function GetItemCostById takes integer itType returns integer
local integer i = 0
loop
exitwhen(i >= 163)
if(Item_Value[i][0] == itType) then
return Item_Value[i][1]
endif
set i = i + 1
endloop
return 0
endfunction
//----------------------------------------------------------------
private function Remove_Misc takes nothing returns nothing
local item enumI = GetEnumItem()
if(GetItemType(enumI) == ITEM_TYPE_MISCELLANEOUS or /*
*/GetItemType(enumI) == ITEM_TYPE_UNKNOWN or /*
*/GetItemTypeId(enumI) == 'gfor') then
call RemoveItem(enumI)
else
/*if(GetItemType(enumI) == ITEM_TYPE_PERMANENT) then
call BJDebugMsg(GetItemName(enumI) + "1")
elseif(GetItemType(enumI) == ITEM_TYPE_ANY) then
call BJDebugMsg(GetItemName(enumI) + "2")
elseif(GetItemType(enumI) == ITEM_TYPE_CHARGED) then
call BJDebugMsg(GetItemName(enumI) + "3")
elseif(GetItemType(enumI) == ITEM_TYPE_POWERUP) then
call BJDebugMsg(GetItemName(enumI) + "4")
elseif(GetItemType(enumI) == ITEM_TYPE_ARTIFACT) then
call BJDebugMsg(GetItemName(enumI) + "5")
elseif(GetItemType(enumI) == ITEM_TYPE_PURCHASABLE) then
call BJDebugMsg(GetItemName(enumI) + "6")
elseif(GetItemType(enumI) == ITEM_TYPE_CAMPAIGN) then
call BJDebugMsg(GetItemName(enumI) + "7")
elseif(GetItemType(enumI) == ITEM_TYPE_UNKNOWN) then
call BJDebugMsg(GetItemName(enumI) + "8")
endif*/
endif
set enumI = null
endfunction
//----------------------------------------------------------------
function Remove_Actions takes nothing returns nothing
call EnumItemsInRect(bj_mapInitialPlayableArea, null, function Remove_Misc)
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger RemoveTrg = CreateTrigger()
call TriggerRegisterTimerEventPeriodic(RemoveTrg, 2.0)
call TriggerAddAction(RemoveTrg, function Remove_Actions)
//Setting globals
set Total_Share_Item = 12
set Share_Item[0] = 'phea' //Healing Potion
set Share_Item[1] = 'pman' //Potion of Mana
set Share_Item[2] = 'hlst' //Health Stone
set Share_Item[3] = 'mnst' //Mana Stone
set Share_Item[4] = 'wswd' //Sentry Wards
set Share_Item[5] = 'dust' //Dust
set Share_Item[6] = 'gemt' //Gem of True Seeing
set Share_Item[7] = 'kgal' //Barrel
set Share_Item[8] = 'pomn' //Cloud Vacuum
set Share_Item[9] = 'gobm' //Land Mine
set Share_Item[10] = 'uflg' //Serpent Ward
set Share_Item[11] = 'silk' //Spider Silk Broach
set Combine_Potion_Charges_Max = 9
set Combine_Charges_Max = 6
set Combine_Charged_Items = true
set Total_Combine_Charge_Item = 13
set Combine_Charge_Item[0] = 'phea' //Healing Potion
set Combine_Charge_Item[1] = 'pman' //Potion of Mana
set Combine_Charge_Item[2] = 'hlst' //Health Stone
set Combine_Charge_Item[3] = 'mnst' //Mana Stone
set Combine_Charge_Item[4] = 'wswd' //Sentry Wards
set Combine_Charge_Item[5] = 'dust' //Dust
set Combine_Charge_Item[6] = 'gemt' //Gem of True Seeing
set Combine_Charge_Item[7] = 'kgal' //Barrel
set Combine_Charge_Item[8] = 'pomn' //Cloud Vacuum
set Combine_Charge_Item[9] = 'gobm' //Land Mine
set Combine_Charge_Item[10] = 'uflg' //Serpent Ward
set Combine_Charge_Item[11] = 'silk' //Spider Silk Broach
set Combine_Charge_Item[12] = 'pnvu' //Yggdrasil's Essence
set Item_Value[0][0] = 'rwiz'
set Item_Value[0][1] = 300
set Item_Value[1][0] = 'rde1'
set Item_Value[1][1] = 500
set Item_Value[2][0] = 'belv'
set Item_Value[2][1] = 300
set Item_Value[3][0] = 'rin1'
set Item_Value[3][1] = 300
set Item_Value[4][0] = 'gcel'
set Item_Value[4][1] = 400
set Item_Value[5][0] = 'gemt'
set Item_Value[5][1] = 1000
set Item_Value[6][0] = 'cnob'
set Item_Value[6][1] = 500
set Item_Value[7][0] = 'ratc'
set Item_Value[7][1] = 500
set Item_Value[8][0] = 'stel'
set Item_Value[8][1] = 600
set Item_Value[9][0] = 'rlif'
set Item_Value[9][1] = 300
set Item_Value[10][0] = 'rat6'
set Item_Value[10][1] = 300
set Item_Value[11][0] = 'bgst'
set Item_Value[11][1] = 300
set Item_Value[12][0] = 'rag1'
set Item_Value[12][1] = 200
set Item_Value[13][0] = 'mcou'
set Item_Value[13][1] = 1000
set Item_Value[14][0] = 'ciri'
set Item_Value[14][1] = 600
set Item_Value[15][0] = 'penr'
set Item_Value[15][1] = 600
set Item_Value[16][0] = 'tels'
set Item_Value[16][1] = 800
set Item_Value[17][0] = 'rst1'
set Item_Value[17][1] = 900
set Item_Value[18][0] = 'prvt'
set Item_Value[18][1] = 700
set Item_Value[19][0] = 'rde3'
set Item_Value[19][1] = 1000
set Item_Value[20][0] = 'modt'
set Item_Value[20][1] = 800
set Item_Value[21][0] = 'rde2'
set Item_Value[21][1] = 1000
set Item_Value[22][0] = 'rat9'
set Item_Value[22][1] = 900
set Item_Value[23][0] = 'bspd'
set Item_Value[23][1] = 1400
set Item_Value[24][0] = 'crys'
set Item_Value[24][1] = 1100
set Item_Value[25][0] = 'brac'
set Item_Value[25][1] = 1200
set Item_Value[26][0] = 'kpin'
set Item_Value[26][1] = 2000
set Item_Value[27][0] = 'pmna'
set Item_Value[27][1] = 1200
set Item_Value[28][0] = 'afac'
set Item_Value[28][1] = 1300
set Item_Value[29][0] = 'evtl'
set Item_Value[29][1] = 1100
set Item_Value[30][0] = 'mlst'
set Item_Value[30][1] = 1500
set Item_Value[31][0] = 'rhth'
set Item_Value[31][1] = 1400
set Item_Value[32][0] = 'spsh'
set Item_Value[32][1] = 2500
set Item_Value[33][0] = 'odef'
set Item_Value[33][1] = 1800
set Item_Value[34][0] = 'sbch'
set Item_Value[34][1] = 2300
set Item_Value[35][0] = 'ssil'
set Item_Value[35][1] = 2300
set Item_Value[36][0] = 'shtm'
set Item_Value[36][1] = 600
set Item_Value[37][0] = 'rugt'
set Item_Value[37][1] = 3000
set Item_Value[38][0] = 'anfg'
set Item_Value[38][1] = 2600
set Item_Value[39][0] = 'gvsm'
set Item_Value[39][1] = 3200
set Item_Value[40][0] = 'frgd'
set Item_Value[40][1] = 3000
set Item_Value[41][0] = 'ajen'
set Item_Value[41][1] = 2600
set Item_Value[42][0] = 'pclr'
set Item_Value[42][1] = 100
set Item_Value[43][0] = 'phea'
set Item_Value[43][1] = 200
set Item_Value[44][0] = 'plcl'
set Item_Value[44][1] = 50
set Item_Value[45][0] = 'sres'
set Item_Value[45][1] = 500
set Item_Value[46][0] = 'stwp'
set Item_Value[46][1] = 500
set Item_Value[47][0] = 'sand'
set Item_Value[47][1] = 500
set Item_Value[48][0] = 'shea'
set Item_Value[48][1] = 500
set Item_Value[49][0] = 'rej6'
set Item_Value[49][1] = 500
set Item_Value[50][0] = 'sman'
set Item_Value[50][1] = 500
set Item_Value[51][0] = 'srrc'
set Item_Value[51][1] = 500
set Item_Value[52][0] = 'sror'
set Item_Value[52][1] = 500
set Item_Value[53][0] = 'rej5'
set Item_Value[53][1] = 500
set Item_Value[54][0] = 'scul'
set Item_Value[54][1] = 500
set Item_Value[55][0] = 'shas'
set Item_Value[55][1] = 500
set Item_Value[56][0] = 'wswd'
set Item_Value[56][1] = 100
set Item_Value[57][0] = 'pman'
set Item_Value[57][1] = 100
set Item_Value[58][0] = 'hslv'
set Item_Value[58][1] = 140
set Item_Value[59][0] = 'pgma'
set Item_Value[59][1] = 200
set Item_Value[60][0] = 'pghe'
set Item_Value[60][1] = 400
set Item_Value[61][0] = 'mnst'
set Item_Value[61][1] = 300
set Item_Value[62][0] = 'hlst'
set Item_Value[62][1] = 500
set Item_Value[63][0] = 'I006'
set Item_Value[63][1] = 700
set Item_Value[64][0] = 'I003'
set Item_Value[64][1] = 200
set Item_Value[65][0] = 'I004'
set Item_Value[65][1] = 400
set Item_Value[66][0] = 'I000'
set Item_Value[66][1] = 700
set Item_Value[67][0] = 'I00C'
set Item_Value[67][1] = 600
set Item_Value[68][0] = 'I01P'
set Item_Value[68][1] = 1100
set Item_Value[69][0] = 'I00A'
set Item_Value[69][1] = 600
set Item_Value[70][0] = 'I00R'
set Item_Value[70][1] = 1200
set Item_Value[71][0] = 'I01Q'
set Item_Value[71][1] = 1100
set Item_Value[72][0] = 'I01B'
set Item_Value[72][1] = 600
set Item_Value[73][0] = 'I001'
set Item_Value[73][1] = 1400
set Item_Value[74][0] = 'I020'
set Item_Value[74][1] = 900
set Item_Value[75][0] = 'I00K'
set Item_Value[75][1] = 700
set Item_Value[76][0] = 'I00Z'
set Item_Value[76][1] = 1000
set Item_Value[77][0] = 'I00N'
set Item_Value[77][1] = 800
set Item_Value[78][0] = 'I005'
set Item_Value[78][1] = 800
set Item_Value[79][0] = 'I017'
set Item_Value[79][1] = 400
set Item_Value[80][0] = 'I00P'
set Item_Value[80][1] = 1000
set Item_Value[81][0] = 'I013'
set Item_Value[81][1] = 800
set Item_Value[82][0] = 'I00B'
set Item_Value[82][1] = 800
set Item_Value[83][0] = 'I00F'
set Item_Value[83][1] = 600
set Item_Value[84][0] = 'I00L'
set Item_Value[84][1] = 1200
set Item_Value[85][0] = 'I010'
set Item_Value[85][1] = 1400
set Item_Value[86][0] = 'I01Z'
set Item_Value[86][1] = 600
set Item_Value[87][0] = 'I00I'
set Item_Value[87][1] = 1200
set Item_Value[88][0] = 'I026'
set Item_Value[88][1] = 1500
set Item_Value[89][0] = 'I012'
set Item_Value[89][1] = 1600
set Item_Value[90][0] = 'I00D'
set Item_Value[90][1] = 1200
set Item_Value[91][0] = 'I00J'
set Item_Value[91][1] = 1500
set Item_Value[92][0] = 'I00Y'
set Item_Value[92][1] = 1500
set Item_Value[93][0] = 'I01Y'
set Item_Value[93][1] = 1800
set Item_Value[94][0] = 'I024'
set Item_Value[94][1] = 1700
set Item_Value[95][0] = 'I01A'
set Item_Value[95][1] = 1100
set Item_Value[96][0] = 'I00G'
set Item_Value[96][1] = 1200
set Item_Value[97][0] = 'I00T'
set Item_Value[97][1] = 1400
set Item_Value[98][0] = 'I00X'
set Item_Value[98][1] = 700
set Item_Value[99][0] = 'I01D'
set Item_Value[99][1] = 1300
set Item_Value[100][0] = 'I01J'
set Item_Value[100][1] = 1400
set Item_Value[101][0] = 'I008'
set Item_Value[101][1] = 700
set Item_Value[102][0] = 'I00M'
set Item_Value[102][1] = 2400
set Item_Value[103][0] = 'I01V'
set Item_Value[103][1] = 1200
set Item_Value[104][0] = 'I01U'
set Item_Value[104][1] = 1100
set Item_Value[105][0] = 'I01R'
set Item_Value[105][1] = 2200
set Item_Value[106][0] = 'I01N'
set Item_Value[106][1] = 1700
set Item_Value[107][0] = 'I018'
set Item_Value[107][1] = 1300
set Item_Value[108][0] = 'I01M'
set Item_Value[108][1] = 1600
set Item_Value[109][0] = 'I00H'
set Item_Value[109][1] = 800
set Item_Value[110][0] = 'I00O'
set Item_Value[110][1] = 3000
set Item_Value[111][0] = 'I01F'
set Item_Value[111][1] = 1800
set Item_Value[112][0] = 'I01O'
set Item_Value[112][1] = 2900
set Item_Value[113][0] = 'I014'
set Item_Value[113][1] = 2200
set Item_Value[114][0] = 'I01I'
set Item_Value[114][1] = 1700
set Item_Value[115][0] = 'I01E'
set Item_Value[115][1] = 2000
set Item_Value[116][0] = 'I00Q'
set Item_Value[116][1] = 2000
set Item_Value[117][0] = 'I025'
set Item_Value[117][1] = 2000
set Item_Value[118][0] = 'I011'
set Item_Value[118][1] = 1400
set Item_Value[119][0] = 'I016'
set Item_Value[119][1] = 1900
set Item_Value[120][0] = 'I007'
set Item_Value[120][1] = 2300
set Item_Value[121][0] = 'I022'
set Item_Value[121][1] = 1800
set Item_Value[122][0] = 'I015'
set Item_Value[122][1] = 1900
set Item_Value[123][0] = 'I01V'
set Item_Value[123][1] = 2600
set Item_Value[124][0] = 'I01U'
set Item_Value[124][1] = 1600
set Item_Value[125][0] = 'I01R'
set Item_Value[125][1] = 2200
set Item_Value[126][0] = 'I01N'
set Item_Value[126][1] = 1700
set Item_Value[127][0] = 'I018'
set Item_Value[127][1] = 1300
set Item_Value[128][0] = 'I01M'
set Item_Value[128][1] = 1600
set Item_Value[129][0] = 'I00H'
set Item_Value[129][1] = 800
set Item_Value[130][0] = 'I00O'
set Item_Value[130][1] = 3000
set Item_Value[131][0] = 'I01F'
set Item_Value[131][1] = 1800
set Item_Value[132][0] = 'I01O'
set Item_Value[132][1] = 2900
set Item_Value[133][0] = 'I014'
set Item_Value[133][1] = 2200
set Item_Value[134][0] = 'I01I'
set Item_Value[134][1] = 1700
set Item_Value[135][0] = 'I01E'
set Item_Value[135][1] = 2000
set Item_Value[136][0] = 'I00Q'
set Item_Value[136][1] = 2000
set Item_Value[137][0] = 'I025'
set Item_Value[137][1] = 2000
set Item_Value[138][0] = 'I011'
set Item_Value[138][1] = 1400
set Item_Value[139][0] = 'I016'
set Item_Value[139][1] = 1900
set Item_Value[140][0] = 'I007'
set Item_Value[140][1] = 2300
set Item_Value[141][0] = 'I022'
set Item_Value[141][1] = 1800
set Item_Value[142][0] = 'I015'
set Item_Value[142][1] = 1900
set Item_Value[143][0] = 'I023'
set Item_Value[143][1] = 2600
set Item_Value[144][0] = 'I01X'
set Item_Value[144][1] = 1600
set Item_Value[145][0] = 'I00V'
set Item_Value[145][1] = 1900
set Item_Value[146][0] = 'I01C'
set Item_Value[146][1] = 2300
set Item_Value[147][0] = 'I00S'
set Item_Value[147][1] = 2400
set Item_Value[148][0] = 'I01K'
set Item_Value[148][1] = 2200
set Item_Value[149][0] = 'I01L'
set Item_Value[149][1] = 2000
set Item_Value[150][0] = 'I002'
set Item_Value[150][1] = 3400
set Item_Value[151][0] = 'I00W'
set Item_Value[151][1] = 2900
set Item_Value[152][0] = 'I021'
set Item_Value[152][1] = 2600
set Item_Value[153][0] = 'I01W'
set Item_Value[153][1] = 3300
set Item_Value[154][0] = 'I01S'
set Item_Value[154][1] = 3400
set Item_Value[155][0] = 'I027'
set Item_Value[155][1] = 3600
set Item_Value[156][0] = 'I009'
set Item_Value[156][1] = 4500
set Item_Value[157][0] = 'I00U'
set Item_Value[157][1] = 2800
set Item_Value[158][0] = 'I019'
set Item_Value[158][1] = 2200
set Item_Value[159][0] = 'I01T'
set Item_Value[159][1] = 2300
set Item_Value[160][0] = 'I028'
set Item_Value[160][1] = 2800
set Item_Value[161][0] = 'I01G'
set Item_Value[161][1] = 3200
set Item_Value[162][0] = 'I01H'
set Item_Value[162][1] = 2400
endfunction
endscope
//TESH.scrollpos=438
//TESH.alwaysfold=0
globals
trigger RuneTrg
item Rune_Top_Left
item Rune_Top_Left_Middle
item Rune_Top_Left_Corner
item Rune_Top_Left_Add_1
item Rune_Top_Left_Add_2
item Rune_Top_Right
item Rune_Top_Right_Middle
item Rune_Top_Right_Corner
item Rune_Top_Right_Add_1
item Rune_Top_Right_Add_2
item Rune_Bottom_Right
item Rune_Bottom_Right_Middle
item Rune_Bottom_Right_Corner
item Rune_Bottom_Right_Add_1
item Rune_Bottom_Right_Add_2
item Rune_Bottom_Left
item Rune_Bottom_Left_Middle
item Rune_Bottom_Left_Corner
item Rune_Bottom_Left_Add_1
item Rune_Bottom_Left_Add_2
endglobals
scope RuneItems initializer Init
//----------------------------------------------------------------
globals
private integer array Rune[9]
private integer Rune_Count
private real array Rune_RegionsX[20]
private real array Rune_RegionsY[20]
private integer Rune_Regions_Count
private boolean Rune_Top_Left_Taken
private boolean Rune_Top_Left_Middle_Taken
private boolean Rune_Top_Left_Corner_Taken
private boolean Rune_Top_Left_Add_1_Taken
private boolean Rune_Top_Left_Add_2_Taken
private boolean Rune_Top_Right_Taken
private boolean Rune_Top_Right_Middle_Taken
private boolean Rune_Top_Right_Corner_Taken
private boolean Rune_Top_Right_Add_1_Taken
private boolean Rune_Top_Right_Add_2_Taken
private boolean Rune_Bottom_Right_Taken
private boolean Rune_Bottom_Right_Middle_Taken
private boolean Rune_Bottom_Right_Corner_Taken
private boolean Rune_Bottom_Right_Add_1_Taken
private boolean Rune_Bottom_Right_Add_2_Taken
private boolean Rune_Bottom_Left_Taken
private boolean Rune_Bottom_Left_Middle_Taken
private boolean Rune_Bottom_Left_Corner_Taken
private boolean Rune_Bottom_Left_Add_1_Taken
private boolean Rune_Bottom_Left_Add_2_Taken
endglobals
//----------------------------------------------------------------
function Rune_Conditions takes item itemPicked returns boolean
local integer itemPickedType = GetItemTypeId(itemPicked)
local boolean found = false
local integer i = 0
if(GetItemType(itemPicked) == ITEM_TYPE_POWERUP) then
loop
exitwhen(i >= Rune_Count)
if(not found and Rune[i] == itemPickedType) then
set found = true
set i = Total_Share_Item
endif
set i = i + 1
endloop
endif
return found
endfunction
//----------------------------------------------------------------
private function CreateRune_Actions takes nothing returns nothing
local integer i = 0
loop
exitwhen(i >= Rune_Regions_Count)
if(i == 0) then
if(Rune_Top_Left_Taken or (Rune_Top_Left == null)) then
set Rune_Top_Left_Taken = false
set Rune_Top_Left = CreateItem(Rune[0], Rune_RegionsX[i], Rune_RegionsY[i])
else
if(GetItemTypeId(Rune_Top_Left) == Rune[0]) then
call RemoveItem(Rune_Top_Left)
set Rune_Top_Left_Taken = false
set Rune_Top_Left = CreateItem(Rune[11], Rune_RegionsX[i], Rune_RegionsY[i])
endif
endif
elseif(i == 1) then
if(Rune_Top_Left_Middle_Taken or (Rune_Top_Left_Middle == null)) then
set Rune_Top_Left_Middle_Taken = false
set Rune_Top_Left_Middle = CreateItem(Rune[1], Rune_RegionsX[i], Rune_RegionsY[i])
else
if(GetItemTypeId(Rune_Top_Left_Middle) == Rune[1]) then
call RemoveItem(Rune_Top_Left_Middle)
set Rune_Top_Left_Middle_Taken = false
set Rune_Top_Left_Middle = CreateItem(Rune[GetRandomInt(4, 8)], Rune_RegionsX[i], Rune_RegionsY[i])
endif
endif
elseif(i == 2) then
if(Rune_Top_Left_Corner_Taken or (Rune_Top_Left_Corner == null)) then
set Rune_Top_Left_Corner_Taken = false
set Rune_Top_Left_Corner = CreateItem(Rune[2], Rune_RegionsX[i], Rune_RegionsY[i])
else
if(Rune_Top_Left_Corner != null) then
call RemoveItem(Rune_Top_Left_Corner)
endif
set Rune_Top_Left_Corner_Taken = false
set Rune_Top_Left_Corner = CreateItem(Rune[3], Rune_RegionsX[i], Rune_RegionsY[i])
endif
elseif(i == 3) then
if(Rune_Top_Left_Add_1_Taken or (Rune_Top_Left_Add_1 == null)) then
set Rune_Top_Left_Add_1_Taken = false
set Rune_Top_Left_Add_1 = CreateItem(Rune[0], Rune_RegionsX[i], Rune_RegionsY[i])
else
if(GetItemTypeId(Rune_Top_Left_Add_1) == Rune[0]) then
call RemoveItem(Rune_Top_Left_Add_1)
set Rune_Top_Left_Add_1_Taken = false
set Rune_Top_Left_Add_1 = CreateItem(Rune[11], Rune_RegionsX[i], Rune_RegionsY[i])
endif
endif
elseif(i == 4) then
if(Rune_Top_Left_Add_2_Taken or (Rune_Top_Left_Add_2 == null)) then
set Rune_Top_Left_Add_2_Taken = false
set Rune_Top_Left_Add_2 = CreateItem(Rune[0], Rune_RegionsX[i], Rune_RegionsY[i])
else
if(GetItemTypeId(Rune_Top_Left_Add_2) == Rune[0]) then
call RemoveItem(Rune_Top_Left_Add_2)
set Rune_Top_Left_Add_2_Taken = false
set Rune_Top_Left_Add_2 = CreateItem(Rune[11], Rune_RegionsX[i], Rune_RegionsY[i])
endif
endif
elseif(i == 5) then
if(Rune_Top_Right_Taken or (Rune_Top_Right == null)) then
set Rune_Top_Right_Taken = false
set Rune_Top_Right = CreateItem(Rune[0], Rune_RegionsX[i], Rune_RegionsY[i])
else
if(GetItemTypeId(Rune_Top_Right) == Rune[0]) then
call RemoveItem(Rune_Top_Right)
set Rune_Top_Right_Taken = false
set Rune_Top_Right = CreateItem(Rune[11], Rune_RegionsX[i], Rune_RegionsY[i])
endif
endif
elseif(i == 6) then
if(Rune_Top_Right_Middle_Taken or (Rune_Top_Right_Middle == null)) then
set Rune_Top_Right_Middle_Taken = false
set Rune_Top_Right_Middle = CreateItem(Rune[1], Rune_RegionsX[i], Rune_RegionsY[i])
else
if(GetItemTypeId(Rune_Top_Right_Middle) == Rune[1]) then
call RemoveItem(Rune_Top_Right_Middle)
set Rune_Top_Right_Middle_Taken = false
set Rune_Top_Right_Middle = CreateItem(Rune[GetRandomInt(4, 8)], Rune_RegionsX[i], Rune_RegionsY[i])
endif
endif
elseif(i == 7) then
if(Rune_Top_Right_Corner_Taken or (Rune_Top_Right_Corner == null)) then
set Rune_Top_Right_Corner_Taken = false
set Rune_Top_Right_Corner = CreateItem(Rune[2], Rune_RegionsX[i], Rune_RegionsY[i])
else
if(Rune_Top_Right_Corner != null) then
call RemoveItem(Rune_Top_Right_Corner)
endif
set Rune_Top_Right_Corner_Taken = false
set Rune_Top_Right_Corner = CreateItem(Rune[3], Rune_RegionsX[i], Rune_RegionsY[i])
endif
elseif(i == 8) then
if(Rune_Top_Right_Add_1_Taken or (Rune_Top_Right_Add_1 == null)) then
set Rune_Top_Right_Add_1_Taken = false
set Rune_Top_Right_Add_1 = CreateItem(Rune[0], Rune_RegionsX[i], Rune_RegionsY[i])
else
if(GetItemTypeId(Rune_Top_Right_Add_1) == Rune[0]) then
call RemoveItem(Rune_Top_Right_Add_1)
set Rune_Top_Right_Add_1_Taken = false
set Rune_Top_Right_Add_1 = CreateItem(Rune[11], Rune_RegionsX[i], Rune_RegionsY[i])
endif
endif
elseif(i == 9) then
if(Rune_Top_Right_Add_2_Taken or (Rune_Top_Right_Add_2 == null)) then
set Rune_Top_Right_Add_2_Taken = false
set Rune_Top_Right_Add_2 = CreateItem(Rune[0], Rune_RegionsX[i], Rune_RegionsY[i])
else
if(GetItemTypeId(Rune_Top_Right_Add_2) == Rune[0]) then
call RemoveItem(Rune_Top_Right_Add_2)
set Rune_Top_Right_Add_2_Taken = false
set Rune_Top_Right_Add_2 = CreateItem(Rune[11], Rune_RegionsX[i], Rune_RegionsY[i])
endif
endif
elseif(i == 10) then
if(Rune_Bottom_Right_Taken or (Rune_Bottom_Right == null)) then
set Rune_Bottom_Right_Taken = false
set Rune_Bottom_Right = CreateItem(Rune[0], Rune_RegionsX[i], Rune_RegionsY[i])
else
if(GetItemTypeId(Rune_Bottom_Right) == Rune[0]) then
call RemoveItem(Rune_Bottom_Right)
set Rune_Bottom_Right_Taken = false
set Rune_Bottom_Right = CreateItem(Rune[11], Rune_RegionsX[i], Rune_RegionsY[i])
endif
endif
elseif(i == 11) then
if(Rune_Bottom_Right_Middle_Taken or (Rune_Bottom_Right_Middle == null)) then
set Rune_Bottom_Right_Middle_Taken = false
set Rune_Bottom_Right_Middle = CreateItem(Rune[1], Rune_RegionsX[i], Rune_RegionsY[i])
else
if(GetItemTypeId(Rune_Bottom_Right_Middle) == Rune[1]) then
call RemoveItem(Rune_Bottom_Right_Middle)
set Rune_Bottom_Right_Middle_Taken = false
set Rune_Bottom_Right_Middle = CreateItem(Rune[GetRandomInt(4, 8)], Rune_RegionsX[i], Rune_RegionsY[i])
endif
endif
elseif(i == 12) then
if(Rune_Bottom_Right_Corner_Taken or (Rune_Bottom_Right_Corner == null)) then
set Rune_Bottom_Right_Corner_Taken = false
set Rune_Bottom_Right_Corner = CreateItem(Rune[2], Rune_RegionsX[i], Rune_RegionsY[i])
else
if(Rune_Bottom_Right_Corner != null) then
call RemoveItem(Rune_Bottom_Right_Corner)
endif
set Rune_Bottom_Right_Corner_Taken = false
set Rune_Bottom_Right_Corner = CreateItem(Rune[3], Rune_RegionsX[i], Rune_RegionsY[i])
endif
elseif(i == 13) then
if(Rune_Bottom_Right_Add_1_Taken or (Rune_Bottom_Right_Add_1 == null)) then
set Rune_Bottom_Right_Add_1_Taken = false
set Rune_Bottom_Right_Add_1 = CreateItem(Rune[0], Rune_RegionsX[i], Rune_RegionsY[i])
else
if(GetItemTypeId(Rune_Bottom_Right_Add_1) == Rune[0]) then
call RemoveItem(Rune_Bottom_Right_Add_1)
set Rune_Bottom_Right_Add_1_Taken = false
set Rune_Bottom_Right_Add_1 = CreateItem(Rune[11], Rune_RegionsX[i], Rune_RegionsY[i])
endif
endif
elseif(i == 14) then
if(Rune_Bottom_Right_Add_2_Taken or (Rune_Bottom_Right_Add_2 == null)) then
set Rune_Bottom_Right_Add_2_Taken = false
set Rune_Bottom_Right_Add_2 = CreateItem(Rune[0], Rune_RegionsX[i], Rune_RegionsY[i])
else
if(GetItemTypeId(Rune_Bottom_Right_Add_2) == Rune[0]) then
call RemoveItem(Rune_Bottom_Right_Add_2)
set Rune_Bottom_Right_Add_2_Taken = false
set Rune_Bottom_Right_Add_2 = CreateItem(Rune[11], Rune_RegionsX[i], Rune_RegionsY[i])
endif
endif
elseif(i == 15) then
if(Rune_Bottom_Left_Taken or (Rune_Bottom_Left == null)) then
set Rune_Bottom_Left_Taken = false
set Rune_Bottom_Left = CreateItem(Rune[0], Rune_RegionsX[i], Rune_RegionsY[i])
else
if(GetItemTypeId(Rune_Bottom_Left) == Rune[0]) then
call RemoveItem(Rune_Bottom_Left)
set Rune_Bottom_Left_Taken = false
set Rune_Bottom_Left = CreateItem(Rune[11], Rune_RegionsX[i], Rune_RegionsY[i])
endif
endif
elseif(i == 16) then
if(Rune_Bottom_Left_Middle_Taken or (Rune_Bottom_Left_Middle == null)) then
set Rune_Bottom_Left_Middle_Taken = false
set Rune_Bottom_Left_Middle = CreateItem(Rune[1], Rune_RegionsX[i], Rune_RegionsY[i])
else
if(GetItemTypeId(Rune_Bottom_Left_Middle) == Rune[1]) then
call RemoveItem(Rune_Bottom_Left_Middle)
set Rune_Bottom_Left_Middle_Taken = false
set Rune_Bottom_Left_Middle = CreateItem(Rune[GetRandomInt(4, 8)], Rune_RegionsX[i], Rune_RegionsY[i])
endif
endif
elseif(i == 17) then
if(Rune_Bottom_Left_Corner_Taken or (Rune_Bottom_Left_Corner == null)) then
set Rune_Bottom_Left_Corner_Taken = false
set Rune_Bottom_Left_Corner = CreateItem(Rune[2], Rune_RegionsX[i], Rune_RegionsY[i])
else
if(Rune_Bottom_Left_Corner != null) then
call RemoveItem(Rune_Bottom_Left_Corner)
endif
set Rune_Bottom_Left_Corner_Taken = false
set Rune_Bottom_Left_Corner = CreateItem(Rune[3], Rune_RegionsX[i], Rune_RegionsY[i])
endif
elseif(i == 18) then
if(Rune_Bottom_Left_Add_1_Taken or (Rune_Bottom_Left_Add_1 == null)) then
set Rune_Bottom_Left_Add_1_Taken = false
set Rune_Bottom_Left_Add_1 = CreateItem(Rune[0], Rune_RegionsX[i], Rune_RegionsY[i])
else
if(GetItemTypeId(Rune_Bottom_Left_Add_1) == Rune[0]) then
call RemoveItem(Rune_Bottom_Left_Add_1)
set Rune_Bottom_Left_Add_1_Taken = false
set Rune_Bottom_Left_Add_1 = CreateItem(Rune[11], Rune_RegionsX[i], Rune_RegionsY[i])
endif
endif
elseif(i == 19) then
if(Rune_Bottom_Left_Add_2_Taken or (Rune_Bottom_Left_Add_2 == null)) then
set Rune_Bottom_Left_Add_2_Taken = false
set Rune_Bottom_Left_Add_2 = CreateItem(Rune[0], Rune_RegionsX[i], Rune_RegionsY[i])
else
if(GetItemTypeId(Rune_Bottom_Left_Add_2) == Rune[0]) then
call RemoveItem(Rune_Bottom_Left_Add_2)
set Rune_Bottom_Left_Add_2_Taken = false
set Rune_Bottom_Left_Add_2 = CreateItem(Rune[11], Rune_RegionsX[i], Rune_RegionsY[i])
endif
endif
endif
set i = i + 1
endloop
endfunction
//----------------------------------------------------------------
private function TakeRune_Conditions takes nothing returns boolean
local item pickedItem = GetManipulatedItem()
local integer i = 0
local boolean ok = false
if(GetItemType(pickedItem) == ITEM_TYPE_POWERUP) then
set i = 0
loop
exitwhen(i >= Rune_Count)
if(GetItemTypeId(pickedItem) == Rune[i]) then
set ok = true
set i = Rune_Count
endif
set i = i + 1
endloop
endif
set pickedItem = null
return ok
endfunction
//----------------------------------------------------------------
private function TakeRune_Actions takes nothing returns nothing
local item takenItem = GetManipulatedItem()
call TriggerSleepAction(0.5)
if(takenItem == Rune_Top_Left) then
set Rune_Top_Left_Taken = true
set Rune_Top_Left = null
elseif(takenItem == Rune_Top_Left_Middle) then
set Rune_Top_Left_Middle_Taken = true
set Rune_Top_Left_Middle = null
elseif(takenItem == Rune_Top_Left_Corner) then
set Rune_Top_Left_Corner_Taken = true
set Rune_Top_Left_Corner = null
elseif(takenItem == Rune_Top_Left_Add_1) then
set Rune_Top_Left_Add_1_Taken = true
set Rune_Top_Left_Add_1 = null
elseif(takenItem == Rune_Top_Left_Add_2) then
set Rune_Top_Left_Add_2_Taken = true
set Rune_Top_Left_Add_2 = null
elseif(takenItem == Rune_Top_Right) then
set Rune_Top_Right_Taken = true
set Rune_Top_Right = null
elseif(takenItem == Rune_Top_Right_Middle) then
set Rune_Top_Right_Middle_Taken = true
set Rune_Top_Right_Middle = null
elseif(takenItem == Rune_Top_Right_Corner) then
set Rune_Top_Right_Corner_Taken = true
set Rune_Top_Right_Corner = null
elseif(takenItem == Rune_Top_Right_Add_1) then
set Rune_Top_Right_Add_1_Taken = true
set Rune_Top_Right_Add_1 = null
elseif(takenItem == Rune_Top_Right_Add_2) then
set Rune_Top_Right_Add_2_Taken = true
set Rune_Top_Right_Add_2 = null
elseif(takenItem == Rune_Bottom_Right) then
set Rune_Bottom_Right_Taken = true
set Rune_Bottom_Right = null
elseif(takenItem == Rune_Bottom_Right_Middle) then
set Rune_Bottom_Right_Middle_Taken = true
set Rune_Bottom_Right_Middle = null
elseif(takenItem == Rune_Bottom_Right_Corner) then
set Rune_Bottom_Right_Corner_Taken = true
set Rune_Bottom_Right_Corner = null
elseif(takenItem == Rune_Bottom_Right_Add_1) then
set Rune_Bottom_Right_Add_1_Taken = true
set Rune_Bottom_Right_Add_1 = null
elseif(takenItem == Rune_Bottom_Right_Add_2) then
set Rune_Bottom_Right_Add_2_Taken = true
set Rune_Bottom_Right_Add_2 = null
elseif(takenItem == Rune_Bottom_Left) then
set Rune_Bottom_Left_Taken = true
set Rune_Bottom_Left = null
elseif(takenItem == Rune_Bottom_Left_Middle) then
set Rune_Bottom_Left_Middle_Taken = true
set Rune_Bottom_Left_Middle = null
elseif(takenItem == Rune_Bottom_Left_Corner) then
set Rune_Bottom_Left_Corner_Taken = true
set Rune_Bottom_Left_Corner = null
elseif(takenItem == Rune_Bottom_Left_Add_1) then
set Rune_Bottom_Left_Add_1_Taken = true
set Rune_Bottom_Left_Add_1 = null
elseif(takenItem == Rune_Bottom_Left_Add_2) then
set Rune_Bottom_Left_Add_2_Taken = true
set Rune_Bottom_Left_Add_2 = null
endif
call TriggerSleepAction(0.5)
call RemoveItem(takenItem)
set takenItem = null
endfunction
//----------------------------------------------------------------
private function Drop_Conditions takes nothing returns boolean
local item droppedItem = GetManipulatedItem()
local integer i = 0
local boolean ok = false
if(GetItemType(droppedItem) == ITEM_TYPE_MISCELLANEOUS) then
set ok = true
endif
set droppedItem = null
return ok
endfunction
//----------------------------------------------------------------
private function Drop_Actions takes nothing returns nothing
local item takenItem = GetManipulatedItem()
call RemoveItem(takenItem)
set takenItem = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger RuneTakenTrg = CreateTrigger()
local trigger DropBufferTrg = CreateTrigger()
set RuneTrg = CreateTrigger()
call TriggerAddAction(RuneTrg, function CreateRune_Actions)
call DisableTrigger(RuneTrg)
call TriggerRegisterAnyUnitEventBJ(RuneTakenTrg, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(RuneTakenTrg, Condition(function TakeRune_Conditions))
call TriggerAddAction(RuneTakenTrg, function TakeRune_Actions)
call TriggerRegisterAnyUnitEventBJ(DropBufferTrg, EVENT_PLAYER_UNIT_DROP_ITEM)
call TriggerAddCondition(DropBufferTrg, Condition(function Drop_Conditions))
call TriggerAddAction(DropBufferTrg, function Drop_Actions)
//setting globals
set Rune_Count = 12
set Rune[0] = 'lmbr'
set Rune[1] = 'guvi'
set Rune[2] = 'tpow'
set Rune[3] = 'tin2'
set Rune[4] = 'tdx2'
set Rune[5] = 'gomn'
set Rune[6] = 'tint'
set Rune[7] = 'texp'
set Rune[8] = 'tdex'
set Rune[9] = 'gold'
set Rune[10] = 'manh'
set Rune[11] = 'rre1'
//set Rune[6] = 'rdis'
//set Rune[7] = 'rre1'
set Rune_Regions_Count = 20
set Rune_RegionsX[0] = GetRectCenterX(gg_rct_Rune_Top_Left)
set Rune_RegionsY[0] = GetRectCenterY(gg_rct_Rune_Top_Left)
set Rune_RegionsX[1] = GetRectCenterX(gg_rct_Rune_Top_Left_Middle)
set Rune_RegionsY[1] = GetRectCenterY(gg_rct_Rune_Top_Left_Middle)
set Rune_RegionsX[2] = GetRectCenterX(gg_rct_Rune_Top_Left_Corner)
set Rune_RegionsY[2] = GetRectCenterY(gg_rct_Rune_Top_Left_Corner)
set Rune_RegionsX[3] = GetRectCenterX(gg_rct_Rune_Top_Left_Add_1)
set Rune_RegionsY[3] = GetRectCenterY(gg_rct_Rune_Top_Left_Add_1)
set Rune_RegionsX[4] = GetRectCenterX(gg_rct_Rune_Top_Left_Add_2)
set Rune_RegionsY[4] = GetRectCenterY(gg_rct_Rune_Top_Left_Add_2)
set Rune_RegionsX[5] = GetRectCenterX(gg_rct_Rune_Top_Right)
set Rune_RegionsY[5] = GetRectCenterY(gg_rct_Rune_Top_Right)
set Rune_RegionsX[6] = GetRectCenterX(gg_rct_Rune_Top_Right_Middle)
set Rune_RegionsY[6] = GetRectCenterY(gg_rct_Rune_Top_Right_Middle)
set Rune_RegionsX[7] = GetRectCenterX(gg_rct_Rune_Top_Right_Corner)
set Rune_RegionsY[7] = GetRectCenterY(gg_rct_Rune_Top_Right_Corner)
set Rune_RegionsX[8] = GetRectCenterX(gg_rct_Rune_Top_Right_Add_1)
set Rune_RegionsY[8] = GetRectCenterY(gg_rct_Rune_Top_Right_Add_1)
set Rune_RegionsX[9] = GetRectCenterX(gg_rct_Rune_Top_Right_Add_2)
set Rune_RegionsY[9] = GetRectCenterY(gg_rct_Rune_Top_Right_Add_2)
set Rune_RegionsX[10] = GetRectCenterX(gg_rct_Rune_Bottom_Right)
set Rune_RegionsY[10] = GetRectCenterY(gg_rct_Rune_Bottom_Right)
set Rune_RegionsX[11] = GetRectCenterX(gg_rct_Rune_Bottom_Right_Middle)
set Rune_RegionsY[11] = GetRectCenterY(gg_rct_Rune_Bottom_Right_Middle)
set Rune_RegionsX[12] = GetRectCenterX(gg_rct_Rune_Bottom_Right_Corner)
set Rune_RegionsY[12] = GetRectCenterY(gg_rct_Rune_Bottom_Right_Corner)
set Rune_RegionsX[13] = GetRectCenterX(gg_rct_Rune_Bottom_Right_Add_1)
set Rune_RegionsY[13] = GetRectCenterY(gg_rct_Rune_Bottom_Right_Add_1)
set Rune_RegionsX[14] = GetRectCenterX(gg_rct_Rune_Bottom_Right_Add_2)
set Rune_RegionsY[14] = GetRectCenterY(gg_rct_Rune_Bottom_Right_Add_2)
set Rune_RegionsX[15] = GetRectCenterX(gg_rct_Rune_Bottom_Left)
set Rune_RegionsY[15] = GetRectCenterY(gg_rct_Rune_Bottom_Left)
set Rune_RegionsX[16] = GetRectCenterX(gg_rct_Rune_Bottom_Left_Middle)
set Rune_RegionsY[16] = GetRectCenterY(gg_rct_Rune_Bottom_Left_Middle)
set Rune_RegionsX[17] = GetRectCenterX(gg_rct_Rune_Bottom_Left_Corner)
set Rune_RegionsY[17] = GetRectCenterY(gg_rct_Rune_Bottom_Left_Corner)
set Rune_RegionsX[18] = GetRectCenterX(gg_rct_Rune_Bottom_Left_Add_1)
set Rune_RegionsY[18] = GetRectCenterY(gg_rct_Rune_Bottom_Left_Add_1)
set Rune_RegionsX[19] = GetRectCenterX(gg_rct_Rune_Bottom_Left_Add_2)
set Rune_RegionsY[19] = GetRectCenterY(gg_rct_Rune_Bottom_Left_Add_2)
set Rune_Top_Left_Taken = true
set Rune_Top_Left_Middle_Taken = true
set Rune_Top_Left_Corner_Taken = true
set Rune_Top_Left_Add_1_Taken = true
set Rune_Top_Left_Add_2_Taken = true
set Rune_Top_Right_Taken = true
set Rune_Top_Right_Middle_Taken = true
set Rune_Top_Right_Corner_Taken = true
set Rune_Top_Right_Add_1_Taken = true
set Rune_Top_Right_Add_2_Taken = true
set Rune_Bottom_Right_Taken = true
set Rune_Bottom_Right_Middle_Taken = true
set Rune_Bottom_Right_Corner_Taken = true
set Rune_Bottom_Right_Add_1_Taken = true
set Rune_Bottom_Right_Add_2_Taken = true
set Rune_Bottom_Left_Taken = true
set Rune_Bottom_Left_Middle_Taken = true
set Rune_Bottom_Left_Corner_Taken = true
set Rune_Bottom_Left_Add_1_Taken = true
set Rune_Bottom_Left_Add_2_Taken = true
set Rune_Top_Left = null
set Rune_Top_Left_Middle = null
set Rune_Top_Left_Corner = null
set Rune_Top_Left_Add_1 = null
set Rune_Top_Left_Add_2 = null
set Rune_Top_Right = null
set Rune_Top_Right_Middle = null
set Rune_Top_Right_Corner = null
set Rune_Top_Right_Add_1 = null
set Rune_Top_Right_Add_2 = null
set Rune_Bottom_Right = null
set Rune_Bottom_Right_Middle = null
set Rune_Bottom_Right_Corner = null
set Rune_Bottom_Right_Add_1 = null
set Rune_Bottom_Right_Add_2 = null
set Rune_Bottom_Left = null
set Rune_Bottom_Left_Middle = null
set Rune_Bottom_Left_Corner = null
set Rune_Bottom_Left_Add_1 = null
set Rune_Bottom_Left_Add_2 = null
endfunction
endscope
//TESH.scrollpos=3
//TESH.alwaysfold=0
scope CombineChargedItems initializer Init
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local item takenItem = GetManipulatedItem()
local integer itemType = GetItemTypeId(takenItem)
local integer itemCharge = GetItemCharges(takenItem)
local unit taker = GetManipulatingUnit()
local integer max = 0
local integer i = 0
local item cItem = null
local integer cType = 0
local integer cCharge = 0
local integer charges = 0
if(GetItemTypeId(takenItem) == 'phea' or /*
*/GetItemTypeId(takenItem) == 'pman' or /*
*/GetItemTypeId(takenItem) == 'pnvu') then
set max = Combine_Potion_Charges_Max
else
set max = Combine_Charges_Max
endif
loop
exitwhen(i > bj_MAX_INVENTORY)
set cItem = UnitItemInSlot(taker, i)
set cType = GetItemTypeId(cItem)
set cCharge = GetItemCharges(cItem)
if(cItem != takenItem) then
if(itemType == cType) then
if(cCharge + itemCharge <= max) then
set charges = cCharge + itemCharge
call SetItemCharges(cItem, charges)
call RemoveItem(takenItem)
set i = 7
endif
endif
endif
set i = i + 1
endloop
set takenItem = null
set taker = null
set cItem = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local item pickedItem = GetManipulatedItem()
local integer itemType = GetItemTypeId(pickedItem)
local boolean exist = false
local integer i = 0
if(GetItemType(pickedItem) == ITEM_TYPE_CHARGED) then
loop
exitwhen(i >= Total_Combine_Charge_Item)
if(itemType == Combine_Charge_Item[i]) then
set exist = true
set i = Total_Combine_Charge_Item
endif
set i = i + 1
endloop
endif
if(exist) then
set exist = exist and GetItemCharges(pickedItem) > 0
set pickedItem = null
return Combine_Charged_Items == true and (exist)
else
set pickedItem = null
return exist
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger CombineChargedItemsTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(CombineChargedItemsTrg, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(CombineChargedItemsTrg, Condition(function Conditions))
call TriggerAddAction(CombineChargedItemsTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=1880
//TESH.alwaysfold=0
scope UpgradeItem initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant string EFFECT = "Abilities\\Spells\\Items\\AIlm\\AIlmTarget.mdl"
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
//----------------------------------------------------------------
globals
private integer array upgrader[120][2]
private integer array combineId[8]
private integer totalCombine
private integer array listItemUpgrade[120]
private integer array listItemLevel[120]
endglobals
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit picker = GetTriggerUnit()
local integer pickerID = GetUnitUserData(picker)
local item itemPicked = GetManipulatedItem()
local integer i = 0
local integer j = 0
local integer k = 0
local item itemF = null
local integer itemID = 0
local integer loadID = 0
local boolean combine = false
local integer charge = 0
local player owner = GetOwningPlayer(picker)
local integer ownerId = GetPlayerId(owner)
set i = 0
loop
exitwhen(i >= totalCombine)
set j = 0
loop
exitwhen(j >= 2)
set upgrader[i][j] = 0
set j = j + 1
endloop
set i = i + 1
endloop
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(picker, i)
if(itemF != null) then
set itemID = GetItemTypeId(itemF)
if(itemID == 'stwp') then //Scroll of Damage
set upgrader[0][1] = itemID
set upgrader[3][1] = itemID
set upgrader[7][1] = itemID
set upgrader[8][1] = itemID
set upgrader[12][1] = itemID
set upgrader[15][1] = itemID
set upgrader[17][1] = itemID
elseif(itemID == 'rat6') then //Sturdy War Axe
set upgrader[0][0] = itemID
if(upgrader[1][0] == itemID) then
set upgrader[1][1] = itemID
else
set upgrader[1][0] = itemID
endif
elseif(itemID == 'I00N') then //Mortise Timbercutter
set upgrader[2][0] = itemID
set upgrader[19][1] = itemID
elseif(itemID == 'prvt') then //Periapt of Vitality
set upgrader[2][1] = itemID
set upgrader[2][1] = itemID
if(upgrader[20][0] == itemID) then
set upgrader[20][1] = itemID
else
set upgrader[20][0] = itemID
endif
elseif(itemID == 'I01B') then //Chromium Arch
set upgrader[3][0] = itemID
set upgrader[93][1] = itemID
elseif(itemID == 'I01A') then //Fatal Cleaver
set upgrader[4][1] = itemID
elseif(itemID == 'I00G') then //Guardian's Helm
set upgrader[4][0] = itemID
set upgrader[43][1] = itemID
set upgrader[44][0] = itemID
elseif(itemID == 'ratc') then //Ironcraft Sword
if(upgrader[5][0] == itemID) then
set upgrader[5][1] = itemID
else
set upgrader[5][0] = itemID
endif
set upgrader[106][0] = itemID
elseif(itemID == 'I00P') then //Razorpoint Blade
if(upgrader[6][0] == itemID) then
set upgrader[6][1] = itemID
else
set upgrader[6][0] = itemID
endif
set upgrader[7][0] = itemID
set upgrader[14][1] = itemID
elseif(itemID == 'I000') then //Sharpend Javelin
set upgrader[8][0] = itemID
if(upgrader[10][0] == itemID) then
set upgrader[10][1] = itemID
else
set upgrader[10][0] = itemID
endif
elseif(itemID == 'I00R') then //Aztez Spear
if(upgrader[9][0] == itemID) then
set upgrader[9][1] = itemID
else
set upgrader[9][0] = itemID
endif
elseif(itemID == 'I001') then //Coral Spire
if(upgrader[11][0] == itemID) then
set upgrader[11][1] = itemID
else
set upgrader[11][0] = itemID
endif
elseif(itemID == 'rat9') then //Stoneforge Hammer
set upgrader[12][0] = itemID
set upgrader[54][1] = itemID
set upgrader[81][1] = itemID
elseif(itemID == 'I00T') then //Hardspike Beetle
if(upgrader[13][0] == itemID) then
set upgrader[13][1] = itemID
else
set upgrader[13][0] = itemID
endif
elseif(itemID == 'I00S') then //Truepierce Lance
set upgrader[14][0] = itemID
elseif(itemID == 'I003') then //Bronzesteel Knife
set upgrader[15][0] = itemID
set upgrader[19][0] = itemID
elseif(itemID == 'I006') then //Baneriven Dagger
if(upgrader[16][0] == itemID) then
set upgrader[16][1] = itemID
else
set upgrader[16][0] = itemID
endif
set upgrader[17][0] = itemID
elseif(itemID == 'I010') then //Venomwax Fang
set upgrader[18][0] = itemID
set upgrader[107][1] = itemID
elseif(itemID == 'I013') then //Silverlight Toucher
set upgrader[18][1] = itemID
set upgrader[73][1] = itemID
set upgrader[74][1] = itemID
elseif(itemID == 'shea') then //Scroll of Life
set upgrader[21][1] = itemID
set upgrader[37][1] = itemID
elseif(itemID == 'rhth') then //Zemi of Eternal
set upgrader[21][0] = itemID
set upgrader[32][1] = itemID
set upgrader[104][1] = itemID
elseif(itemID == 'penr') then //Gratify Rosary
if(upgrader[22][0] == itemID) then
set upgrader[22][1] = itemID
else
set upgrader[22][0] = itemID
endif
set upgrader[97][0] = itemID
elseif(itemID == 'sres') then //Scroll of Battle
set upgrader[23][1] = itemID
elseif(itemID == 'gcel') then //Gauntlet of Brawler
set upgrader[23][0] = itemID
set upgrader[25][0] = itemID
if(upgrader[24][0] == itemID) then
set upgrader[24][1] = itemID
else
set upgrader[24][0] = itemID
endif
elseif(itemID == 'rlif') then //Runical Ring
set upgrader[25][1] = itemID
if(upgrader[27][0] == itemID) then
set upgrader[27][1] = itemID
else
set upgrader[27][0] = itemID
endif
elseif(itemID == 'I008') then //Mania Cestus
if(upgrader[26][0] == itemID) then
set upgrader[26][1] = itemID
else
set upgrader[26][0] = itemID
endif
elseif(itemID == 'rwiz') then //Amethyst Ring
set upgrader[28][0] = itemID
set upgrader[57][1] = itemID
if(upgrader[63][0] == itemID) then
set upgrader[63][1] = itemID
else
set upgrader[63][0] = itemID
endif
elseif(itemID == 'rag1') then //Walking Slippers
if(upgrader[29][0] == itemID) then
set upgrader[29][1] = itemID
else
set upgrader[29][0] = itemID
endif
set upgrader[33][0] = itemID
elseif(itemID == 'I017') then //Platinum Splinter
if(upgrader[31][0] == itemID) then
set upgrader[31][1] = itemID
else
set upgrader[31][0] = itemID
endif
set upgrader[108][1] = itemID
elseif(itemID == 'I00H') then //Warmarcher
set upgrader[30][0] = itemID
set upgrader[32][0] = itemID
elseif(itemID == 'shas') then //Scroll of Speed
set upgrader[30][1] = itemID
set upgrader[33][1] = itemID
elseif(itemID == 'I00K') then //Expidition Boots
if(upgrader[36][0] == itemID) then
set upgrader[36][1] = itemID
else
set upgrader[36][0] = itemID
endif
set upgrader[54][0] = itemID
elseif(itemID == 'rst1') then //Hypergloves
set upgrader[35][1] = itemID
set upgrader[108][0] = itemID
elseif(itemID == 'I00A') then //Aurelian Ring
set upgrader[37][0] = itemID
set upgrader[44][1] = itemID
set upgrader[46][1] = itemID
elseif(itemID == 'bspd') then //Boots of Speed
if(upgrader[34][0] == itemID) then
set upgrader[34][1] = itemID
else
set upgrader[34][0] = itemID
endif
set upgrader[35][0] = itemID
set upgrader[45][1] = itemID
elseif(itemID == 'pmna') then //Pendant of Innerforce
set upgrader[38][0] = itemID
set upgrader[97][1] = itemID
elseif(itemID == 'sman') then //Scroll of Mana
set upgrader[38][1] = itemID
set upgrader[28][1] = itemID
set upgrader[98][1] = itemID
elseif(itemID == 'bgst') then //Valor Front
if(upgrader[39][0] == itemID) then
set upgrader[39][1] = itemID
else
set upgrader[39][0] = itemID
endif
set upgrader[41][0] = itemID
elseif(itemID == 'I00F') then //Tribal Headdress
if(upgrader[40][0] == itemID) then
set upgrader[40][1] = itemID
else
set upgrader[40][0] = itemID
endif
set upgrader[46][0] = itemID
set upgrader[59][1] = itemID
elseif(itemID == 'srrc') then //Scroll of Mighty
set upgrader[41][1] = itemID
set upgrader[42][1] = itemID
elseif(itemID == 'modt') then //Scourge Visor
set upgrader[42][0] = itemID
set upgrader[43][0] = itemID
elseif(itemID == 'I01F') then //Ataraxia Sparta
set upgrader[45][0] = itemID
elseif(itemID == 'ward') then //Drum of Horde
if(upgrader[47][0] == itemID) then
set upgrader[47][1] = itemID
else
set upgrader[47][0] = itemID
endif
elseif(itemID == 'belv') then //Bracer of Bold
if(upgrader[48][0] == itemID) then
set upgrader[48][1] = itemID
else
set upgrader[48][0] = itemID
endif
set upgrader[89][0] = itemID
elseif(itemID == 'I00C') then //Amulet of Dexterity
if(upgrader[49][0] == itemID) then
set upgrader[49][1] = itemID
else
set upgrader[49][0] = itemID
endif
set upgrader[50][0] = itemID
set upgrader[74][0] = itemID
elseif(itemID == 'sror') then //Scroll of Potency
set upgrader[50][1] = itemID
set upgrader[52][1] = itemID
set upgrader[89][1] = itemID
set upgrader[91][1] = itemID
elseif(itemID == 'evtl') then //Talisman of Evasion
if(upgrader[51][0] == itemID) then
set upgrader[51][1] = itemID
else
set upgrader[51][0] = itemID
endif
elseif(itemID == 'I00D') then //Assassin Hood
set upgrader[52][0] = itemID
set upgrader[105][1] = itemID
elseif(itemID == 'I01I') then //Cloak of Shadow
set upgrader[53][0] = itemID
elseif(itemID == 'I01X') then //Oversurge
set upgrader[53][1] = itemID
elseif(itemID == 'rin1') then //Circlet of Intelligence
if(upgrader[55][0] == itemID) then
set upgrader[55][1] = itemID
else
set upgrader[55][0] = itemID
endif
set upgrader[90][1] = itemID
elseif(itemID == 'ciri') then //Firstmind Necklace
if(upgrader[56][0] == itemID) then
set upgrader[56][1] = itemID
else
set upgrader[56][0] = itemID
endif
set upgrader[59][0] = itemID
set upgrader[73][0] = itemID
elseif(itemID == 'I00I') then //Acolyte Mantle
set upgrader[57][0] = itemID
set upgrader[88][1] = itemID
elseif(itemID == 'I00I') then //Astrallian Robe
set upgrader[58][0] = itemID
elseif(itemID == 'sand') then //Scroll of Experty
set upgrader[58][1] = itemID
elseif(itemID == 'cnob') then //Horn of Prominence
if(upgrader[60][0] == itemID) then
set upgrader[60][1] = itemID
else
set upgrader[60][0] = itemID
endif
set upgrader[71][1] = itemID
elseif(itemID == 'mcou') then //Ankh of Virtue
if(upgrader[61][0] == itemID) then
set upgrader[61][1] = itemID
else
set upgrader[61][0] = itemID
endif
set upgrader[66][0] = itemID
set upgrader[106][1] = itemID
elseif(itemID == 'kpin') then //Medallion of Talent
set upgrader[62][0] = itemID
set upgrader[96][0] = itemID
set upgrader[101][1] = itemID
elseif(itemID == 'rej5') then //Scroll of Power
set upgrader[62][1] = itemID
elseif(itemID == 'stel') then //Magical Stick
if(upgrader[64][0] == itemID) then
set upgrader[64][1] = itemID
else
set upgrader[64][0] = itemID
endif
set upgrader[67][0] = itemID
set upgrader[71][0] = itemID
elseif(itemID == 'I00L') then //Twinkle Rod
if(upgrader[65][0] == itemID) then
set upgrader[65][1] = itemID
else
set upgrader[65][0] = itemID
endif
set upgrader[68][0] = itemID
elseif(itemID == 'I01Z') then //Zestflux
set upgrader[66][1] = itemID
set upgrader[99][1] = itemID
elseif(itemID == 'rej6') then //Scroll of Magic
set upgrader[67][1] = itemID
set upgrader[68][1] = itemID
set upgrader[69][1] = itemID
set upgrader[70][1] = itemID
elseif(itemID == 'I00M') then //Mystic Wand
set upgrader[69][0] = itemID
set upgrader[88][0] = itemID
set upgrader[100][1] = itemID
elseif(itemID == 'I01O') then //Bloodeye Lynch
set upgrader[70][0] = itemID
elseif(itemID == 'I01Q') then //Book of Spirit
if(upgrader[72][0] == itemID) then
set upgrader[72][1] = itemID
else
set upgrader[72][0] = itemID
endif
elseif(itemID == 'I00V') then //Retiarius of Glacier
set upgrader[75][0] = itemID
elseif(itemID == 'I004') then //Leather Armor
set upgrader[76][0] = itemID
if(upgrader[79][0] == itemID) then
set upgrader[79][1] = itemID
else
set upgrader[79][0] = itemID
endif
elseif(itemID == 'scul') then //Scroll of Protection
set upgrader[76][1] = itemID
set upgrader[82][1] = itemID
set upgrader[84][1] = itemID
set upgrader[86][1] = itemID
elseif(itemID == 'I020') then //Elven Leafcoat
if(upgrader[77][0] == itemID) then
set upgrader[77][1] = itemID
else
set upgrader[77][0] = itemID
endif
elseif(itemID == 'I022') then //Meridian Stark
if(upgrader[78][0] == itemID) then
set upgrader[78][1] = itemID
else
set upgrader[78][0] = itemID
endif
set upgrader[82][0] = itemID
elseif(itemID == 'I005') then //Plate Mail
set upgrader[80][0] = itemID
set upgrader[81][0] = itemID
elseif(itemID == 'I026') then //Adamantank
set upgrader[80][1] = itemID
elseif(itemID == 'rde1') then //Barrel Buckler
if(upgrader[83][0] == itemID) then
set upgrader[83][1] = itemID
else
set upgrader[83][0] = itemID
endif
set upgrader[84][0] = itemID
elseif(itemID == 'rde2') then //Solid Defense
set upgrader[85][0] = itemID
set upgrader[86][0] = itemID
set upgrader[109][1] = itemID
elseif(itemID == 'rde3') then //Robust Shield
set upgrader[85][1] = itemID
set upgrader[103][1] = itemID
elseif(itemID == 'I01J') then //Lightning Gripper
if(upgrader[87][0] == itemID) then
set upgrader[87][1] = itemID
else
set upgrader[87][0] = itemID
endif
elseif(itemID == 'tels') then //Hunting Scope
set upgrader[90][0] = itemID
set upgrader[91][0] = itemID
elseif(itemID == 'afac') then //Schmidt Scout
if(upgrader[92][0] == itemID) then
set upgrader[92][1] = itemID
else
set upgrader[92][0] = itemID
endif
elseif(itemID == 'I01E') then //Devourer Maw
set upgrader[93][0] = itemID
elseif(itemID == 'mlst') then //Vehemence
if(upgrader[94][0] == itemID) then
set upgrader[94][1] = itemID
else
set upgrader[94][0] = itemID
endif
elseif(itemID == 'I00Y') then //Blight River
if(upgrader[95][0] == itemID) then
set upgrader[95][1] = itemID
else
set upgrader[95][0] = itemID
endif
elseif(itemID == 'odef') then //Eve Feather
set upgrader[98][0] = itemID
set upgrader[100][0] = itemID
elseif(itemID == 'I01N') then //Staff of Flamecurse
set upgrader[99][0] = itemID
elseif(itemID == 'I00Q') then //Edge of Blaze
set upgrader[101][0] = itemID
elseif(itemID == 'I00B') then //Spider Ring
set upgrader[102][0] = itemID
elseif(itemID == 'I01U') then //Royaltouch
set upgrader[102][1] = itemID
elseif(itemID == 'I00Z') then //Goldcast Maccalan
set upgrader[103][0] = itemID
elseif(itemID == 'spsh') then //Dream Sphere
set upgrader[96][1] = itemID
elseif(itemID == 'I01K') then //Void Artifice
set upgrader[109][0] = itemID
elseif(itemID == 'brac') then //Giant Belt
set upgrader[104][0] = itemID
elseif(itemID == 'I012') then //Arcane Heaver
set upgrader[105][0] = itemID
elseif(itemID == 'lhst') then //Shoguns Pride
set upgrader[75][1] = itemID
elseif(itemID == 'I00X') then //Laksamana Keris
set upgrader[107][0] = itemID
endif
endif
set i = i + 1
endloop
set i = 0
loop
exitwhen(i >= totalCombine)
if(listItemLevel[i] > 0) then // <= CategorizeGameLevel()) then
set j = 0
set combine = true
loop
exitwhen(j >= 2)
if(upgrader[i][j] == 0) then
set combine = false
endif
set j = j + 1
endloop
if(combine) then
call DestroyEffect(AddSpecialEffectTarget(EFFECT, picker, "origin"))
set j = 0
loop
exitwhen(j >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(picker, j)
if(itemF != null) then
set itemID = GetItemTypeId(itemF)
set charge = GetItemCharges(itemF)
set k = 0
loop
exitwhen(k >= 2)
set loadID = upgrader[i][k]
if(itemID == loadID and loadID != -1 and loadID != 0) then
set upgrader[i][k] = 0
call UnitRemoveItem(picker, itemF)
//call SetItemVisible(itemF, false)
call RemoveItem(itemF)
set k = bj_MAX_INVENTORY
endif
set k = k + 1
endloop
endif
set j = j + 1
endloop
call UnitAddItemById(picker, listItemUpgrade[i])
set i = totalCombine
endif
endif
set i = i + 1
endloop
set picker = null
set itemPicked = null
set owner = null
set itemF = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit picker = GetTriggerUnit()
local item itemPicked = GetManipulatedItem()
local itemtype itemType = GetItemType(itemPicked)
local boolean allow = false
if(itemType == ITEM_TYPE_PERMANENT or itemType == ITEM_TYPE_CHARGED) then
call Item_SetId(itemPicked)
set allow = Item_OwningConditions(picker, itemPicked)
endif
set itemPicked = null
set picker = null
set itemPicked = null
return allow
endfunction
//----------------------------------------------------------------
private function Order_Actions takes nothing returns nothing
local unit ordered = GetTriggerUnit()
local integer orderedID = GetUnitUserData(ordered)
local item itemOrdered = GetOrderTargetItem()
local integer i = 0
local integer j = 0
local integer k = 0
local item itemF = null
local integer itemID = 0
local integer loadID = 0
local boolean combine = false
local integer charge = 0
local player owner = GetOwningPlayer(ordered)
local integer ownerId = GetPlayerId(owner)
set i = 0
loop
exitwhen(i >= totalCombine)
set j = 0
loop
exitwhen(j >= 2)
set upgrader[i][j] = 0
set j = j + 1
endloop
set i = i + 1
endloop
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY + 1)
if(i == bj_MAX_INVENTORY) then
set itemF = itemOrdered
else
set itemF = UnitItemInSlot(ordered, i)
endif
if(itemF != null) then
set itemID = GetItemTypeId(itemF)
if(itemID == 'stwp') then //Scroll of Damage
set upgrader[0][1] = itemID
set upgrader[3][1] = itemID
set upgrader[7][1] = itemID
set upgrader[8][1] = itemID
set upgrader[12][1] = itemID
set upgrader[15][1] = itemID
set upgrader[17][1] = itemID
elseif(itemID == 'rat6') then //Sturdy War Axe
set upgrader[0][0] = itemID
if(upgrader[1][0] == itemID) then
set upgrader[1][1] = itemID
else
set upgrader[1][0] = itemID
endif
elseif(itemID == 'I00N') then //Mortise Timbercutter
set upgrader[2][0] = itemID
set upgrader[19][1] = itemID
elseif(itemID == 'prvt') then //Periapt of Vitality
set upgrader[2][1] = itemID
set upgrader[2][1] = itemID
if(upgrader[20][0] == itemID) then
set upgrader[20][1] = itemID
else
set upgrader[20][0] = itemID
endif
elseif(itemID == 'I01B') then //Chromium Arch
set upgrader[3][0] = itemID
set upgrader[93][1] = itemID
elseif(itemID == 'I01A') then //Fatal Cleaver
set upgrader[4][1] = itemID
elseif(itemID == 'I00G') then //Guardian's Helm
set upgrader[4][0] = itemID
set upgrader[43][1] = itemID
set upgrader[44][0] = itemID
elseif(itemID == 'ratc') then //Ironcraft Sword
if(upgrader[5][0] == itemID) then
set upgrader[5][1] = itemID
else
set upgrader[5][0] = itemID
endif
set upgrader[106][0] = itemID
elseif(itemID == 'I00P') then //Razorpoint Blade
if(upgrader[6][0] == itemID) then
set upgrader[6][1] = itemID
else
set upgrader[6][0] = itemID
endif
set upgrader[7][0] = itemID
set upgrader[14][1] = itemID
elseif(itemID == 'I000') then //Sharpend Javelin
set upgrader[8][0] = itemID
if(upgrader[10][0] == itemID) then
set upgrader[10][1] = itemID
else
set upgrader[10][0] = itemID
endif
elseif(itemID == 'I00R') then //Aztez Spear
if(upgrader[9][0] == itemID) then
set upgrader[9][1] = itemID
else
set upgrader[9][0] = itemID
endif
elseif(itemID == 'I001') then //Coral Spire
if(upgrader[11][0] == itemID) then
set upgrader[11][1] = itemID
else
set upgrader[11][0] = itemID
endif
elseif(itemID == 'rat9') then //Stoneforge Hammer
set upgrader[12][0] = itemID
set upgrader[54][1] = itemID
set upgrader[81][1] = itemID
elseif(itemID == 'I00T') then //Hardspike Beetle
if(upgrader[13][0] == itemID) then
set upgrader[13][1] = itemID
else
set upgrader[13][0] = itemID
endif
elseif(itemID == 'I00S') then //Truepierce Lance
set upgrader[14][0] = itemID
elseif(itemID == 'I003') then //Bronzesteel Knife
set upgrader[15][0] = itemID
set upgrader[19][0] = itemID
elseif(itemID == 'I006') then //Baneriven Dagger
if(upgrader[16][0] == itemID) then
set upgrader[16][1] = itemID
else
set upgrader[16][0] = itemID
endif
set upgrader[17][0] = itemID
elseif(itemID == 'I010') then //Venomwax Fang
set upgrader[18][0] = itemID
set upgrader[107][1] = itemID
elseif(itemID == 'I013') then //Silverlight Toucher
set upgrader[18][1] = itemID
set upgrader[73][1] = itemID
set upgrader[74][1] = itemID
elseif(itemID == 'shea') then //Scroll of Life
set upgrader[21][1] = itemID
set upgrader[37][1] = itemID
elseif(itemID == 'rhth') then //Zemi of Eternal
set upgrader[21][0] = itemID
set upgrader[32][1] = itemID
set upgrader[104][1] = itemID
elseif(itemID == 'penr') then //Gratify Rosary
if(upgrader[22][0] == itemID) then
set upgrader[22][1] = itemID
else
set upgrader[22][0] = itemID
endif
set upgrader[97][0] = itemID
elseif(itemID == 'sres') then //Scroll of Battle
set upgrader[23][1] = itemID
elseif(itemID == 'gcel') then //Gauntlet of Brawler
set upgrader[23][0] = itemID
set upgrader[25][0] = itemID
if(upgrader[24][0] == itemID) then
set upgrader[24][1] = itemID
else
set upgrader[24][0] = itemID
endif
elseif(itemID == 'rlif') then //Runical Ring
set upgrader[25][1] = itemID
if(upgrader[27][0] == itemID) then
set upgrader[27][1] = itemID
else
set upgrader[27][0] = itemID
endif
elseif(itemID == 'I008') then //Mania Cestus
if(upgrader[26][0] == itemID) then
set upgrader[26][1] = itemID
else
set upgrader[26][0] = itemID
endif
elseif(itemID == 'rwiz') then //Amethyst Ring
set upgrader[28][0] = itemID
set upgrader[57][1] = itemID
if(upgrader[63][0] == itemID) then
set upgrader[63][1] = itemID
else
set upgrader[63][0] = itemID
endif
elseif(itemID == 'rag1') then //Walking Slippers
if(upgrader[29][0] == itemID) then
set upgrader[29][1] = itemID
else
set upgrader[29][0] = itemID
endif
set upgrader[33][0] = itemID
elseif(itemID == 'I017') then //Platinum Splinter
if(upgrader[31][0] == itemID) then
set upgrader[31][1] = itemID
else
set upgrader[31][0] = itemID
endif
set upgrader[108][1] = itemID
elseif(itemID == 'I00H') then //Warmarcher
set upgrader[30][0] = itemID
set upgrader[32][0] = itemID
elseif(itemID == 'shas') then //Scroll of Speed
set upgrader[30][1] = itemID
set upgrader[33][1] = itemID
elseif(itemID == 'I00K') then //Expidition Boots
if(upgrader[36][0] == itemID) then
set upgrader[36][1] = itemID
else
set upgrader[36][0] = itemID
endif
set upgrader[54][0] = itemID
elseif(itemID == 'rst1') then //Hypergloves
set upgrader[35][1] = itemID
set upgrader[108][0] = itemID
elseif(itemID == 'I00A') then //Aurelian Ring
set upgrader[37][0] = itemID
set upgrader[44][1] = itemID
set upgrader[46][1] = itemID
elseif(itemID == 'bspd') then //Boots of Speed
if(upgrader[34][0] == itemID) then
set upgrader[34][1] = itemID
else
set upgrader[34][0] = itemID
endif
set upgrader[35][0] = itemID
set upgrader[45][1] = itemID
elseif(itemID == 'pmna') then //Pendant of Innerforce
set upgrader[38][0] = itemID
set upgrader[97][1] = itemID
elseif(itemID == 'sman') then //Scroll of Mana
set upgrader[38][1] = itemID
set upgrader[28][1] = itemID
set upgrader[98][1] = itemID
elseif(itemID == 'bgst') then //Valor Front
if(upgrader[39][0] == itemID) then
set upgrader[39][1] = itemID
else
set upgrader[39][0] = itemID
endif
set upgrader[41][0] = itemID
elseif(itemID == 'I00F') then //Tribal Headdress
if(upgrader[40][0] == itemID) then
set upgrader[40][1] = itemID
else
set upgrader[40][0] = itemID
endif
set upgrader[46][0] = itemID
set upgrader[59][1] = itemID
elseif(itemID == 'srrc') then //Scroll of Mighty
set upgrader[41][1] = itemID
set upgrader[42][1] = itemID
elseif(itemID == 'modt') then //Scourge Visor
set upgrader[42][0] = itemID
set upgrader[43][0] = itemID
elseif(itemID == 'I01F') then //Ataraxia Sparta
set upgrader[45][0] = itemID
elseif(itemID == 'ward') then //Drum of Horde
if(upgrader[47][0] == itemID) then
set upgrader[47][1] = itemID
else
set upgrader[47][0] = itemID
endif
elseif(itemID == 'belv') then //Bracer of Bold
if(upgrader[48][0] == itemID) then
set upgrader[48][1] = itemID
else
set upgrader[48][0] = itemID
endif
set upgrader[89][0] = itemID
elseif(itemID == 'I00C') then //Amulet of Dexterity
if(upgrader[49][0] == itemID) then
set upgrader[49][1] = itemID
else
set upgrader[49][0] = itemID
endif
set upgrader[50][0] = itemID
set upgrader[74][0] = itemID
elseif(itemID == 'sror') then //Scroll of Potency
set upgrader[50][1] = itemID
set upgrader[52][1] = itemID
set upgrader[89][1] = itemID
set upgrader[91][1] = itemID
elseif(itemID == 'evtl') then //Talisman of Evasion
if(upgrader[51][0] == itemID) then
set upgrader[51][1] = itemID
else
set upgrader[51][0] = itemID
endif
elseif(itemID == 'I00D') then //Assassin Hood
set upgrader[52][0] = itemID
set upgrader[105][1] = itemID
elseif(itemID == 'I01I') then //Cloak of Shadow
set upgrader[53][0] = itemID
elseif(itemID == 'I01X') then //Oversurge
set upgrader[53][1] = itemID
elseif(itemID == 'rin1') then //Circlet of Intelligence
if(upgrader[55][0] == itemID) then
set upgrader[55][1] = itemID
else
set upgrader[55][0] = itemID
endif
set upgrader[90][1] = itemID
elseif(itemID == 'ciri') then //Firstmind Necklace
if(upgrader[56][0] == itemID) then
set upgrader[56][1] = itemID
else
set upgrader[56][0] = itemID
endif
set upgrader[59][0] = itemID
set upgrader[73][0] = itemID
elseif(itemID == 'I00I') then //Acolyte Mantle
set upgrader[57][0] = itemID
set upgrader[88][1] = itemID
elseif(itemID == 'I00I') then //Astrallian Robe
set upgrader[58][0] = itemID
elseif(itemID == 'sand') then //Scroll of Experty
set upgrader[58][1] = itemID
elseif(itemID == 'cnob') then //Horn of Prominence
if(upgrader[60][0] == itemID) then
set upgrader[60][1] = itemID
else
set upgrader[60][0] = itemID
endif
set upgrader[71][1] = itemID
elseif(itemID == 'mcou') then //Ankh of Virtue
if(upgrader[61][0] == itemID) then
set upgrader[61][1] = itemID
else
set upgrader[61][0] = itemID
endif
set upgrader[66][0] = itemID
set upgrader[106][1] = itemID
elseif(itemID == 'kpin') then //Medallion of Talent
set upgrader[62][0] = itemID
set upgrader[96][0] = itemID
set upgrader[101][1] = itemID
elseif(itemID == 'rej5') then //Scroll of Power
set upgrader[62][1] = itemID
elseif(itemID == 'stel') then //Magical Stick
if(upgrader[64][0] == itemID) then
set upgrader[64][1] = itemID
else
set upgrader[64][0] = itemID
endif
set upgrader[67][0] = itemID
set upgrader[71][0] = itemID
elseif(itemID == 'I00L') then //Twinkle Rod
if(upgrader[65][0] == itemID) then
set upgrader[65][1] = itemID
else
set upgrader[65][0] = itemID
endif
set upgrader[68][0] = itemID
elseif(itemID == 'I01Z') then //Zestflux
set upgrader[66][1] = itemID
set upgrader[99][1] = itemID
elseif(itemID == 'rej6') then //Scroll of Magic
set upgrader[67][1] = itemID
set upgrader[68][1] = itemID
set upgrader[69][1] = itemID
set upgrader[70][1] = itemID
elseif(itemID == 'I00M') then //Mystic Wand
set upgrader[69][0] = itemID
set upgrader[88][0] = itemID
set upgrader[100][1] = itemID
elseif(itemID == 'I01O') then //Bloodeye Lynch
set upgrader[70][0] = itemID
elseif(itemID == 'I01Q') then //Book of Spirit
if(upgrader[72][0] == itemID) then
set upgrader[72][1] = itemID
else
set upgrader[72][0] = itemID
endif
elseif(itemID == 'I00V') then //Retiarius of Glacier
set upgrader[75][0] = itemID
elseif(itemID == 'I004') then //Leather Armor
set upgrader[76][0] = itemID
if(upgrader[79][0] == itemID) then
set upgrader[79][1] = itemID
else
set upgrader[79][0] = itemID
endif
elseif(itemID == 'scul') then //Scroll of Protection
set upgrader[76][1] = itemID
set upgrader[82][1] = itemID
set upgrader[84][1] = itemID
set upgrader[86][1] = itemID
elseif(itemID == 'I020') then //Elven Leafcoat
if(upgrader[77][0] == itemID) then
set upgrader[77][1] = itemID
else
set upgrader[77][0] = itemID
endif
elseif(itemID == 'I022') then //Meridian Stark
if(upgrader[78][0] == itemID) then
set upgrader[78][1] = itemID
else
set upgrader[78][0] = itemID
endif
set upgrader[82][0] = itemID
elseif(itemID == 'I005') then //Plate Mail
set upgrader[80][0] = itemID
set upgrader[81][0] = itemID
elseif(itemID == 'I026') then //Adamantank
set upgrader[80][1] = itemID
elseif(itemID == 'rde1') then //Barrel Buckler
if(upgrader[83][0] == itemID) then
set upgrader[83][1] = itemID
else
set upgrader[83][0] = itemID
endif
set upgrader[84][0] = itemID
elseif(itemID == 'rde2') then //Solid Defense
set upgrader[85][0] = itemID
set upgrader[86][0] = itemID
set upgrader[109][1] = itemID
elseif(itemID == 'rde3') then //Robust Shield
set upgrader[85][1] = itemID
set upgrader[103][1] = itemID
elseif(itemID == 'I01J') then //Lightning Gripper
if(upgrader[87][0] == itemID) then
set upgrader[87][1] = itemID
else
set upgrader[87][0] = itemID
endif
elseif(itemID == 'tels') then //Hunting Scope
set upgrader[90][0] = itemID
set upgrader[91][0] = itemID
elseif(itemID == 'afac') then //Schmidt Scout
if(upgrader[92][0] == itemID) then
set upgrader[92][1] = itemID
else
set upgrader[92][0] = itemID
endif
elseif(itemID == 'I01E') then //Devourer Maw
set upgrader[93][0] = itemID
elseif(itemID == 'mlst') then //Vehemence
if(upgrader[94][0] == itemID) then
set upgrader[94][1] = itemID
else
set upgrader[94][0] = itemID
endif
elseif(itemID == 'I00Y') then //Blight River
if(upgrader[95][0] == itemID) then
set upgrader[95][1] = itemID
else
set upgrader[95][0] = itemID
endif
elseif(itemID == 'odef') then //Eve Feather
set upgrader[98][0] = itemID
set upgrader[100][0] = itemID
elseif(itemID == 'I01N') then //Staff of Flamecurse
set upgrader[99][0] = itemID
elseif(itemID == 'I00Q') then //Edge of Blaze
set upgrader[101][0] = itemID
elseif(itemID == 'I00B') then //Spider Ring
set upgrader[102][0] = itemID
elseif(itemID == 'I01U') then //Royaltouch
set upgrader[102][1] = itemID
elseif(itemID == 'I00Z') then //Goldcast Maccalan
set upgrader[103][0] = itemID
elseif(itemID == 'spsh') then //Dream Sphere
set upgrader[96][1] = itemID
elseif(itemID == 'I01K') then //Void Artifice
set upgrader[109][0] = itemID
elseif(itemID == 'brac') then //Giant Belt
set upgrader[104][0] = itemID
elseif(itemID == 'I012') then //Arcane Heaver
set upgrader[105][0] = itemID
elseif(itemID == 'lhst') then //Shoguns Pride
set upgrader[75][1] = itemID
elseif(itemID == 'I00X') then //Laksamana Keris
set upgrader[107][0] = itemID
endif
endif
set i = i + 1
endloop
set i = 0
loop
exitwhen(i >= totalCombine)
if(listItemLevel[i] > 0) then // <= CategorizeGameLevel()) then
set j = 0
set combine = true
loop
exitwhen(j >= 2)
if(upgrader[i][j] == 0) then
set combine = false
endif
set j = j + 1
endloop
if(combine) then
call DestroyEffect(AddSpecialEffectTarget(EFFECT, ordered, "origin"))
set j = 0
loop
exitwhen(j >= bj_MAX_INVENTORY + 1)
if(j == bj_MAX_INVENTORY) then
set itemF = itemOrdered
else
set itemF = UnitItemInSlot(ordered, j)
endif
if(itemF != null) then
set itemID = GetItemTypeId(itemF)
set charge = GetItemCharges(itemF)
set k = 0
loop
exitwhen(k >= 2)
set loadID = upgrader[i][k]
if(itemID == loadID and loadID != -1 and loadID != 0) then
set upgrader[i][k] = 0
if(j == bj_MAX_INVENTORY) then
call UnitRemoveItem(ordered, itemF)
endif
//call SetItemVisible(itemF, false)
call RemoveItem(itemF)
set k = bj_MAX_INVENTORY
endif
set k = k + 1
endloop
endif
set j = j + 1
endloop
call UnitAddItemById(ordered, listItemUpgrade[i])
set i = totalCombine
endif
endif
set i = i + 1
endloop
set ordered = null
set itemOrdered = null
set owner = null
set itemF = null
endfunction
//----------------------------------------------------------------
private function Order_Conditions takes nothing returns boolean
local unit ordered = GetTriggerUnit()
local item itemOrdered = GetOrderTargetItem()
local itemtype itemType = null
local boolean allow = false
local integer i = 0
if(itemOrdered != null) then
set itemType = GetItemType(itemOrdered)
if(itemType == ITEM_TYPE_PERMANENT or itemType == ITEM_TYPE_CHARGED) then
if(not IsItemOwned(itemOrdered)) then
call Item_SetId(itemOrdered)
set allow = Item_OwningConditions(ordered, itemOrdered)
endif
endif
endif
set itemOrdered = null
set ordered = null
set itemType = null
return allow
endfunction
//----------------------------------------------------------------
function Item_Take_Upgrade_Actions takes unit target, item itemTake returns nothing
local integer targetID = GetUnitUserData(target)
local integer i = 0
local integer j = 0
local integer k = 0
local item itemF = null
local integer itemID = 0
local integer loadID = 0
local boolean combine = false
local integer charge = 0
local player owner = GetOwningPlayer(target)
local integer ownerId = GetPlayerId(owner)
set i = 0
loop
exitwhen(i >= totalCombine)
set j = 0
loop
exitwhen(j >= 2)
set upgrader[i][j] = 0
set j = j + 1
endloop
set i = i + 1
endloop
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY + 1)
if(i == bj_MAX_INVENTORY) then
set itemF = itemTake
else
set itemF = UnitItemInSlot(target, i)
endif
if(itemF != null) then
set itemID = GetItemTypeId(itemF)
if(itemID == 'stwp') then //Scroll of Damage
set upgrader[0][1] = itemID
set upgrader[3][1] = itemID
set upgrader[7][1] = itemID
set upgrader[8][1] = itemID
set upgrader[12][1] = itemID
set upgrader[15][1] = itemID
set upgrader[17][1] = itemID
elseif(itemID == 'rat6') then //Sturdy War Axe
set upgrader[0][0] = itemID
if(upgrader[1][0] == itemID) then
set upgrader[1][1] = itemID
else
set upgrader[1][0] = itemID
endif
elseif(itemID == 'I00N') then //Mortise Timbercutter
set upgrader[2][0] = itemID
set upgrader[19][1] = itemID
elseif(itemID == 'prvt') then //Periapt of Vitality
set upgrader[2][1] = itemID
set upgrader[2][1] = itemID
if(upgrader[20][0] == itemID) then
set upgrader[20][1] = itemID
else
set upgrader[20][0] = itemID
endif
elseif(itemID == 'I01B') then //Chromium Arch
set upgrader[3][0] = itemID
set upgrader[93][1] = itemID
elseif(itemID == 'I01A') then //Fatal Cleaver
set upgrader[4][1] = itemID
elseif(itemID == 'I00G') then //Guardian's Helm
set upgrader[4][0] = itemID
set upgrader[43][1] = itemID
set upgrader[44][0] = itemID
elseif(itemID == 'ratc') then //Ironcraft Sword
if(upgrader[5][0] == itemID) then
set upgrader[5][1] = itemID
else
set upgrader[5][0] = itemID
endif
set upgrader[106][0] = itemID
elseif(itemID == 'I00P') then //Razorpoint Blade
if(upgrader[6][0] == itemID) then
set upgrader[6][1] = itemID
else
set upgrader[6][0] = itemID
endif
set upgrader[7][0] = itemID
set upgrader[14][1] = itemID
elseif(itemID == 'I000') then //Sharpend Javelin
set upgrader[8][0] = itemID
if(upgrader[10][0] == itemID) then
set upgrader[10][1] = itemID
else
set upgrader[10][0] = itemID
endif
elseif(itemID == 'I00R') then //Aztez Spear
if(upgrader[9][0] == itemID) then
set upgrader[9][1] = itemID
else
set upgrader[9][0] = itemID
endif
elseif(itemID == 'I001') then //Coral Spire
if(upgrader[11][0] == itemID) then
set upgrader[11][1] = itemID
else
set upgrader[11][0] = itemID
endif
elseif(itemID == 'rat9') then //Stoneforge Hammer
set upgrader[12][0] = itemID
set upgrader[54][1] = itemID
set upgrader[81][1] = itemID
elseif(itemID == 'I00T') then //Hardspike Beetle
if(upgrader[13][0] == itemID) then
set upgrader[13][1] = itemID
else
set upgrader[13][0] = itemID
endif
elseif(itemID == 'I00S') then //Truepierce Lance
set upgrader[14][0] = itemID
elseif(itemID == 'I003') then //Bronzesteel Knife
set upgrader[15][0] = itemID
set upgrader[19][0] = itemID
elseif(itemID == 'I006') then //Baneriven Dagger
if(upgrader[16][0] == itemID) then
set upgrader[16][1] = itemID
else
set upgrader[16][0] = itemID
endif
set upgrader[17][0] = itemID
elseif(itemID == 'I010') then //Venomwax Fang
set upgrader[18][0] = itemID
set upgrader[107][1] = itemID
elseif(itemID == 'I013') then //Silverlight Toucher
set upgrader[18][1] = itemID
set upgrader[73][1] = itemID
set upgrader[74][1] = itemID
elseif(itemID == 'shea') then //Scroll of Life
set upgrader[21][1] = itemID
set upgrader[37][1] = itemID
elseif(itemID == 'rhth') then //Zemi of Eternal
set upgrader[21][0] = itemID
set upgrader[32][1] = itemID
set upgrader[104][1] = itemID
elseif(itemID == 'penr') then //Gratify Rosary
if(upgrader[22][0] == itemID) then
set upgrader[22][1] = itemID
else
set upgrader[22][0] = itemID
endif
set upgrader[97][0] = itemID
elseif(itemID == 'sres') then //Scroll of Battle
set upgrader[23][1] = itemID
elseif(itemID == 'gcel') then //Gauntlet of Brawler
set upgrader[23][0] = itemID
set upgrader[25][0] = itemID
if(upgrader[24][0] == itemID) then
set upgrader[24][1] = itemID
else
set upgrader[24][0] = itemID
endif
elseif(itemID == 'rlif') then //Runical Ring
set upgrader[25][1] = itemID
if(upgrader[27][0] == itemID) then
set upgrader[27][1] = itemID
else
set upgrader[27][0] = itemID
endif
elseif(itemID == 'I008') then //Mania Cestus
if(upgrader[26][0] == itemID) then
set upgrader[26][1] = itemID
else
set upgrader[26][0] = itemID
endif
elseif(itemID == 'rwiz') then //Amethyst Ring
set upgrader[28][0] = itemID
set upgrader[57][1] = itemID
if(upgrader[63][0] == itemID) then
set upgrader[63][1] = itemID
else
set upgrader[63][0] = itemID
endif
elseif(itemID == 'rag1') then //Walking Slippers
if(upgrader[29][0] == itemID) then
set upgrader[29][1] = itemID
else
set upgrader[29][0] = itemID
endif
set upgrader[33][0] = itemID
elseif(itemID == 'I017') then //Platinum Splinter
if(upgrader[31][0] == itemID) then
set upgrader[31][1] = itemID
else
set upgrader[31][0] = itemID
endif
set upgrader[108][1] = itemID
elseif(itemID == 'I00H') then //Warmarcher
set upgrader[30][0] = itemID
set upgrader[32][0] = itemID
elseif(itemID == 'shas') then //Scroll of Speed
set upgrader[30][1] = itemID
set upgrader[33][1] = itemID
elseif(itemID == 'I00K') then //Expidition Boots
if(upgrader[36][0] == itemID) then
set upgrader[36][1] = itemID
else
set upgrader[36][0] = itemID
endif
set upgrader[54][0] = itemID
elseif(itemID == 'rst1') then //Hypergloves
set upgrader[35][1] = itemID
set upgrader[108][0] = itemID
elseif(itemID == 'I00A') then //Aurelian Ring
set upgrader[37][0] = itemID
set upgrader[44][1] = itemID
set upgrader[46][1] = itemID
elseif(itemID == 'bspd') then //Boots of Speed
if(upgrader[34][0] == itemID) then
set upgrader[34][1] = itemID
else
set upgrader[34][0] = itemID
endif
set upgrader[35][0] = itemID
set upgrader[45][1] = itemID
elseif(itemID == 'pmna') then //Pendant of Innerforce
set upgrader[38][0] = itemID
set upgrader[97][1] = itemID
elseif(itemID == 'sman') then //Scroll of Mana
set upgrader[38][1] = itemID
set upgrader[28][1] = itemID
set upgrader[98][1] = itemID
elseif(itemID == 'bgst') then //Valor Front
if(upgrader[39][0] == itemID) then
set upgrader[39][1] = itemID
else
set upgrader[39][0] = itemID
endif
set upgrader[41][0] = itemID
elseif(itemID == 'I00F') then //Tribal Headdress
if(upgrader[40][0] == itemID) then
set upgrader[40][1] = itemID
else
set upgrader[40][0] = itemID
endif
set upgrader[46][0] = itemID
set upgrader[59][1] = itemID
elseif(itemID == 'srrc') then //Scroll of Mighty
set upgrader[41][1] = itemID
set upgrader[42][1] = itemID
elseif(itemID == 'modt') then //Scourge Visor
set upgrader[42][0] = itemID
set upgrader[43][0] = itemID
elseif(itemID == 'I01F') then //Ataraxia Sparta
set upgrader[45][0] = itemID
elseif(itemID == 'ward') then //Drum of Horde
if(upgrader[47][0] == itemID) then
set upgrader[47][1] = itemID
else
set upgrader[47][0] = itemID
endif
elseif(itemID == 'belv') then //Bracer of Bold
if(upgrader[48][0] == itemID) then
set upgrader[48][1] = itemID
else
set upgrader[48][0] = itemID
endif
set upgrader[89][0] = itemID
elseif(itemID == 'I00C') then //Amulet of Dexterity
if(upgrader[49][0] == itemID) then
set upgrader[49][1] = itemID
else
set upgrader[49][0] = itemID
endif
set upgrader[50][0] = itemID
set upgrader[74][0] = itemID
elseif(itemID == 'sror') then //Scroll of Potency
set upgrader[50][1] = itemID
set upgrader[52][1] = itemID
set upgrader[89][1] = itemID
set upgrader[91][1] = itemID
elseif(itemID == 'evtl') then //Talisman of Evasion
if(upgrader[51][0] == itemID) then
set upgrader[51][1] = itemID
else
set upgrader[51][0] = itemID
endif
elseif(itemID == 'I00D') then //Assassin Hood
set upgrader[52][0] = itemID
set upgrader[105][1] = itemID
elseif(itemID == 'I01I') then //Cloak of Shadow
set upgrader[53][0] = itemID
elseif(itemID == 'I01X') then //Oversurge
set upgrader[53][1] = itemID
elseif(itemID == 'rin1') then //Circlet of Intelligence
if(upgrader[55][0] == itemID) then
set upgrader[55][1] = itemID
else
set upgrader[55][0] = itemID
endif
set upgrader[90][1] = itemID
elseif(itemID == 'ciri') then //Firstmind Necklace
if(upgrader[56][0] == itemID) then
set upgrader[56][1] = itemID
else
set upgrader[56][0] = itemID
endif
set upgrader[59][0] = itemID
set upgrader[73][0] = itemID
elseif(itemID == 'I00I') then //Acolyte Mantle
set upgrader[57][0] = itemID
set upgrader[88][1] = itemID
elseif(itemID == 'I00I') then //Astrallian Robe
set upgrader[58][0] = itemID
elseif(itemID == 'sand') then //Scroll of Experty
set upgrader[58][1] = itemID
elseif(itemID == 'cnob') then //Horn of Prominence
if(upgrader[60][0] == itemID) then
set upgrader[60][1] = itemID
else
set upgrader[60][0] = itemID
endif
set upgrader[71][1] = itemID
elseif(itemID == 'mcou') then //Ankh of Virtue
if(upgrader[61][0] == itemID) then
set upgrader[61][1] = itemID
else
set upgrader[61][0] = itemID
endif
set upgrader[66][0] = itemID
set upgrader[106][1] = itemID
elseif(itemID == 'kpin') then //Medallion of Talent
set upgrader[62][0] = itemID
set upgrader[96][0] = itemID
set upgrader[101][1] = itemID
elseif(itemID == 'rej5') then //Scroll of Power
set upgrader[62][1] = itemID
elseif(itemID == 'stel') then //Magical Stick
if(upgrader[64][0] == itemID) then
set upgrader[64][1] = itemID
else
set upgrader[64][0] = itemID
endif
set upgrader[67][0] = itemID
set upgrader[71][0] = itemID
elseif(itemID == 'I00L') then //Twinkle Rod
if(upgrader[65][0] == itemID) then
set upgrader[65][1] = itemID
else
set upgrader[65][0] = itemID
endif
set upgrader[68][0] = itemID
elseif(itemID == 'I01Z') then //Zestflux
set upgrader[66][1] = itemID
set upgrader[99][1] = itemID
elseif(itemID == 'rej6') then //Scroll of Magic
set upgrader[67][1] = itemID
set upgrader[68][1] = itemID
set upgrader[69][1] = itemID
set upgrader[70][1] = itemID
elseif(itemID == 'I00M') then //Mystic Wand
set upgrader[69][0] = itemID
set upgrader[88][0] = itemID
set upgrader[100][1] = itemID
elseif(itemID == 'I01O') then //Bloodeye Lynch
set upgrader[70][0] = itemID
elseif(itemID == 'I01Q') then //Book of Spirit
if(upgrader[72][0] == itemID) then
set upgrader[72][1] = itemID
else
set upgrader[72][0] = itemID
endif
elseif(itemID == 'I00V') then //Retiarius of Glacier
set upgrader[75][0] = itemID
elseif(itemID == 'I004') then //Leather Armor
set upgrader[76][0] = itemID
if(upgrader[79][0] == itemID) then
set upgrader[79][1] = itemID
else
set upgrader[79][0] = itemID
endif
elseif(itemID == 'scul') then //Scroll of Protection
set upgrader[76][1] = itemID
set upgrader[82][1] = itemID
set upgrader[84][1] = itemID
set upgrader[86][1] = itemID
elseif(itemID == 'I020') then //Elven Leafcoat
if(upgrader[77][0] == itemID) then
set upgrader[77][1] = itemID
else
set upgrader[77][0] = itemID
endif
elseif(itemID == 'I022') then //Meridian Stark
if(upgrader[78][0] == itemID) then
set upgrader[78][1] = itemID
else
set upgrader[78][0] = itemID
endif
set upgrader[82][0] = itemID
elseif(itemID == 'I005') then //Plate Mail
set upgrader[80][0] = itemID
set upgrader[81][0] = itemID
elseif(itemID == 'I026') then //Adamantank
set upgrader[80][1] = itemID
elseif(itemID == 'rde1') then //Barrel Buckler
if(upgrader[83][0] == itemID) then
set upgrader[83][1] = itemID
else
set upgrader[83][0] = itemID
endif
set upgrader[84][0] = itemID
elseif(itemID == 'rde2') then //Solid Defense
set upgrader[85][0] = itemID
set upgrader[86][0] = itemID
set upgrader[109][1] = itemID
elseif(itemID == 'rde3') then //Robust Shield
set upgrader[85][1] = itemID
set upgrader[103][1] = itemID
elseif(itemID == 'I01J') then //Lightning Gripper
if(upgrader[87][0] == itemID) then
set upgrader[87][1] = itemID
else
set upgrader[87][0] = itemID
endif
elseif(itemID == 'tels') then //Hunting Scope
set upgrader[90][0] = itemID
set upgrader[91][0] = itemID
elseif(itemID == 'afac') then //Schmidt Scout
if(upgrader[92][0] == itemID) then
set upgrader[92][1] = itemID
else
set upgrader[92][0] = itemID
endif
elseif(itemID == 'I01E') then //Devourer Maw
set upgrader[93][0] = itemID
elseif(itemID == 'mlst') then //Vehemence
if(upgrader[94][0] == itemID) then
set upgrader[94][1] = itemID
else
set upgrader[94][0] = itemID
endif
elseif(itemID == 'I00Y') then //Blight River
if(upgrader[95][0] == itemID) then
set upgrader[95][1] = itemID
else
set upgrader[95][0] = itemID
endif
elseif(itemID == 'odef') then //Eve Feather
set upgrader[98][0] = itemID
set upgrader[100][0] = itemID
elseif(itemID == 'I01N') then //Staff of Flamecurse
set upgrader[99][0] = itemID
elseif(itemID == 'I00Q') then //Edge of Blaze
set upgrader[101][0] = itemID
elseif(itemID == 'I00B') then //Spider Ring
set upgrader[102][0] = itemID
elseif(itemID == 'I01U') then //Royaltouch
set upgrader[102][1] = itemID
elseif(itemID == 'I00Z') then //Goldcast Maccalan
set upgrader[103][0] = itemID
elseif(itemID == 'spsh') then //Dream Sphere
set upgrader[96][1] = itemID
elseif(itemID == 'I01K') then //Void Artifice
set upgrader[109][0] = itemID
elseif(itemID == 'brac') then //Giant Belt
set upgrader[104][0] = itemID
elseif(itemID == 'I012') then //Arcane Heaver
set upgrader[105][0] = itemID
elseif(itemID == 'lhst') then //Shoguns Pride
set upgrader[75][1] = itemID
elseif(itemID == 'I00X') then //Laksamana Keris
set upgrader[107][0] = itemID
endif
endif
set i = i + 1
endloop
set i = 0
loop
exitwhen(i >= totalCombine)
if(listItemLevel[i] > 0) then // <= CategorizeGameLevel()) then
set j = 0
set combine = true
loop
exitwhen(j >= 2)
if(upgrader[i][j] == 0) then
set combine = false
endif
set j = j + 1
endloop
if(combine) then
call DestroyEffect(AddSpecialEffectTarget(EFFECT, target, "origin"))
set j = 0
loop
exitwhen(j >= bj_MAX_INVENTORY + 1)
if(j == bj_MAX_INVENTORY) then
set itemF = itemTake
else
set itemF = UnitItemInSlot(target, j)
endif
if(itemF != null) then
set itemID = GetItemTypeId(itemF)
set charge = GetItemCharges(itemF)
set k = 0
loop
exitwhen(k >= 2)
set loadID = upgrader[i][k]
if(itemID == loadID and loadID != -1 and loadID != 0) then
set upgrader[i][k] = 0
if(j == bj_MAX_INVENTORY) then
call UnitRemoveItem(target, itemF)
endif
//call SetItemVisible(itemF, false)
call RemoveItem(itemF)
set k = bj_MAX_INVENTORY
endif
set k = k + 1
endloop
endif
set j = j + 1
endloop
call UnitAddItemById(target, listItemUpgrade[i])
set i = totalCombine
endif
endif
set i = i + 1
endloop
set owner = null
set itemF = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger UpgradeItemTrg = CreateTrigger()
local trigger UpgradeItemOrderTrg = CreateTrigger()
local integer i = 0
local integer j = 0
call TriggerRegisterAnyUnitEventBJ(UpgradeItemTrg, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(UpgradeItemTrg, Condition(function Conditions))
call TriggerAddAction(UpgradeItemTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(UpgradeItemOrderTrg, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER)
call TriggerAddCondition(UpgradeItemOrderTrg, Condition(function Order_Conditions))
call TriggerAddAction(UpgradeItemOrderTrg, function Order_Actions)
//setting globals
set totalCombine = 110
set listItemUpgrade[0] = 'I00N'
set listItemUpgrade[1] = 'I01B'
set listItemUpgrade[2] = 'mlst'
set listItemUpgrade[3] = 'I01A'
set listItemUpgrade[4] = 'I01C'
set listItemUpgrade[5] = 'I00P'
set listItemUpgrade[6] = 'I00Q'
set listItemUpgrade[7] = 'I00Y'
set listItemUpgrade[8] = 'I00R'
set listItemUpgrade[9] = 'I00S'
set listItemUpgrade[10] = 'I001'
set listItemUpgrade[11] = 'I00V'
set listItemUpgrade[12] = 'I00T'
set listItemUpgrade[13] = 'I00U'
set listItemUpgrade[14] = 'I002'
set listItemUpgrade[15] = 'I006'
set listItemUpgrade[16] = 'I010'
set listItemUpgrade[17] = 'I00X'
set listItemUpgrade[18] = 'I014'
set listItemUpgrade[19] = 'I00Z'
set listItemUpgrade[20] = 'rhth'
set listItemUpgrade[21] = 'I015'
set listItemUpgrade[22] = 'pmna'
set listItemUpgrade[23] = 'rst1'
set listItemUpgrade[24] = 'I013'
set listItemUpgrade[25] = 'I008'
set listItemUpgrade[26] = 'I011'
set listItemUpgrade[27] = 'I00A'
set listItemUpgrade[28] = 'I00B'
set listItemUpgrade[29] = 'I017'
set listItemUpgrade[30] = 'I018'
set listItemUpgrade[31] = 'I00H'
set listItemUpgrade[32] = 'I019'
set listItemUpgrade[33] = 'I00K'
set listItemUpgrade[34] = 'I016'
set listItemUpgrade[35] = 'I01T'
set listItemUpgrade[36] = 'bspd'
set listItemUpgrade[37] = 'I01U'
set listItemUpgrade[38] = 'I01V'
set listItemUpgrade[39] = 'I00F'
set listItemUpgrade[40] = 'I00G'
set listItemUpgrade[41] = 'modt'
set listItemUpgrade[42] = 'I01D'
set listItemUpgrade[43] = 'I01E'
set listItemUpgrade[44] = 'I01F'
set listItemUpgrade[45] = 'I01G'
set listItemUpgrade[46] = 'brac'
set listItemUpgrade[47] = 'I01H'
set listItemUpgrade[48] = 'I00C'
set listItemUpgrade[49] = 'I00D'
set listItemUpgrade[50] = 'evtl'
set listItemUpgrade[51] = 'I01K'
set listItemUpgrade[52] = 'I01I'
set listItemUpgrade[53] = 'I01W'
set listItemUpgrade[54] = 'I01X'
set listItemUpgrade[55] = 'ciri'
set listItemUpgrade[56] = 'I00I'
set listItemUpgrade[57] = 'I00J'
set listItemUpgrade[58] = 'I01L'
set listItemUpgrade[59] = 'I01Y'
set listItemUpgrade[60] = 'mcou'
set listItemUpgrade[61] = 'kpin'
set listItemUpgrade[62] = 'spsh'
set listItemUpgrade[63] = 'I01Z'
set listItemUpgrade[64] = 'I00L'
set listItemUpgrade[65] = 'I00M'
set listItemUpgrade[66] = 'I01M'
set listItemUpgrade[67] = 'I01P'
set listItemUpgrade[68] = 'I01N'
set listItemUpgrade[69] = 'I01O'
set listItemUpgrade[70] = 'I01S'
set listItemUpgrade[71] = 'I01Q'
set listItemUpgrade[72] = 'I01R'
set listItemUpgrade[73] = 'I012'
set listItemUpgrade[74] = 'I01J'
set listItemUpgrade[75] = 'I00W'
set listItemUpgrade[76] = 'I020'
set listItemUpgrade[77] = 'I022'
set listItemUpgrade[78] = 'I021'
set listItemUpgrade[79] = 'I005'
set listItemUpgrade[80] = 'I023'
set listItemUpgrade[81] = 'I024'
set listItemUpgrade[82] = 'I007'
set listItemUpgrade[83] = 'rde2'
set listItemUpgrade[84] = 'rde3'
set listItemUpgrade[85] = 'I025'
set listItemUpgrade[86] = 'I026'
set listItemUpgrade[87] = 'I028'
set listItemUpgrade[88] = 'I027'
set listItemUpgrade[89] = 'tels'
set listItemUpgrade[90] = 'crys'
set listItemUpgrade[91] = 'afac'
set listItemUpgrade[92] = 'ajen'
set listItemUpgrade[93] = 'anfg'
set listItemUpgrade[94] = 'I00O'
set listItemUpgrade[95] = 'rugt'
set listItemUpgrade[96] = 'I009'
set listItemUpgrade[97] = 'odef'
set listItemUpgrade[98] = 'sbch'
set listItemUpgrade[99] = 'ssil'
set listItemUpgrade[100] = 'gvsm'
set listItemUpgrade[101] = 'frgd'
set listItemUpgrade[102] = 'rnsp'
set listItemUpgrade[103] = 'lnrn'
set listItemUpgrade[104] = 'ward'
set listItemUpgrade[105] = 'lgdh'
set listItemUpgrade[106] = 'lhst'
set listItemUpgrade[107] = 'hval'
set listItemUpgrade[108] = 'crdt'
set listItemUpgrade[109] = 'clfm'
set listItemLevel[0] = 2
set listItemLevel[1] = 2
set listItemLevel[2] = 3
set listItemLevel[3] = 3
set listItemLevel[4] = 4
set listItemLevel[5] = 2
set listItemLevel[6] = 4
set listItemLevel[7] = 3
set listItemLevel[8] = 2
set listItemLevel[9] = 4
set listItemLevel[10] = 2
set listItemLevel[11] = 4
set listItemLevel[12] = 3
set listItemLevel[13] = 5
set listItemLevel[14] = 5
set listItemLevel[15] = 1
set listItemLevel[16] = 2
set listItemLevel[17] = 3
set listItemLevel[18] = 4
set listItemLevel[19] = 2
set listItemLevel[20] = 3
set listItemLevel[21] = 4
set listItemLevel[22] = 3
set listItemLevel[23] = 2
set listItemLevel[24] = 2
set listItemLevel[25] = 3
set listItemLevel[26] = 4
set listItemLevel[27] = 2
set listItemLevel[28] = 2
set listItemLevel[29] = 2
set listItemLevel[30] = 3
set listItemLevel[31] = 3
set listItemLevel[32] = 5
set listItemLevel[33] = 2
set listItemLevel[34] = 4
set listItemLevel[35] = 5
set listItemLevel[36] = 3
set listItemLevel[37] = 3
set listItemLevel[38] = 3
set listItemLevel[39] = 2
set listItemLevel[40] = 3
set listItemLevel[41] = 2
set listItemLevel[42] = 3
set listItemLevel[43] = 4
set listItemLevel[44] = 4
set listItemLevel[45] = 5
set listItemLevel[46] = 3
set listItemLevel[47] = 5
set listItemLevel[48] = 2
set listItemLevel[49] = 3
set listItemLevel[50] = 3
set listItemLevel[51] = 4
set listItemLevel[52] = 4
set listItemLevel[53] = 5
set listItemLevel[54] = 4
set listItemLevel[55] = 2
set listItemLevel[56] = 3
set listItemLevel[57] = 3
set listItemLevel[58] = 4
set listItemLevel[59] = 3
set listItemLevel[60] = 2
set listItemLevel[61] = 3
set listItemLevel[62] = 4
set listItemLevel[63] = 2
set listItemLevel[64] = 2
set listItemLevel[65] = 3
set listItemLevel[66] = 3
set listItemLevel[67] = 2
set listItemLevel[68] = 3
set listItemLevel[69] = 4
set listItemLevel[70] = 5
set listItemLevel[71] = 2
set listItemLevel[72] = 3
set listItemLevel[73] = 3
set listItemLevel[74] = 3
set listItemLevel[75] = 5
set listItemLevel[76] = 2
set listItemLevel[77] = 4
set listItemLevel[78] = 5
set listItemLevel[79] = 2
set listItemLevel[80] = 4
set listItemLevel[81] = 3
set listItemLevel[82] = 4
set listItemLevel[83] = 2
set listItemLevel[84] = 2
set listItemLevel[85] = 4
set listItemLevel[86] = 3
set listItemLevel[87] = 5
set listItemLevel[88] = 5
set listItemLevel[89] = 2
set listItemLevel[90] = 3
set listItemLevel[91] = 3
set listItemLevel[92] = 5
set listItemLevel[93] = 5
set listItemLevel[94] = 4
set listItemLevel[95] = 5
set listItemLevel[96] = 5
set listItemLevel[97] = 4
set listItemLevel[98] = 4
set listItemLevel[99] = 4
set listItemLevel[100] = 5
set listItemLevel[101] = 5
set listItemLevel[102] = 4
set listItemLevel[103] = 3
set listItemLevel[104] = 4
set listItemLevel[105] = 4
set listItemLevel[106] = 3
set listItemLevel[107] = 4
set listItemLevel[108] = 3
set listItemLevel[109] = 5
/*
0 - Mortise Timbercutter - Sturdy War Axe + Scroll of Damage
1 - Chromium Arch - 2 Sturdy War Axe
2 - Vehemence - Mortise Timbercutter + Periapt of Vitality
3 - Fatal Cleaver - Chromium Arch + Scroll of Damage
4 - Sagaris Carnage - Fatal Cleaver + Guardians Helm
5 - Razorpoint Blade - 2 Ironcraft Sword
6 - Edge of Blaze - 2 Razorpoint Blade
7 - Blight River - Razorpoint Blade + Scroll of Damage
8 - Aztez Spear - Sharpend Javelin + Scroll of Damage
9 - Truepierce Lance - 2 Aztez Spear
10 - Coral Spire - 2 Sharpend Javelin
11 - Retiarius Glacier - 2 Coral Spire
12 - Hardspike Beetle - Stoneforge Hammer + Scroll of Damage
13 - Skull Crusher - 2 Hardspike Beetle
14 - Amazon Meld - Truepierce Lance + Razorpoint Blade
15 - Baneriven Dagger - Bronzesteel Knife + Scroll of Damage
16 - Venomwax Fang - 2 Baneriven Dagger
17 - Laksamana Keris - Baneriven Dagger + Scroll of Damage
18 - Cinquedea Ivy - Venomwax Fang + Silverlight Toucher
19 - Goldcast Maccalan - Bronzesteel Knife + Mortise Timbercutter
20 - Zemi of Eternal - 2 Periapt of Vitality
21 - Orb of Descent - Zemi of Eternal + Scroll of Life
22 - Pendant of Innerforce - 2 Gratify Rosary
23 - Hypergloves - Gauntlet of Brawler + Scroll of Battle
24 - Silverlight Toucher - 2 Gauntlet of Brawler
25 - Mania Cestus - Gauntlet of Brawler + Runical Ring
26 - Fist of Firebringer - 2 Mania Cestus
27 - Aurelian Ring - 2 Runical Ring
28 - Spider Ring - Amethyst Ring + Scroll of Mana
29 - Platinum Sprinter - 2 Walking Slippers
30 - Steamrocket Jumper - Warmarcher + Scroll of Speed
31 - Warmarcher - 2 Platinum Sprinter
32 - Skypath Strider - Warmarcher + Zemi of Eternal
33 - Expidition Footgear - Walking Slippers + Scroll of Speed
34 - Jungle Runner - Boots of Speed + Scroll of Speed
35 - Exzel Sneaker - Boots of Speed + Hypergloves
36 - Boots of Speed - 2 Expidition Footgear
37 - Royaltouch - Aurelian Ring + Scroll of Life
38 - Powershard - Pendant of Innerforce + Scroll of Mana
39 - Tribal Headdress - 2 Valor Front
40 - Guardians Helm - 2 Tribal Headdress
41 - Scourge Visor - Valor Front + Scroll of Mighty
42 - Larynxrage - Scourge Visor + Scroll of Mighty
43 - Devourer Maw - Scourge Visor + Guardians Helm
44 - Ataraxia Sparta - Guardians Helm + Aurelian Ring
45 - Throne of Emperor - Ataraxia Sparta + Boots of Speed
46 - Giant Belt - Tribal Headdress + Periapt of Vitality
47 - Wrist of Hercules - 2 Drum of Horde
48 - Amulet of Dexterity - 2 Bracer of Bold
49 - Assassin Hood - 2 Amulet of Dexterity
50 - Talisman of Evasion - Amulet of Dexterity + Scroll of Potency
51 - Void Artifice - 2 Talisman of Evasion
52 - Cloak of Shadow - Assassin Hood + Scroll of Potency
53 - Ghost Veil - Cloak of Shadow + Oversurge
54 - Oversurge - Expidition Footgear + Stoneforge Hammer
55 - Firstmind Necklace - 2 Circlet of Intelligence
56 - Acolyte Mantle - 2 Firstmind Necklace
57 - Astrallian Robe - Acolyte Mantle + Amethyst Ring
58 - Windsage - Astrallian Robe + Scroll of Experty
59 - Crown of Malediction - Firstmind Necklace + Tribal Headdress
60 - Ankh or Virtue - 2 Horn of Prominence
61 - Medallion of Talent - 2 Ankh of Virtue
62 - Dream Sphere - Medallion of Talent + Scroll of Power
63 - Zestflux - 2 Amethyst Ring
64 - Twinkle Rod - 2 Magical Stick
65 - Mystic Wand - 2 Twinkle Rod
66 - Veteran Smoke Pipe - Ankh of Virtue + Zestflux
67 - Anexiler - Magical Stick + Scroll of Magic
68 - Staff of Flamecurse - Twinkle Rod + Scroll of Magic
69 - Bloodeye Lynch - Mystic Wand + Scroll of Magic
70 - Havocrave Dissever - Bloodeye Lynch + Scroll of Magic
71 - Book of Spirit - Magical Stick + Horn of Prominence
72 - Shadow Grimoire - 2 Book of Spirit
73 - Arcane Heaver - Firstmind Necklace + Silverlight Toucher
74 - Lightning Gripper - Amulet of Dexterity + Silverlight Toucher
75 - Atlantic Darktrident - Retiarius of Glacier + Shoguns Pride
76 - Elven Leafcoat - Leather Armor + Scroll of Protection
77 - Meridian Stark - 2 Elven Leafcoat
78 - Dragon Frostscale - 2 Meridian Stark
79 - Plate Mail - 2 Leather Armor
80 - Orenda Spectrum - Adamantank + Plate Mail
81 - Deathshard - Stoneforge Hammer + Plate Mail
82 - Macabre Crowfort - Meridian Stark + Scroll of Protection
83 - Solid Defense - 2 Barrel Buckler
84 - Robust Shield - Barrel Buckler + Scroll of Protection
85 - Encease Siege - Solid Defense + Robust Shield
86 - Adamandatank - Solid Defense + Scroll of Protection
87 - Stormanifer - 2 Lightning Gripper
88 - Mindseer of Ultimate - Mystic Wand + Acolyte Mantle
89 - Hunting Scope - Bracer of Bold + Scroll of Potency
90 - Crystal Ball - Hunting Scope + Circlet of Intelligence
91 - Scoutbow - Hunting Scope + Scroll of Potency
92 - Ralex of Sharpstrike - 2 Schmidt Scoutbow
93 - Brutalic - Devourer Maw + Chromium Arc
94 - Arcanite Reaver - 2 Vehemence
95 - Aphotical Scythe - 2 Blight River
96 - Prime Lucent - Dream Sphere + Medallion of Talent
97 - Eve Feather - Gratify Rosary + Pendant of Innerforce
98 - Moonstalker - Eve Feather + Scroll of Mana
99 - Sunstalker - Staff of Flamecurse + Zestflux
100 - Chronos the Forbidden - Eve Feather + Mystic Wand
101 - Heaven Rapier - Edge of Blaze + Medallion of Talent
102 - Ivory Halo - Spider Ring + Royaltouch
103 - Jar of Greed - Goldcast Maccalan + Robust Shield
104 - Drum of Horde - 1 Giant Belt + 1 Zemi of Eternal
105 - Vangage Expulsion - 1 Arcane Heaver + 1 Assassin Hood
106 - Shoguns Pride - 1 Ankh of Virtue + 1 Ironcraft Sword
107 - Nine Curve - 1 Venomwax Fang + 1 Laksamana Keris
108 - Armlet of Insanity - 1 Hypergloves + 1 Platinum Sprinter
109 - Diamond Escutcheon - 1 Void Aritifice + 1 Solid Defense
*/
endfunction
endscope
//TESH.scrollpos=95
//TESH.alwaysfold=0
globals
hashtable MagicDamage_Ht = InitHashtable()
endglobals
scope MagicItems initializer Init
//----------------------------------------------------------------
globals
private integer array Ar[12][2]
private integer Total
endglobals
//----------------------------------------------------------------
private function Pick_Actions takes nothing returns nothing
local unit picker = GetTriggerUnit()
local integer pickerID = GetUnitUserData(picker)
local item pickedItem = GetManipulatedItem()
local integer itemId = GetItemTypeId(pickedItem)
local integer i = 0
set i = 0
loop
exitwhen(i >= Total)
if(itemId == Ar[i][0]) then
call SaveInteger(MagicDamage_Ht, pickerID, 0, LoadInteger(MagicDamage_Ht, pickerID, 0) + Ar[i][1])
set i = Total
endif
set i = i + 1
endloop
set picker = null
set pickedItem = null
endfunction
//----------------------------------------------------------------
private function Pick_Conditions takes nothing returns boolean
local unit picker = GetTriggerUnit()
local item itemPicked = GetManipulatedItem()
local integer itemId = GetItemTypeId(itemPicked)
local boolean allow = false
local integer i = 0
local boolean exist = false
if(GetItemType(itemPicked) == ITEM_TYPE_PERMANENT) then
set i = 0
loop
exitwhen(i >= Total)
if(itemId == Ar[i][0]) then
set exist = true
set i = Total
endif
set i = i + 1
endloop
if(exist) then
call Item_SetId(itemPicked)
set allow = Item_OwningConditions(picker, itemPicked)
endif
endif
set picker = null
set itemPicked = null
return allow
endfunction
//----------------------------------------------------------------
private function Drop_Actions takes nothing returns nothing
local unit dropper = GetTriggerUnit()
local integer dropperID = GetUnitUserData(dropper)
local item droppedItem = GetManipulatedItem()
local integer itemId = GetItemTypeId(droppedItem)
local integer i = 0
if(GetItemType(droppedItem) == ITEM_TYPE_PERMANENT) then
set i = 0
loop
exitwhen(i >= Total)
if(itemId == Ar[i][0]) then
call SaveInteger(MagicDamage_Ht, dropperID, 0, LoadInteger(MagicDamage_Ht, dropperID, 0) - Ar[i][1])
set i = Total
endif
set i = i + 1
endloop
endif
set dropper = null
set droppedItem = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger MagicItemsTrg = CreateTrigger()
local trigger MagicItemsDropTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(MagicItemsTrg, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(MagicItemsTrg, Condition(function Pick_Conditions))
call TriggerAddAction(MagicItemsTrg, function Pick_Actions)
call TriggerRegisterAnyUnitEventBJ(MagicItemsDropTrg, EVENT_PLAYER_UNIT_DROP_ITEM)
call TriggerAddAction(MagicItemsDropTrg, function Drop_Actions)
//setting globals
set Total = 12
set Ar[0][0] = 'stel' //Magical Stick
set Ar[0][1] = 6
set Ar[1][0] = 'I00L' //Twinkle Rod
set Ar[1][1] = 15
set Ar[2][0] = 'I00M' //Mystic Wand
set Ar[2][1] = 36
set Ar[3][0] = 'I01P' //Anexiler
set Ar[3][1] = 9
set Ar[4][0] = 'I01Q' //Book of Spirit
set Ar[4][1] = 8
set Ar[5][0] = 'I01O' //Bloodeye Lynch
set Ar[5][1] = 40
set Ar[6][0] = 'I01S' //Havocrave Dissever
set Ar[6][1] = 50
set Ar[7][0] = 'I027' //Mindseer of Ultimate
set Ar[7][1] = 46
set Ar[8][0] = 'I01R' //Shadown Grimoire
set Ar[8][1] = 18
set Ar[9][0] = 'I01N' //Staff of Flamecurse
set Ar[9][1] = 20
set Ar[10][0] = 'ssil' //Sunstalker
set Ar[10][1] = 30
set Ar[11][0] = 'gvsm' //Chronos the Forbidden
set Ar[11][1] = 44
endfunction
endscope
//TESH.scrollpos=479
//TESH.alwaysfold=0
scope AttackCooldownItems initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer PICKED_KEY = 0
private constant integer UNIT_KEY = 1
private constant integer INDEX_KEY = 2
private constant integer COOLDOWN_KEY = 3
private constant integer HIT_KEY = 4
private constant integer CHARGE_KEY = 5
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private integer array Ar[10][5]
private string array Cast[10][1]
private real array Duration[10][1]
private integer Total
private hashtable AttackCooldownItems_Ht
private group Group
private group copy
endglobals
//----------------------------------------------------------------
private function Pick_Actions takes nothing returns nothing
local unit picker = GetTriggerUnit()
local integer pickerID = GetUnitUserData(picker)
local item pickedItem = GetManipulatedItem()
local integer itemType = GetItemTypeId(pickedItem)
local integer itemID = GetItemUserData(pickedItem)
local integer i = 0
local integer j = 0
local boolean exist = false
local item itemF = null
local integer itemFType = 0
local integer itemFID = 0
local real time = 0.0
local boolean hit = false
local integer charge = 0
local boolean charged = false
set i = 0
set exist = false
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(picker, i)
if(itemF != null and itemF != pickedItem) then
set itemFType = GetItemTypeId(itemF)
set j = 0
loop
exitwhen(j >= Total)
if(itemFType == Ar[j][0] and itemType == itemFType) then
set exist = true
set itemFID = GetItemUserData(itemF)
set time = LoadReal(AttackCooldownItems_Ht, itemFID, COOLDOWN_KEY)
set hit = LoadBoolean(AttackCooldownItems_Ht, itemFID, HIT_KEY)
set charge = LoadInteger(AttackCooldownItems_Ht, itemFID, CHARGE_KEY)
call SaveBoolean(AttackCooldownItems_Ht, itemID, PICKED_KEY, true)
call SaveUnitHandle(AttackCooldownItems_Ht, itemID, UNIT_KEY, picker)
call SaveInteger(AttackCooldownItems_Ht, itemID, INDEX_KEY, j)
call SaveReal(AttackCooldownItems_Ht, itemID, COOLDOWN_KEY, time)
call SaveBoolean(AttackCooldownItems_Ht, itemID, HIT_KEY, hit)
call SaveInteger(AttackCooldownItems_Ht, itemID, CHARGE_KEY, charge)
call SetItemCharges(pickedItem, charge)
if(charge > 0 and (not charged)) then
set charged = true
endif
set j = Total
set i = bj_MAX_INVENTORY
endif
set j = j + 1
endloop
endif
set i = i + 1
endloop
if(not exist) then
set i = 0
loop
exitwhen(i >= Total)
if(itemType == Ar[i][0]) then
if(not IsUnitInGroup(picker, Group)) then
call GroupAddUnit(Group, picker)
endif
call SaveBoolean(AttackCooldownItems_Ht, itemID, PICKED_KEY, true)
call SaveUnitHandle(AttackCooldownItems_Ht, itemID, UNIT_KEY, picker)
call SaveInteger(AttackCooldownItems_Ht, itemID, INDEX_KEY, i)
call SaveReal(AttackCooldownItems_Ht, itemID, COOLDOWN_KEY, I2R(Ar[i][1]))
call SaveBoolean(AttackCooldownItems_Ht, itemID, HIT_KEY, false)
call SaveInteger(AttackCooldownItems_Ht, itemID, CHARGE_KEY, 0)
set i = Total
endif
set i = i + 1
endloop
endif
set picker = null
set pickedItem = null
set itemF = null
endfunction
//----------------------------------------------------------------
private function Pick_Conditions takes nothing returns boolean
local unit picker = GetTriggerUnit()
local item itemPicked = GetManipulatedItem()
local integer itemId = GetItemTypeId(itemPicked)
local boolean allow = false
local integer i = 0
local boolean exist = false
if(GetItemType(itemPicked) == ITEM_TYPE_PERMANENT) then
set i = 0
loop
exitwhen(i >= Total)
if(itemId == Ar[i][0]) then
set exist = true
set i = Total
endif
set i = i + 1
endloop
if(exist) then
call Item_SetId(itemPicked)
set allow = Item_OwningConditions(picker, itemPicked) and IsUnitType(picker, UNIT_TYPE_HERO)
endif
endif
set picker = null
set itemPicked = null
return allow
endfunction
//----------------------------------------------------------------
private function Drop_Actions takes nothing returns nothing
local unit dropper = GetTriggerUnit()
local integer dropperID = GetUnitUserData(dropper)
local item droppedItem = GetManipulatedItem()
local integer itemType = GetItemTypeId(droppedItem)
local integer itemID = GetItemUserData(droppedItem)
local integer i = 0
local integer j = 0
local boolean exist = false
local item itemF = null
local integer itemFType = 0
local integer itemFID = 0
local integer index = 0
if(GetItemType(droppedItem) == ITEM_TYPE_PERMANENT) then
set i = 0
loop
exitwhen(i >= Total)
if(itemType == Ar[i][0]) then
set index = i
set exist = true
call UnitRemoveAbility(dropper, Ar[i][2])
call FlushChildHashtable(AttackCooldownItems_Ht, itemID)
set i = Total
endif
set i = i + 1
endloop
if(exist) then
set exist = false
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY and (exist))
set itemF = UnitItemInSlot(dropper, i)
if(itemF != null) then
if(itemF != droppedItem) then
set itemFType = GetItemTypeId(itemF)
set j = 0
loop
exitwhen(j >= Total)
if(itemType == Ar[j][0] and itemFType == Ar[j][0]) then
set exist = true
set j = Total
endif
set j = j + 1
endloop
endif
endif
set i = i + 1
endloop
if(not exist) then
call GroupRemoveUnit(Group, dropper)
else
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(dropper, i)
if(itemF != null) then
set itemFType = GetItemTypeId(itemF)
set itemFID = GetItemUserData(itemF)
if(itemFType == itemType) then
call SaveReal(AttackCooldownItems_Ht, itemFID, COOLDOWN_KEY, I2R(Ar[index][1]))
call SaveBoolean(AttackCooldownItems_Ht, itemFID, HIT_KEY, false)
call SaveInteger(AttackCooldownItems_Ht, itemFID, CHARGE_KEY, 0)
call SetItemCharges(itemF, 0)
endif
endif
set i = i + 1
endloop
endif
endif
endif
set dropper = null
set droppedItem = null
set itemF = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit f = null
local integer i = 0
local item itemF = null
local integer itemID = 0
local boolean picked = false
local integer index = 0
local real time = 0.0
local boolean hit = false
local integer charge = 0
set copy = CopyGroup(Group)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set i = 0
set picked = false
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(f, i)
if(itemF != null) then
set itemID = GetItemUserData(itemF)
set picked = LoadBoolean(AttackCooldownItems_Ht, itemID, PICKED_KEY)
if(picked) then
set index = LoadInteger(AttackCooldownItems_Ht, itemID, INDEX_KEY)
set time = LoadReal(AttackCooldownItems_Ht, itemID, COOLDOWN_KEY)
set hit = LoadBoolean(AttackCooldownItems_Ht, itemID, HIT_KEY)
set charge = LoadInteger(AttackCooldownItems_Ht, itemID, CHARGE_KEY)
if(time > 0) then
set time = time - 0.5
elseif(charge < Ar[index][4]) then
if(Ar[index][3] == 1) then
call UnitAddAbility(f, Ar[index][2])
call SetPlayerAbilityAvailable(GetOwningPlayer(f), Ar[index][2], false)
elseif(Ar[index][3] == 0) then
call UnitAddAbility(f, Ar[index][2])
endif
set charge = charge + 1
set time = I2R(Ar[index][1])
call SaveBoolean(AttackCooldownItems_Ht, itemID, HIT_KEY, true)
call SaveInteger(AttackCooldownItems_Ht, itemID, CHARGE_KEY, charge)
endif
call SaveReal(AttackCooldownItems_Ht, itemID, COOLDOWN_KEY, time)
call SetItemCharges(itemF, charge)
endif
/*set j = 0
loop
exitwhen(j >= Total)
if(itemType == Ar[j][0]) then
set itemID = GetItemUserData(itemF)
set time = LoadReal(AttackCooldownItems_Ht, itemID, COOLDOWN_KEY)
set hit = LoadBoolean(AttackCooldownItems_Ht, itemID, HIT_KEY)
set charge = LoadInteger(AttackCooldownItems_Ht, itemID, CHARGE_KEY)
if(time > 0) then
set time = time - 0.5
elseif(charge < Ar[j][4]) then
if(Ar[j][3] == 1) then
call UnitAddAbility(f, Ar[j][2])
call SetPlayerAbilityAvailable(GetOwningPlayer(f), Ar[j][2], false)
elseif(Ar[j][3] == 0) then
call UnitAddAbility(f, Ar[j][2])
endif
set charge = charge + 1
set time = I2R(Ar[j][1])
call SaveBoolean(AttackCooldownItems_Ht, itemID, HIT_KEY, true)
call SaveInteger(AttackCooldownItems_Ht, itemID, CHARGE_KEY, charge)
endif
call SaveReal(AttackCooldownItems_Ht, itemID, COOLDOWN_KEY, time)
call SetItemCharges(itemF, charge)
set j = Total
endif
set j = j + 1
endloop*/
endif
set i = i + 1
endloop
endloop
set f = null
set itemF = null
endfunction
//----------------------------------------------------------------
private function Attack_Actions takes nothing returns nothing
local unit attacker = GetAttacker()
local player owner = GetOwningPlayer(attacker)
local unit attacked = GetTriggerUnit()
local integer i = 0
local item itemF = null
local integer itemType = 0
local integer itemID = 0
local integer j = 0
local boolean picked = false
local integer index = 0
local boolean hit = false
local real time = 0.0
local integer charge = 0
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(attacker, i)
if(itemF != null) then
set itemType = GetItemTypeId(itemF)
set itemID = GetItemUserData(itemF)
set picked = LoadBoolean(AttackCooldownItems_Ht, itemID, PICKED_KEY)
if(picked) then
set index = LoadInteger(AttackCooldownItems_Ht, itemID, INDEX_KEY)
set time = LoadReal(AttackCooldownItems_Ht, itemID, COOLDOWN_KEY)
set hit = LoadBoolean(AttackCooldownItems_Ht, itemID, HIT_KEY)
set charge = LoadInteger(AttackCooldownItems_Ht, itemID, CHARGE_KEY)
if(hit) then
if(Ar[index][3] == 2) then
call TargetCast(owner, GetUnitX(attacker), GetUnitY(attacker), Duration[index][0], Ar[index][2], 1, Cast[index][0], 0, attacked)
elseif(Ar[index][3] == 3) then
call PointCast(owner, GetUnitX(attacker), GetUnitY(attacker), Duration[index][0], Ar[index][2], 1, Cast[index][0], 0, GetUnitX(attacked), GetUnitY(attacked))
elseif(Ar[index][3] == 4) then
call TargetCast(owner, GetUnitX(attacker), GetUnitY(attacker), Duration[index][0], Ar[index][2], 1, Cast[index][0], 0, attacker)
elseif(Ar[index][3] == 5) then
call UnitAddItemById(attacker, Ar[index][2])
elseif(Ar[index][3] == 6) then
call TargetCast(owner, GetUnitX(attacker), GetUnitY(attacker), Duration[index][0], Ar[index][2], 1, Cast[index][0], 0, attacker)
call TargetCast(owner, GetUnitX(attacked), GetUnitY(attacked), Duration[index][0], Ar[index][2], 1, Cast[index][0], 0, attacked)
endif
set charge = charge - 1
set charge = IMaxBJ(charge, 0)
call SaveReal(AttackCooldownItems_Ht, itemID, COOLDOWN_KEY, I2R(Ar[index][1]))
call SaveInteger(AttackCooldownItems_Ht, itemID, CHARGE_KEY, charge)
call SetItemCharges(itemF, charge)
if(charge <= 0) then
call SaveBoolean(AttackCooldownItems_Ht, itemID, HIT_KEY, false)
endif
else
if(Ar[index][3] == 0 or Ar[index][3] == 1) then
call UnitRemoveAbility(attacker, Ar[index][2])
endif
endif
endif
/*set j = 0
loop
exitwhen(j >= Total)
if(itemType == Ar[j][0]) then
set itemID = GetItemUserData(itemF)
set time = LoadReal(AttackCooldownItems_Ht, itemID, COOLDOWN_KEY)
set hit = LoadBoolean(AttackCooldownItems_Ht, itemID, HIT_KEY)
set charge = LoadInteger(AttackCooldownItems_Ht, itemID, CHARGE_KEY)
if(hit) then
if(Ar[j][3] == 2) then
call TargetCast(owner, GetUnitX(attacker), GetUnitY(attacker), Duration[j][0], Ar[j][2], 1, Cast[j][0], 0, attacked)
elseif(Ar[j][3] == 3) then
call PointCast(owner, GetUnitX(attacker), GetUnitY(attacker), Duration[j][0], Ar[j][2], 1, Cast[j][0], 0, GetUnitX(attacked), GetUnitY(attacked))
elseif(Ar[j][3] == 4) then
call TargetCast(owner, GetUnitX(attacker), GetUnitY(attacker), Duration[j][0], Ar[j][2], 1, Cast[j][0], 0, attacker)
elseif(Ar[j][3] == 5) then
if(not IsUnitDead(attacker) and (not IsUnitPaused(attacker))) then
call UnitAddItemById(attacker, Ar[j][2])
endif
endif
set charge = charge - 1
set charge = IMaxBJ(charge, 0)
call SaveReal(AttackCooldownItems_Ht, itemID, COOLDOWN_KEY, I2R(Ar[j][1]))
call SaveInteger(AttackCooldownItems_Ht, itemID, CHARGE_KEY, charge)
call SetItemCharges(itemF, charge)
if(charge <= 0) then
call SaveBoolean(AttackCooldownItems_Ht, itemID, HIT_KEY, false)
endif
else
if(Ar[j][3] == 0 or Ar[j][3] == 1) then
call UnitRemoveAbility(attacker, Ar[j][2])
endif
endif
set j = Total
endif
set j = j + 1
endloop*/
endif
set i = i + 1
endloop
set attacker = null
set owner = null
set attacked = null
set itemF = null
endfunction
//----------------------------------------------------------------
private function Attack_Conditions takes nothing returns boolean
local unit attacker = GetAttacker()
local boolean okey = IsUnitInGroup(attacker, Group)
set attacker = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger AttackCooldownItemsTrg = CreateTrigger()
local trigger AttackCooldownItemsDropTrg = CreateTrigger()
local trigger AttackCooldownItemsCooldownTrg = CreateTrigger()
local trigger AttackCooldownItemsAttackTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(AttackCooldownItemsTrg, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(AttackCooldownItemsTrg, Condition(function Pick_Conditions))
call TriggerAddAction(AttackCooldownItemsTrg, function Pick_Actions)
call TriggerRegisterAnyUnitEventBJ(AttackCooldownItemsDropTrg, EVENT_PLAYER_UNIT_DROP_ITEM)
call TriggerAddAction(AttackCooldownItemsDropTrg, function Drop_Actions)
call TriggerRegisterTimerEventPeriodic(AttackCooldownItemsCooldownTrg, 0.5)
call TriggerAddAction(AttackCooldownItemsCooldownTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(AttackCooldownItemsAttackTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(AttackCooldownItemsAttackTrg, Condition(function Attack_Conditions))
call TriggerAddAction(AttackCooldownItemsAttackTrg, function Attack_Actions)
//setting globals
set AttackCooldownItems_Ht = InitHashtable()
set Group = CreateGroup()
set copy = CreateGroup()
//Index
//0 - Item id
//1 - Cooldown time
//2 - Ability add or launch
//3 - Mode (1 - give ability to hero, 2 - cast ability to target, 3 - cast point ability to target, 4 - cast ability to hero, 5 - give item to hero, 6 - cast point ability to both attacker and target)
//4 - Charge
set Total = 10
set Ar[0][0] = 'I00R' //Aztez Spear
set Ar[0][1] = 6
set Ar[0][2] = 'A00U'
set Ar[0][3] = 1
set Ar[0][4] = 1
set Ar[1][0] = 'I00S' //Truepierce Lance
set Ar[1][1] = 3
set Ar[1][2] = 'A00W'
set Ar[1][3] = 1
set Ar[1][4] = 1
set Ar[2][0] = 'I006' //Falcon Dirk
set Ar[2][1] = 8
set Ar[2][2] = 'ACss'
set Ar[2][3] = 2
set Ar[2][4] = 1
set Ar[3][0] = 'I00X' //Laksamana Keris
set Ar[3][1] = 5
set Ar[3][2] = 'A015'
set Ar[3][3] = 2
set Ar[3][4] = 2
set Ar[4][0] = 'I010' //Venomwax Fang
set Ar[4][1] = 4
set Ar[4][2] = 'A01A'
set Ar[4][3] = 2
set Ar[4][4] = 1
set Ar[5][0] = 'I01J' //Lightning Gripper
set Ar[5][1] = 5
set Ar[5][2] = 'AIcl'
set Ar[5][3] = 2
set Ar[5][4] = 1
set Ar[6][0] = 'I008' //Mania Cestus
set Ar[6][1] = 10
set Ar[6][2] = 'AIuf'
set Ar[6][3] = 4
set Ar[6][4] = 1
set Ar[7][0] = 'I015' //Orb of Descent
set Ar[7][1] = 20
set Ar[7][2] = 'esaz'
set Ar[7][3] = 5
set Ar[7][4] = 3
set Ar[8][0] = 'hval' //Nine Curve
set Ar[8][1] = 3
set Ar[8][2] = 'A0B2'
set Ar[8][3] = 2
set Ar[8][4] = 3
set Ar[9][0] = 'I00O' //Arcanite Reaver
set Ar[9][1] = 4
set Ar[9][2] = 'klmm'
set Ar[9][3] = 5
set Ar[9][4] = 5
set Cast[0][0] = ""
set Cast[1][0] = ""
set Cast[2][0] = "shadowstrike"
set Cast[3][0] = "shadowstrike"
set Cast[4][0] = "shadowstrike"
set Cast[5][0] = "chainlightning"
set Cast[6][0] = "unholyfrenzy"
set Cast[7][0] = ""
set Cast[8][0] = "shadowstrike"
set Cast[9][0] = ""
set Duration[0][0] = 0.0
set Duration[1][0] = 0.0
set Duration[2][0] = 1.0
set Duration[3][0] = 1.0
set Duration[4][0] = 1.0
set Duration[5][0] = 5.0
set Duration[6][0] = 1.0
set Duration[7][0] = 0.0
set Duration[8][0] = 1.0
set Duration[9][0] = 0.0
endfunction
endscope
//TESH.scrollpos=462
//TESH.alwaysfold=0
scope AttackCountItems initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer PICKED_KEY = 0
private constant integer UNIT_KEY = 1
private constant integer INDEX_KEY = 2
private constant integer TIMES_KEY = 3
private constant integer HIT_KEY = 4
private constant integer DONE_KEY = 5
private constant integer CHARGE_KEY = 6
endglobals
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private integer array Ar[11][5]
private string array Cast[11][1]
private real array Duration[11][1]
private integer Total
private hashtable AttackCountItems_Ht
private group Group
private group copy
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Pick_Actions takes nothing returns nothing
local unit picker = GetTriggerUnit()
local integer pickerID = GetUnitUserData(picker)
local item pickedItem = GetManipulatedItem()
local integer itemType = GetItemTypeId(pickedItem)
local integer itemID = GetItemUserData(pickedItem)
local integer i = 0
local integer j = 0
local boolean exist = false
local item itemF = null
local integer itemFType = 0
local integer itemFID = 0
local integer times = 0
local boolean hit = false
local boolean done = false
local integer charge = 0
local boolean charged = false
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(picker, i)
if(itemF != null and itemF != pickedItem) then
set itemFType = GetItemTypeId(itemF)
set j = 0
loop
exitwhen(j >= Total)
if(itemFType == Ar[j][0] and itemType == itemFType) then
set exist = true
set itemFID = GetItemUserData(itemF)
set times = LoadInteger(AttackCountItems_Ht, itemFID, TIMES_KEY)
set hit = LoadBoolean(AttackCountItems_Ht, itemFID, HIT_KEY)
set done = LoadBoolean(AttackCountItems_Ht, itemFID, DONE_KEY)
set charge = LoadInteger(AttackCountItems_Ht, itemFID, CHARGE_KEY)
call SaveBoolean(AttackCountItems_Ht, itemID, PICKED_KEY, true)
call SaveUnitHandle(AttackCountItems_Ht, itemID, UNIT_KEY, picker)
call SaveInteger(AttackCountItems_Ht, itemID, INDEX_KEY, j)
call SaveInteger(AttackCountItems_Ht, itemID, TIMES_KEY, times)
call SaveBoolean(AttackCountItems_Ht, itemID, HIT_KEY, hit)
call SaveBoolean(AttackCountItems_Ht, itemID, DONE_KEY, done)
call SaveInteger(AttackCountItems_Ht, itemID, CHARGE_KEY, charge)
call SetItemCharges(pickedItem, charge)
if(charge > 0 and (not charged)) then
set charged = true
endif
set j = Total
set i = bj_MAX_INVENTORY
endif
set j = j + 1
endloop
endif
set i = i + 1
endloop
if(not exist) then
set i = 0
loop
exitwhen(i >= Total)
if(itemType == Ar[i][0]) then
if(not IsUnitInGroup(picker, Group)) then
call GroupAddUnit(Group, picker)
endif
call SaveBoolean(AttackCountItems_Ht, itemID, PICKED_KEY, true)
call SaveUnitHandle(AttackCountItems_Ht, itemID, UNIT_KEY, picker)
call SaveInteger(AttackCountItems_Ht, itemID, INDEX_KEY, i)
call SaveInteger(AttackCountItems_Ht, itemID, TIMES_KEY, Ar[i][1])
call SaveBoolean(AttackCountItems_Ht, itemID, HIT_KEY, false)
call SaveBoolean(AttackCountItems_Ht, itemID, DONE_KEY, false)
call SaveInteger(AttackCountItems_Ht, itemID, CHARGE_KEY, 0)
set i = Total
endif
set i = i + 1
endloop
endif
set picker = null
set pickedItem = null
set itemF = null
endfunction
//----------------------------------------------------------------
private function Pick_Conditions takes nothing returns boolean
local unit picker = GetTriggerUnit()
local item itemPicked = GetManipulatedItem()
local integer itemId = GetItemTypeId(itemPicked)
local boolean allow = false
local integer i = 0
local boolean exist = false
if(GetItemType(itemPicked) == ITEM_TYPE_PERMANENT) then
set i = 0
loop
exitwhen(i >= Total)
if(itemId == Ar[i][0]) then
set exist = true
set i = Total
endif
set i = i + 1
endloop
if(exist) then
call Item_SetId(itemPicked)
set allow = Item_OwningConditions(picker, itemPicked) and IsUnitType(picker, UNIT_TYPE_HERO)
endif
endif
set picker = null
set itemPicked = null
return allow
endfunction
//----------------------------------------------------------------
private function Drop_Actions takes nothing returns nothing
local unit dropper = GetTriggerUnit()
local integer dropperID = GetUnitUserData(dropper)
local item droppedItem = GetManipulatedItem()
local integer itemType = GetItemTypeId(droppedItem)
local integer itemID = GetItemUserData(droppedItem)
local integer i = 0
local integer j = 0
local boolean exist = false
local item itemF = null
if(GetItemType(droppedItem) == ITEM_TYPE_PERMANENT) then
set i = 0
loop
exitwhen(i >= Total)
if(itemType == Ar[i][0]) then
set exist = true
call UnitRemoveAbility(dropper, Ar[i][2])
call FlushChildHashtable(AttackCountItems_Ht, itemID)
set i = Total
endif
set i = i + 1
endloop
if(exist) then
set exist = false
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY and (exist))
set itemF = UnitItemInSlot(dropper, i)
if(itemF != null) then
set itemType = GetItemTypeId(itemF)
set j = 0
loop
exitwhen(j >= Total)
if(itemType == Ar[j][0]) then
set exist = true
set j = Total
endif
set j = j + 1
endloop
endif
set i = i + 1
endloop
if(not exist) then
call GroupRemoveUnit(Group, dropper)
endif
endif
endif
set dropper = null
set droppedItem = null
set itemF = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit f = null
local integer i = 0
local item itemF = null
local integer itemID = 0
local boolean picked = false
local integer charge = 0
set copy = CopyGroup(Group)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set i = 0
set picked = false
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(f, i)
if(itemF != null) then
set itemID = GetItemUserData(itemF)
set picked = LoadBoolean(AttackCountItems_Ht, itemID, PICKED_KEY)
if(picked) then
set charge = LoadInteger(AttackCountItems_Ht, itemID, CHARGE_KEY)
call SetItemCharges(itemF, charge)
endif
endif
set i = i + 1
endloop
endloop
set itemF = null
endfunction
//----------------------------------------------------------------
private function Attack_Actions takes nothing returns nothing
local unit attacker = GetAttacker()
local player owner = GetOwningPlayer(attacker)
local unit attacked = GetTriggerUnit()
local integer i = 0
local item itemF = null
local integer itemID = 0
local boolean picked = false
local integer index = 0
local integer times = 0
local boolean hit = false
local boolean done = false
local integer charge = 0
local unit f = null
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(attacker, i)
if(itemF != null) then
set itemID = GetItemUserData(itemF)
set picked = LoadBoolean(AttackCountItems_Ht, itemID, PICKED_KEY)
if(picked) then
set index = LoadInteger(AttackCountItems_Ht, itemID, INDEX_KEY)
set times = LoadInteger(AttackCountItems_Ht, itemID, TIMES_KEY)
set hit = LoadBoolean(AttackCountItems_Ht, itemID, HIT_KEY)
set done = LoadBoolean(AttackCountItems_Ht, itemID, DONE_KEY)
set charge = LoadInteger(AttackCountItems_Ht, itemID, CHARGE_KEY)
if(times > 1) then
set times = times - 1
call SaveInteger(AttackCountItems_Ht, itemID, TIMES_KEY, times)
elseif(not hit) then
if(Ar[index][3] == 1) then
call UnitAddAbility(attacker, Ar[index][2])
call SetPlayerAbilityAvailable(owner, Ar[index][2], false)
elseif(Ar[index][3] == 0) then
call UnitAddAbility(attacker, Ar[index][2])
endif
set charge = charge + 1
call SaveBoolean(AttackCountItems_Ht, itemID, HIT_KEY, true)
call SaveInteger(AttackCountItems_Ht, itemID, CHARGE_KEY, charge)
call SetItemCharges(itemF, charge)
elseif(not done) then
if(Ar[index][3] == 2) then
call TargetCast(owner, GetUnitX(attacker), GetUnitY(attacker), Duration[index][0], Ar[index][2], 1, Cast[index][0], 0, attacked)
elseif(Ar[index][3] == 4) then
call TargetCast(owner, GetUnitX(attacker), GetUnitY(attacker), Duration[index][0], Ar[index][2], 1, Cast[index][0], 0, attacker)
elseif(Ar[index][3] == 5) then
call ImmediateCast(owner, GetUnitX(attacked), GetUnitY(attacked), Duration[index][0], Ar[index][2], 1, Cast[index][0], 0)
elseif(Ar[index][3] == 6) then
call GroupEnumUnitsInRange(all, GetUnitX(attacker), GetUnitY(attacker), Ar[index][4], bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
call TargetCast(owner, GetUnitX(attacker), GetUnitY(attacker), Duration[index][0], Ar[index][2], 1, Cast[index][0], 0, f)
endloop
endif
set charge = charge - 1
set charge = IMaxBJ(charge, 0)
call SaveBoolean(AttackCountItems_Ht, itemID, DONE_KEY, true)
call SaveInteger(AttackCountItems_Ht, itemID, CHARGE_KEY, charge)
call SetItemCharges(itemF, 0)
else
if(Ar[index][3] == 0 or Ar[index][3] == 1) then
call UnitRemoveAbility(attacker, Ar[index][2])
endif
call SaveInteger(AttackCountItems_Ht, itemID, TIMES_KEY, Ar[index][1])
call SaveBoolean(AttackCountItems_Ht, itemID, HIT_KEY, false)
call SaveBoolean(AttackCountItems_Ht, itemID, DONE_KEY, false)
endif
endif
endif
set i = i + 1
endloop
set attacker = null
set owner = null
set attacked = null
set itemF = null
set f = null
endfunction
//----------------------------------------------------------------
private function Attack_Conditions takes nothing returns boolean
local unit attacker = GetAttacker()
local boolean okey = IsUnitInGroup(attacker, Group)
set attacker = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger AttackCountItemsTrg = CreateTrigger()
local trigger AttackCountItemsDropTrg = CreateTrigger()
local trigger AttackCountItemsCheckTrg = CreateTrigger()
local trigger AttackCountItemsAttackTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(AttackCountItemsTrg, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(AttackCountItemsTrg, Condition(function Pick_Conditions))
call TriggerAddAction(AttackCountItemsTrg, function Pick_Actions)
call TriggerRegisterAnyUnitEventBJ(AttackCountItemsDropTrg, EVENT_PLAYER_UNIT_DROP_ITEM)
call TriggerAddAction(AttackCountItemsDropTrg, function Drop_Actions)
call TriggerRegisterTimerEventPeriodic(AttackCountItemsCheckTrg, 1.0)
call TriggerAddAction(AttackCountItemsCheckTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(AttackCountItemsAttackTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(AttackCountItemsAttackTrg, Condition(function Attack_Conditions))
call TriggerAddAction(AttackCountItemsAttackTrg, function Attack_Actions)
//setting globals
set AttackCountItems_Ht = InitHashtable()
set Group = CreateGroup()
set copy = CreateGroup()
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Index
//0 - Item id
//1 - Attack counts
//2 - Ability add or launch,
//3 - Mode (1 - give ability to hero, 2 - cast ability to target, 3 - cast ability to attacker, 4 - cast immediate ability to target, 5 - cast point ability to target allies, 6 - add item to hero)
//4 - Radius
set Total = 11
set Ar[0][0] = 'I00T' //Hardspike Beetle
set Ar[0][1] = 10
set Ar[0][2] = 'A00X'
set Ar[0][3] = 1
set Ar[0][4] = 0
set Ar[1][0] = 'I00U' //Skull Crusher
set Ar[1][1] = 5
set Ar[1][2] = 'Awrs'
set Ar[1][3] = 5
set Ar[1][4] = 0
set Ar[2][0] = 'I001' //Coral Spire
set Ar[2][1] = 6
set Ar[2][2] = 'A00K'
set Ar[2][3] = 2
set Ar[2][4] = 0
set Ar[3][0] = 'I00V' //Retiarius Stinger
set Ar[3][1] = 3
set Ar[3][2] = 'A014'
set Ar[3][3] = 2
set Ar[3][4] = 0
set Ar[4][0] = 'I002' //Heaven Rapier
set Ar[4][1] = 3
set Ar[4][2] = 'A01F'
set Ar[4][3] = 1
set Ar[4][4] = 0
set Ar[5][0] = 'I011' //Fist of Firebringer
set Ar[5][1] = 10
set Ar[5][2] = 'ACbl'
set Ar[5][3] = 6
set Ar[5][4] = 500
set Ar[6][0] = 'I01X' //Oversurge
set Ar[6][1] = 3
set Ar[6][2] = 'A02X'
set Ar[6][3] = 4
set Ar[6][4] = 0
set Ar[7][0] = 'I01W' //Ghost Veil
set Ar[7][1] = 1
set Ar[7][2] = 'A032'
set Ar[7][3] = 4
set Ar[7][4] = 0
set Ar[8][0] = 'I028' //Stormanifer
set Ar[8][1] = 5
set Ar[8][2] = 'AOcl'
set Ar[8][3] = 2
set Ar[8][4] = 0
set Ar[9][0] = 'ajen' //Ralex Hawk
set Ar[9][1] = 4
set Ar[9][2] = 'ACsh'
set Ar[9][3] = 2
set Ar[9][4] = 0
set Ar[10][0] = 'afac' //Ralex Hawk
set Ar[10][1] = 6
set Ar[10][2] = 'ACst'
set Ar[10][3] = 2
set Ar[10][4] = 0
set Cast[0][0] = ""
set Cast[1][0] = "stomp"
set Cast[2][0] = "slow"
set Cast[3][0] = "slow"
set Cast[4][0] = ""
set Cast[5][0] = "bloodlust"
set Cast[6][0] = "slow"
set Cast[7][0] = "slow"
set Cast[8][0] = "chainlightning"
set Cast[9][0] = "shockwave"
set Cast[10][0] = "shockwave"
set Duration[0][0] = 0.0
set Duration[1][0] = 1.0
set Duration[2][0] = 1.0
set Duration[3][0] = 1.0
set Duration[4][0] = 1.0
set Duration[5][0] = 1.0
set Duration[6][0] = 1.0
set Duration[7][0] = 1.0
set Duration[8][0] = 7.0
set Duration[9][0] = 1.0
set Duration[10][0] = 1.0
endfunction
endscope
//TESH.scrollpos=428
//TESH.alwaysfold=0
scope DefendCooldownItems initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer PICKED_KEY = 0
private constant integer UNIT_KEY = 1
private constant integer INDEX_KEY = 2
private constant integer TIMES_KEY = 3
private constant integer HIT_KEY = 4
private constant integer CHARGE_KEY = 5
private constant integer DELAY_KEY = 6
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private integer array Ar[5][5]
private string array Cast[5][1]
private integer Total
private hashtable DefendCooldownItems_Ht
private group Group
private group copy
endglobals
//----------------------------------------------------------------
private function Pick_Actions takes nothing returns nothing
local unit picker = GetTriggerUnit()
local integer pickerID = GetUnitUserData(picker)
local item pickedItem = GetManipulatedItem()
local integer itemType = GetItemTypeId(pickedItem)
local integer itemID = GetItemUserData(pickedItem)
local integer i = 0
local integer j = 0
local boolean exist = false
local item itemF = null
local integer itemFType = 0
local integer itemFID = 0
local real time = 0.0
local integer hit = 0
local integer charge = 0
local boolean charged = false
local real delay = 0.0
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(picker, i)
if(itemF != null and itemF != pickedItem) then
set itemFType = GetItemTypeId(itemF)
set j = 0
loop
exitwhen(j >= Total)
if(itemFType == Ar[j][0] and itemType == itemFType) then
set exist = true
set itemFID = GetItemUserData(itemF)
set time = LoadReal(DefendCooldownItems_Ht, itemFID, TIMES_KEY)
set hit = LoadInteger(DefendCooldownItems_Ht, itemFID, HIT_KEY)
set charge = LoadInteger(DefendCooldownItems_Ht, itemFID, CHARGE_KEY)
set delay = LoadReal(DefendCooldownItems_Ht, itemFID, DELAY_KEY)
call SaveBoolean(DefendCooldownItems_Ht, itemID, PICKED_KEY, true)
call SaveUnitHandle(DefendCooldownItems_Ht, itemID, UNIT_KEY, picker)
call SaveInteger(DefendCooldownItems_Ht, itemID, INDEX_KEY, j)
call SaveReal(DefendCooldownItems_Ht, itemID, TIMES_KEY, time)
call SaveInteger(DefendCooldownItems_Ht, itemID, HIT_KEY, hit)
call SaveInteger(DefendCooldownItems_Ht, itemID, CHARGE_KEY, charge)
call SaveReal(DefendCooldownItems_Ht, itemID, DELAY_KEY, delay)
call SetItemCharges(pickedItem, charge)
if(charge > 0 and (not charged)) then
set charged = true
endif
set j = Total
set i = bj_MAX_INVENTORY
endif
set j = j + 1
endloop
endif
set i = i + 1
endloop
if(not exist) then
set i = 0
loop
exitwhen(i >= Total)
if(itemType == Ar[i][0]) then
if(not IsUnitInGroup(picker, Group)) then
call GroupAddUnit(Group, picker)
endif
call SaveBoolean(DefendCooldownItems_Ht, itemID, PICKED_KEY, true)
call SaveUnitHandle(DefendCooldownItems_Ht, itemID, UNIT_KEY, picker)
call SaveInteger(DefendCooldownItems_Ht, itemID, INDEX_KEY, i)
call SaveReal(DefendCooldownItems_Ht, itemID, TIMES_KEY, I2R(Ar[i][1]))
call SaveInteger(DefendCooldownItems_Ht, itemID, HIT_KEY, 0)
call SaveInteger(DefendCooldownItems_Ht, itemID, CHARGE_KEY, 0)
call SaveReal(DefendCooldownItems_Ht, itemID, DELAY_KEY, 0.0)
set i = Total
endif
set i = i + 1
endloop
endif
set picker = null
set pickedItem = null
set itemF = null
endfunction
//----------------------------------------------------------------
private function Pick_Conditions takes nothing returns boolean
local unit picker = GetTriggerUnit()
local item itemPicked = GetManipulatedItem()
local integer itemId = GetItemTypeId(itemPicked)
local boolean allow = false
local integer i = 0
local boolean exist = false
if(GetItemType(itemPicked) == ITEM_TYPE_PERMANENT) then
set i = 0
loop
exitwhen(i >= Total)
if(itemId == Ar[i][0]) then
set exist = true
set i = Total
endif
set i = i + 1
endloop
if(exist) then
call Item_SetId(itemPicked)
set allow = Item_OwningConditions(picker, itemPicked) and IsUnitType(picker, UNIT_TYPE_HERO)
endif
endif
set picker = null
set itemPicked = null
return allow
endfunction
//----------------------------------------------------------------
private function Drop_Actions takes nothing returns nothing
local unit dropper = GetTriggerUnit()
local integer dropperID = GetUnitUserData(dropper)
local item droppedItem = GetManipulatedItem()
local integer itemType = GetItemTypeId(droppedItem)
local integer itemID = GetItemUserData(droppedItem)
local integer i = 0
local integer j = 0
local boolean exist = false
local item itemF = null
local integer itemFType = 0
local integer itemFID = 0
local integer index = 0
if(GetItemType(droppedItem) == ITEM_TYPE_PERMANENT) then
set i = 0
loop
exitwhen(i >= Total)
if(itemType == Ar[i][0]) then
set index = i
set exist = true
call UnitRemoveAbility(dropper, Ar[i][2])
call FlushChildHashtable(DefendCooldownItems_Ht, itemID)
set i = Total
endif
set i = i + 1
endloop
if(exist) then
set exist = false
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY and (exist))
set itemF = UnitItemInSlot(dropper, i)
if(itemF != null) then
if(itemF != droppedItem) then
set itemFType = GetItemTypeId(itemF)
set j = 0
loop
exitwhen(j >= Total)
if(itemType == Ar[j][0] and itemFType == Ar[j][0]) then
set exist = true
set j = Total
endif
set j = j + 1
endloop
endif
endif
set i = i + 1
endloop
if(not exist) then
call GroupRemoveUnit(Group, dropper)
else
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(dropper, i)
if(itemF != null) then
set itemFType = GetItemTypeId(itemF)
set itemFID = GetItemUserData(itemF)
if(itemFType == itemType) then
call SaveReal(DefendCooldownItems_Ht, itemFID, TIMES_KEY, I2R(Ar[index][1]))
call SaveInteger(DefendCooldownItems_Ht, itemFID, HIT_KEY, 0)
call SaveInteger(DefendCooldownItems_Ht, itemFID, CHARGE_KEY, 0)
call SaveReal(DefendCooldownItems_Ht, itemFID, DELAY_KEY, 0.0)
call SetItemCharges(itemF, 0)
endif
endif
set i = i + 1
endloop
endif
endif
endif
set dropper = null
set droppedItem = null
set itemF = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit f = null
local integer i = 0
local item itemF = null
local integer itemID = 0
local boolean picked = false
local integer index = 0
local real time = 0.0
local integer hit = 0
local integer charge = 0
local real delay = 0.0
set copy = CopyGroup(Group)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set i = 0
set picked = false
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(f, i)
if(itemF != null) then
set itemID = GetItemUserData(itemF)
set picked = LoadBoolean(DefendCooldownItems_Ht, itemID, PICKED_KEY)
if(picked) then
set index = LoadInteger(DefendCooldownItems_Ht, itemID, INDEX_KEY)
set time = LoadReal(DefendCooldownItems_Ht, itemID, TIMES_KEY)
set hit = LoadInteger(DefendCooldownItems_Ht, itemID, HIT_KEY)
set charge = LoadInteger(DefendCooldownItems_Ht, itemID, CHARGE_KEY)
set delay = LoadReal(DefendCooldownItems_Ht, itemID, DELAY_KEY)
if(hit == 0 or hit == 1) then
if(time > 0) then
set time = time - 0.5
elseif(charge < Ar[index][4]) then
if(Ar[index][3] == 1) then
call UnitAddAbility(f, Ar[index][2])
call SetPlayerAbilityAvailable(GetOwningPlayer(f), Ar[index][2], false)
elseif(Ar[index][3] == 0) then
call UnitAddAbility(f, Ar[index][2])
endif
set charge = charge + 1
set delay = 1.0
set time = Ar[index][1]
call SaveInteger(DefendCooldownItems_Ht, itemID, HIT_KEY, 1)
call SaveInteger(DefendCooldownItems_Ht, itemID, CHARGE_KEY, charge)
endif
call SaveReal(DefendCooldownItems_Ht, itemID, TIMES_KEY, time)
call SaveReal(DefendCooldownItems_Ht, itemID, DELAY_KEY, delay)
call SetItemCharges(itemF, charge)
elseif(hit == 2) then
if(delay > 0) then
set delay = delay - 0.5
else
if(Ar[index][3] == 0 or Ar[index][3] == 1) then
call UnitRemoveAbility(f, Ar[index][2])
endif
set time = I2R(Ar[index][1])
call SaveInteger(DefendCooldownItems_Ht, itemID, HIT_KEY, 0)
call SaveReal(DefendCooldownItems_Ht, itemID, DELAY_KEY, 0.0)
endif
call SaveReal(DefendCooldownItems_Ht, itemID, TIMES_KEY, time)
call SaveReal(DefendCooldownItems_Ht, itemID, DELAY_KEY, delay)
endif
endif
endif
set i = i + 1
endloop
endloop
set f = null
set itemF = null
endfunction
//----------------------------------------------------------------
private function Attack_Actions takes nothing returns nothing
local unit attacked = GetTriggerUnit()
local player owner = GetOwningPlayer(attacked)
local unit attacker = GetAttacker()
local integer i = 0
local item itemF = null
local integer itemID = 0
local boolean picked = false
local integer index = 0
local integer hit = 0
local real time = 0.0
local integer charge = 0
local real delay = 0.0
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(attacked, i)
if(itemF != null) then
set itemID = GetItemUserData(itemF)
set picked = LoadBoolean(DefendCooldownItems_Ht, itemID, PICKED_KEY)
if(picked) then
set index = LoadInteger(DefendCooldownItems_Ht, itemID, INDEX_KEY)
set time = LoadReal(DefendCooldownItems_Ht, itemID, TIMES_KEY)
set hit = LoadInteger(DefendCooldownItems_Ht, itemID, HIT_KEY)
set charge = LoadInteger(DefendCooldownItems_Ht, itemID, CHARGE_KEY)
set delay = LoadReal(DefendCooldownItems_Ht, itemID, DELAY_KEY)
if(hit == 1) then
if(Ar[index][3] == 2) then
call TargetCast(owner, GetUnitX(attacked), GetUnitY(attacked), 1.0, Ar[index][2], 1, Cast[index][0], 0, attacked)
elseif(Ar[index][3] == 3) then
if(not IsUnitDead(attacked) and (not IsUnitPaused(attacked))) then
call UnitAddItemById(attacked, Ar[index][2])
endif
elseif(Ar[index][3] == 4) then
call TargetCast(owner, GetUnitX(attacker), GetUnitY(attacker), 1.0, Ar[index][2], 1, Cast[index][0], 0, attacker)
endif
if(charge > 0) then
if(charge == 1) then
call SaveInteger(DefendCooldownItems_Ht, itemID, HIT_KEY, 2)
endif
set charge = charge - 1
set charge = IMaxBJ(charge, 0)
call SaveInteger(DefendCooldownItems_Ht, itemID, CHARGE_KEY, charge)
call SetItemCharges(itemF, charge)
endif
endif
endif
endif
set i = i + 1
endloop
set attacker = null
set owner = null
set attacked = null
set itemF = null
endfunction
//----------------------------------------------------------------
private function Attack_Conditions takes nothing returns boolean
local unit attacked = GetTriggerUnit()
local boolean okey = IsUnitInGroup(attacked, Group)
set attacked = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger AttackCooldownItemsTrg = CreateTrigger()
local trigger AttackCooldownItemsDropTrg = CreateTrigger()
local trigger AttackCooldownItemsCooldownTrg = CreateTrigger()
local trigger AttackCooldownItemsAttackTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(AttackCooldownItemsTrg, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(AttackCooldownItemsTrg, Condition(function Pick_Conditions))
call TriggerAddAction(AttackCooldownItemsTrg, function Pick_Actions)
call TriggerRegisterAnyUnitEventBJ(AttackCooldownItemsDropTrg, EVENT_PLAYER_UNIT_DROP_ITEM)
call TriggerAddAction(AttackCooldownItemsDropTrg, function Drop_Actions)
call TriggerRegisterTimerEventPeriodic(AttackCooldownItemsCooldownTrg, 0.5)
call TriggerAddAction(AttackCooldownItemsCooldownTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(AttackCooldownItemsAttackTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(AttackCooldownItemsAttackTrg, Condition(function Attack_Conditions))
call TriggerAddAction(AttackCooldownItemsAttackTrg, function Attack_Actions)
//setting globals
set DefendCooldownItems_Ht = InitHashtable()
set Group = CreateGroup()
set copy = CreateGroup()
//0 - Item id
//1 - Cooldown time second
//2 - Ability
//3 - Mode (1 - give ability to hero, 2 - cast ability to hero, 3 - give item to hero, 4 - cast ability to target)
//4 - Charge
set Total = 5
set Ar[0][0] = 'evtl' //Talisman of Evasion
set Ar[0][1] = 5
set Ar[0][2] = 'A02A'
set Ar[0][3] = 1
set Ar[0][4] = 1
set Ar[1][0] = 'rde3' //Robust shield
set Ar[1][1] = 4
set Ar[1][2] = 'A03R'
set Ar[1][3] = 1
set Ar[1][4] = 1
set Ar[2][0] = 'I025' //Encease Siege
set Ar[2][1] = 2
set Ar[2][2] = 'A03Q'
set Ar[2][3] = 1
set Ar[2][4] = 3
set Ar[3][0] = 'I020' //Elven Leafcoat
set Ar[3][1] = 20
set Ar[3][2] = 'shen'
set Ar[3][3] = 3
set Ar[3][4] = 1
set Ar[4][0] = 'I01Y' //Crown of Malediction
set Ar[4][1] = 8
set Ar[4][2] = 'ACsl'
set Ar[4][3] = 4
set Ar[4][4] = 3
set Cast[0][0] = ""
set Cast[1][0] = ""
set Cast[2][0] = ""
set Cast[3][0] = ""
set Cast[4][0] = "sleep"
endfunction
endscope
//TESH.scrollpos=367
//TESH.alwaysfold=0
scope DefendCountItems initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer PICKED_KEY = 0
private constant integer UNIT_KEY = 1
private constant integer INDEX_KEY = 2
private constant integer TIMES_KEY = 3
private constant integer HIT_KEY = 4
private constant integer DONE_KEY = 5
private constant integer CHARGE_KEY = 6
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private integer array Ar[4][5]
private string array Cast[4][1]
private integer Total
private hashtable DefendCountItems_Ht
private group Group
private group copy
endglobals
//----------------------------------------------------------------
private function Pick_Actions takes nothing returns nothing
local unit picker = GetTriggerUnit()
local integer pickerID = GetUnitUserData(picker)
local item pickedItem = GetManipulatedItem()
local integer itemType = GetItemTypeId(pickedItem)
local integer itemID = GetItemUserData(pickedItem)
local integer i = 0
local integer j = 0
local boolean exist = false
local item itemF = null
local integer itemFType = 0
local integer itemFID = 0
local integer times = 0
local boolean hit = false
local boolean done = false
local integer charge = 0
local boolean charged = false
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(picker, i)
if(itemF != null and itemF != pickedItem) then
set itemFType = GetItemTypeId(itemF)
set j = 0
loop
exitwhen(j >= Total)
if(itemFType == Ar[j][0] and itemType == itemFType) then
set exist = true
set itemFID = GetItemUserData(itemF)
set times = LoadInteger(DefendCountItems_Ht, itemFID, TIMES_KEY)
set hit = LoadBoolean(DefendCountItems_Ht, itemFID, HIT_KEY)
set done = LoadBoolean(DefendCountItems_Ht, itemFID, DONE_KEY)
set charge = LoadInteger(DefendCountItems_Ht, itemFID, CHARGE_KEY)
call SaveBoolean(DefendCountItems_Ht, itemID, PICKED_KEY, true)
call SaveUnitHandle(DefendCountItems_Ht, itemID, UNIT_KEY, picker)
call SaveInteger(DefendCountItems_Ht, itemID, INDEX_KEY, j)
call SaveInteger(DefendCountItems_Ht, itemID, TIMES_KEY, times)
call SaveBoolean(DefendCountItems_Ht, itemID, HIT_KEY, hit)
call SaveBoolean(DefendCountItems_Ht, itemID, DONE_KEY, done)
call SaveInteger(DefendCountItems_Ht, itemID, CHARGE_KEY, charge)
call SetItemCharges(pickedItem, charge)
if(charge > 0 and (not charged)) then
set charged = true
endif
set j = Total
set i = bj_MAX_INVENTORY
endif
set j = j + 1
endloop
endif
set i = i + 1
endloop
if(not exist) then
set i = 0
loop
exitwhen(i >= Total)
if(itemType == Ar[i][0]) then
if(not IsUnitInGroup(picker, Group)) then
call GroupAddUnit(Group, picker)
endif
call SaveBoolean(DefendCountItems_Ht, itemID, PICKED_KEY, true)
call SaveUnitHandle(DefendCountItems_Ht, itemID, UNIT_KEY, picker)
call SaveInteger(DefendCountItems_Ht, itemID, INDEX_KEY, i)
call SaveInteger(DefendCountItems_Ht, itemID, TIMES_KEY, Ar[i][1])
call SaveBoolean(DefendCountItems_Ht, itemID, HIT_KEY, false)
call SaveBoolean(DefendCountItems_Ht, itemID, DONE_KEY, false)
call SaveInteger(DefendCountItems_Ht, itemID, CHARGE_KEY, 0)
set i = Total
endif
set i = i + 1
endloop
endif
set picker = null
set pickedItem = null
set itemF = null
endfunction
//----------------------------------------------------------------
private function Pick_Conditions takes nothing returns boolean
local unit picker = GetTriggerUnit()
local item itemPicked = GetManipulatedItem()
local integer itemId = GetItemTypeId(itemPicked)
local boolean allow = false
local integer i = 0
local boolean exist = false
if(GetItemType(itemPicked) == ITEM_TYPE_PERMANENT) then
set i = 0
loop
exitwhen(i >= Total)
if(itemId == Ar[i][0]) then
set exist = true
set i = Total
endif
set i = i + 1
endloop
if(exist) then
call Item_SetId(itemPicked)
set allow = Item_OwningConditions(picker, itemPicked) and IsUnitType(picker, UNIT_TYPE_HERO)
endif
endif
set picker = null
set itemPicked = null
return allow
endfunction
//----------------------------------------------------------------
private function Drop_Actions takes nothing returns nothing
local unit dropper = GetTriggerUnit()
local integer dropperID = GetUnitUserData(dropper)
local item droppedItem = GetManipulatedItem()
local integer itemType = GetItemTypeId(droppedItem)
local integer itemID = GetItemUserData(droppedItem)
local integer i = 0
local integer j = 0
local boolean exist = false
local item itemF = null
if(GetItemType(droppedItem) == ITEM_TYPE_PERMANENT) then
set i = 0
loop
exitwhen(i >= Total)
if(itemType == Ar[i][0]) then
set exist = true
call UnitRemoveAbility(dropper, Ar[i][2])
call FlushChildHashtable(DefendCountItems_Ht, itemID)
set i = Total
endif
set i = i + 1
endloop
if(exist) then
set exist = false
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY and (exist))
set itemF = UnitItemInSlot(dropper, i)
if(itemF != null) then
set itemType = GetItemTypeId(itemF)
set j = 0
loop
exitwhen(j >= Total)
if(itemType == Ar[j][0]) then
set exist = true
set j = Total
endif
set j = j + 1
endloop
endif
set i = i + 1
endloop
if(not exist) then
call GroupRemoveUnit(Group, dropper)
endif
endif
endif
set dropper = null
set droppedItem = null
set itemF = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit f = null
local integer i = 0
local item itemF = null
local integer itemID = 0
local boolean picked = false
local integer index = 0
local integer charge = 0
set copy = CopyGroup(Group)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set i = 0
set picked = false
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(f, i)
if(itemF != null) then
set itemID = GetItemUserData(itemF)
set picked = LoadBoolean(DefendCountItems_Ht, itemID, PICKED_KEY)
if(picked) then
set index = LoadInteger(DefendCountItems_Ht, itemID, INDEX_KEY)
set charge = LoadInteger(DefendCountItems_Ht, itemID, CHARGE_KEY)
call SetItemCharges(itemF, charge)
endif
endif
set i = i + 1
endloop
endloop
set f = null
set itemF = null
endfunction
//----------------------------------------------------------------
private function Attack_Actions takes nothing returns nothing
local unit attacked = GetTriggerUnit()
local player owner = GetOwningPlayer(attacked)
local unit attacker = GetAttacker()
local integer i = 0
local item itemF = null
local integer itemID = 0
local boolean picked = false
local integer index = 0
local integer times = 0
local boolean hit = false
local boolean done = false
local integer charge = 0
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(attacked, i)
if(itemF != null) then
set itemID = GetItemUserData(itemF)
set picked = LoadBoolean(DefendCountItems_Ht, itemID, PICKED_KEY)
if(picked) then
set index = LoadInteger(DefendCountItems_Ht, itemID, INDEX_KEY)
set times = LoadInteger(DefendCountItems_Ht, itemID, TIMES_KEY)
set hit = LoadBoolean(DefendCountItems_Ht, itemID, HIT_KEY)
set done = LoadBoolean(DefendCountItems_Ht, itemID, DONE_KEY)
set charge = LoadInteger(DefendCountItems_Ht, itemID, CHARGE_KEY)
if(times > 1) then
set times = times - 1
call SaveInteger(DefendCountItems_Ht, itemID, TIMES_KEY, times)
elseif(not hit) then
if(Ar[index][3] == 1) then
call UnitAddAbility(attacked, Ar[index][2])
call SetPlayerAbilityAvailable(owner, Ar[index][2], false)
elseif(Ar[index][3] == 0) then
call UnitAddAbility(attacked, Ar[index][2])
endif
set charge = charge + 1
call SaveBoolean(DefendCountItems_Ht, itemID, HIT_KEY, true)
call SaveInteger(DefendCountItems_Ht, itemID, CHARGE_KEY, charge)
call SetItemCharges(itemF, charge)
elseif(not done) then
if(Ar[index][3] == 2) then
call TargetCast(owner, GetUnitX(attacker), GetUnitY(attacker), 1.0, Ar[index][2], 1, Cast[index][0], 0, attacker)
elseif(Ar[index][3] == 3) then
if(not IsUnitDead(attacked) and (not IsUnitPaused(attacked))) then
call UnitAddItemById(attacked, Ar[index][2])
endif
elseif(Ar[index][3] == 4) then
call TargetCast(owner, GetUnitX(attacked), GetUnitY(attacked), 1.0, Ar[index][2], 1, Cast[index][0], 0, attacked)
endif
set charge = charge - 1
set charge = IMaxBJ(charge, 0)
call SaveBoolean(DefendCountItems_Ht, itemID, DONE_KEY, true)
call SaveInteger(DefendCountItems_Ht, itemID, CHARGE_KEY, charge)
call SetItemCharges(itemF, 0)
else
if(Ar[index][3] == 0 or Ar[index][3] == 1) then
call UnitRemoveAbility(attacked, Ar[index][2])
endif
call SaveInteger(DefendCountItems_Ht, itemID, TIMES_KEY, Ar[index][1])
call SaveBoolean(DefendCountItems_Ht, itemID, HIT_KEY, false)
call SaveBoolean(DefendCountItems_Ht, itemID, DONE_KEY, false)
endif
endif
endif
set i = i + 1
endloop
set attacker = null
set owner = null
set attacked = null
set itemF = null
endfunction
//----------------------------------------------------------------
private function Attack_Conditions takes nothing returns boolean
local unit attacked = GetTriggerUnit()
local boolean okey = IsUnitInGroup(attacked, Group)
set attacked = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger DefendCountItemsTrg = CreateTrigger()
local trigger DefendCountItemsDropTrg = CreateTrigger()
local trigger DefendCountItemsCheckTrg = CreateTrigger()
local trigger DefendCountItemsAttackTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(DefendCountItemsTrg, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(DefendCountItemsTrg, Condition(function Pick_Conditions))
call TriggerAddAction(DefendCountItemsTrg, function Pick_Actions)
call TriggerRegisterAnyUnitEventBJ(DefendCountItemsDropTrg, EVENT_PLAYER_UNIT_DROP_ITEM)
call TriggerAddAction(DefendCountItemsDropTrg, function Drop_Actions)
call TriggerRegisterTimerEventPeriodic(DefendCountItemsCheckTrg, 1.0)
call TriggerAddAction(DefendCountItemsCheckTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(DefendCountItemsAttackTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(DefendCountItemsAttackTrg, Condition(function Attack_Conditions))
call TriggerAddAction(DefendCountItemsAttackTrg, function Attack_Actions)
//setting globals
set DefendCountItems_Ht = InitHashtable()
set Group = CreateGroup()
set copy = CreateGroup()
//0 - Item id
//1 - Count attacked
//2 - Ability or item id
//3 - Mode (1 - give ability to hero, 2 - , 3 - give item to hero)
set Total = 4
set Ar[0][0] = 'I01K' //Void Artifice
set Ar[0][1] = 5
set Ar[0][2] = 'A02A'
set Ar[0][3] = 1
set Ar[1][0] = 'I01U' //Royaltouch
set Ar[1][1] = 12
set Ar[1][2] = 'envl'
set Ar[1][3] = 3
set Ar[2][0] = 'anfg' //Brutalic
set Ar[2][1] = 15
set Ar[2][2] = 'frhg'
set Ar[2][3] = 3
set Ar[3][0] = 'clfm' //Diamond Escutcheon
set Ar[3][1] = 3
set Ar[3][2] = 'A02A'
set Ar[3][3] = 1
set Cast[0][0] = ""
set Cast[1][0] = ""
set Cast[2][0] = ""
set Cast[3][0] = ""
endfunction
endscope
//TESH.scrollpos=328
//TESH.alwaysfold=0
scope CooldownItems initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer PICKED_KEY = 0
private constant integer UNIT_KEY = 1
private constant integer INDEX_KEY = 2
private constant integer TIMES_KEY = 3
private constant integer CHARGE_KEY = 4
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private integer array Ar[7][5]
private string array Cast[7][1]
private real array Duration[7][1]
private integer Total
private hashtable CooldownItems_Ht
private group Group
private group copy
endglobals
//----------------------------------------------------------------
private function Pick_Actions takes nothing returns nothing
local unit picker = GetTriggerUnit()
local integer pickerID = GetUnitUserData(picker)
local item pickedItem = GetManipulatedItem()
local integer itemType = GetItemTypeId(pickedItem)
local integer itemID = GetItemUserData(pickedItem)
local integer i = 0
local integer j = 0
local boolean exist = false
local item itemF = null
local integer itemFType = 0
local integer itemFID = 0
local real time = 0.0
local integer charge = 0
local boolean charged = false
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(picker, i)
if(itemF != null and itemF != pickedItem) then
set itemFType = GetItemTypeId(itemF)
set j = 0
loop
exitwhen(j >= Total)
if(itemFType == Ar[j][0] and itemType == itemFType) then
set exist = true
set itemFID = GetItemUserData(itemF)
set time = LoadReal(CooldownItems_Ht, itemFID, TIMES_KEY)
set charge = LoadInteger(CooldownItems_Ht, itemFID, CHARGE_KEY)
call SaveBoolean(CooldownItems_Ht, itemID, PICKED_KEY, true)
call SaveUnitHandle(CooldownItems_Ht, itemID, UNIT_KEY, picker)
call SaveInteger(CooldownItems_Ht, itemID, INDEX_KEY, j)
call SaveReal(CooldownItems_Ht, itemID, TIMES_KEY, time)
call SaveInteger(CooldownItems_Ht, itemID, CHARGE_KEY, charge)
call SetItemCharges(pickedItem, charge)
if(charge > 0 and (not charged)) then
set charged = true
endif
set j = Total
set i = bj_MAX_INVENTORY
endif
set j = j + 1
endloop
endif
set i = i + 1
endloop
if(not exist) then
set i = 0
loop
exitwhen(i >= Total)
if(itemType == Ar[i][0]) then
if(not IsUnitInGroup(picker, Group)) then
call GroupAddUnit(Group, picker)
endif
call SaveBoolean(CooldownItems_Ht, itemID, PICKED_KEY, true)
call SaveUnitHandle(CooldownItems_Ht, itemID, UNIT_KEY, picker)
call SaveInteger(CooldownItems_Ht, itemID, INDEX_KEY, i)
call SaveReal(CooldownItems_Ht, itemID, TIMES_KEY, I2R(Ar[i][1]))
call SaveInteger(CooldownItems_Ht, itemID, CHARGE_KEY, 0)
set i = Total
endif
set i = i + 1
endloop
endif
set picker = null
set pickedItem = null
set itemF = null
endfunction
//----------------------------------------------------------------
private function Pick_Conditions takes nothing returns boolean
local unit picker = GetTriggerUnit()
local item itemPicked = GetManipulatedItem()
local integer itemId = GetItemTypeId(itemPicked)
local boolean allow = false
local integer i = 0
local boolean exist = false
if(GetItemType(itemPicked) == ITEM_TYPE_PERMANENT) then
set i = 0
loop
exitwhen(i >= Total)
if(itemId == Ar[i][0]) then
set exist = true
set i = Total
endif
set i = i + 1
endloop
if(exist) then
call Item_SetId(itemPicked)
set allow = Item_OwningConditions(picker, itemPicked) and IsUnitType(picker, UNIT_TYPE_HERO)
endif
endif
set picker = null
set itemPicked = null
return allow
endfunction
//----------------------------------------------------------------
private function Drop_Actions takes nothing returns nothing
local unit dropper = GetTriggerUnit()
local integer dropperID = GetUnitUserData(dropper)
local item droppedItem = GetManipulatedItem()
local integer itemType = GetItemTypeId(droppedItem)
local integer itemID = GetItemUserData(droppedItem)
local integer i = 0
local integer j = 0
local boolean exist = false
local item itemF = null
local integer itemFType = 0
local integer itemFID = 0
local integer index = 0
if(GetItemType(droppedItem) == ITEM_TYPE_PERMANENT) then
set i = 0
loop
exitwhen(i >= Total)
if(itemType == Ar[i][0]) then
set index = i
set exist = true
call UnitRemoveAbility(dropper, Ar[i][2])
call FlushChildHashtable(CooldownItems_Ht, itemID)
set i = Total
endif
set i = i + 1
endloop
if(exist) then
set exist = false
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY and (exist))
set itemF = UnitItemInSlot(dropper, i)
if(itemF != null) then
if(itemF != droppedItem) then
set itemFType = GetItemTypeId(itemF)
set j = 0
loop
exitwhen(j >= Total)
if(itemType == Ar[j][0] and itemFType == Ar[j][0]) then
set exist = true
set j = Total
endif
set j = j + 1
endloop
endif
endif
set i = i + 1
endloop
if(not exist) then
call GroupRemoveUnit(Group, dropper)
else
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(dropper, i)
if(itemF != null) then
set itemFType = GetItemTypeId(itemF)
set itemFID = GetItemUserData(itemF)
if(itemFType == itemType) then
call SaveReal(CooldownItems_Ht, itemFID, TIMES_KEY, I2R(Ar[index][1]))
call SaveInteger(CooldownItems_Ht, itemFID, CHARGE_KEY, 0)
call SetItemCharges(itemF, 0)
endif
endif
set i = i + 1
endloop
endif
endif
endif
set dropper = null
set droppedItem = null
set itemF = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit f = null
local integer i = 0
local item itemF = null
local integer itemID = 0
local boolean picked = false
local integer index = 0
local real time = 0.0
local integer charge = 0
set copy = CopyGroup(Group)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set i = 0
set picked = false
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(f, i)
if(itemF != null) then
set itemID = GetItemUserData(itemF)
set picked = LoadBoolean(CooldownItems_Ht, itemID, PICKED_KEY)
if(picked) then
set index = LoadInteger(CooldownItems_Ht, itemID, INDEX_KEY)
set time = LoadReal(CooldownItems_Ht, itemID, TIMES_KEY)
set charge = LoadInteger(CooldownItems_Ht, itemID, CHARGE_KEY)
if(time > 0) then
set time = time - 0.5
elseif(charge < Ar[index][4]) then
set charge = charge + 1
set time = I2R(Ar[index][1])
if(charge >= Ar[index][4]) then
set charge = 0
if(Ar[index][3] == 1) then
if(not IsUnitDead(f) and (not IsUnitPaused(f))) then
call UnitAddItemById(f, Ar[index][2])
endif
elseif(Ar[index][3] == 2) then
call TargetCast(GetOwningPlayer(f), GetUnitX(f), GetUnitY(f), Duration[index][2], Ar[index][2], 1, Cast[index][0], 0, f)
elseif(Ar[index][3] == 3) then
call ImmediateCast(GetOwningPlayer(f), GetUnitX(f), GetUnitY(f), Duration[index][2], Ar[index][2], 1, Cast[index][0], 0)
endif
endif
call SaveInteger(CooldownItems_Ht, itemID, CHARGE_KEY, charge)
else
set time = I2R(Ar[index][1])
endif
call SaveReal(CooldownItems_Ht, itemID, TIMES_KEY, time)
call SetItemCharges(itemF, charge)
endif
endif
set i = i + 1
endloop
endloop
set itemF = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger CooldownItemsTrg = CreateTrigger()
local trigger CooldownItemsDropTrg = CreateTrigger()
local trigger CooldownItemsCooldownTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(CooldownItemsTrg, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(CooldownItemsTrg, Condition(function Pick_Conditions))
call TriggerAddAction(CooldownItemsTrg, function Pick_Actions)
call TriggerRegisterAnyUnitEventBJ(CooldownItemsDropTrg, EVENT_PLAYER_UNIT_DROP_ITEM)
call TriggerAddAction(CooldownItemsDropTrg, function Drop_Actions)
call TriggerRegisterTimerEventPeriodic(CooldownItemsCooldownTrg, 0.5)
call TriggerAddAction(CooldownItemsCooldownTrg, function Actions)
//setting globals
set CooldownItems_Ht = InitHashtable()
set Group = CreateGroup()
set copy = CreateGroup()
//Index
//0 - Item id
//1 - Cooldown time
//2 - Ability id or item id
//3 - Mode (1 - give item to hero, 2 - give ability to hero, 3 - cast ability immediate)
//4 - Charge
set Total = 7
set Ar[0][0] = 'I00B' //Spider Ring
set Ar[0][1] = 5
set Ar[0][2] = 'rej4'
set Ar[0][3] = 1
set Ar[0][4] = 1
set Ar[1][0] = 'rst1' //Hypergloves
set Ar[1][1] = 30
set Ar[1][2] = 'brag'
set Ar[1][3] = 1
set Ar[1][4] = 1
set Ar[2][0] = 'I01T' //Sneaker of Exzel
set Ar[2][1] = 20
set Ar[2][2] = 'bfhr'
set Ar[2][3] = 1
set Ar[2][4] = 1
set Ar[3][0] = 'I01H' //Wrist of Hercules
set Ar[3][1] = 15
set Ar[3][2] = 'pams'
set Ar[3][3] = 1
set Ar[3][4] = 1
set Ar[4][0] = 'I016' //Jungle Runner
set Ar[4][1] = 50
set Ar[4][2] = 'jdrn'
set Ar[4][3] = 1
set Ar[4][4] = 1
set Ar[5][0] = 'rnsp' //Ivory Halo
set Ar[5][1] = 5
set Ar[5][2] = 'sprn'
set Ar[5][3] = 1
set Ar[5][4] = 1
set Ar[6][0] = 'I023' //Orenda Spectrum
set Ar[6][1] = 25
set Ar[6][2] = 'pgin'
set Ar[6][3] = 1
set Ar[6][4] = 1
set Cast[0][0] = ""
set Cast[1][0] = ""
set Cast[2][0] = ""
set Cast[3][0] = ""
set Cast[4][0] = ""
set Cast[5][0] = ""
set Cast[6][0] = ""
set Duration[0][0] = 0.0
set Duration[1][0] = 0.0
set Duration[2][0] = 0.0
set Duration[3][0] = 0.0
set Duration[4][0] = 0.0
set Duration[5][0] = 0.0
set Duration[6][0] = 0.0
endfunction
endscope
//TESH.scrollpos=14
//TESH.alwaysfold=0
scope CastCooldownItems initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer PICKED_KEY = 0
private constant integer UNIT_KEY = 1
private constant integer INDEX_KEY = 2
private constant integer TIMES_KEY = 3
private constant integer CHARGE_KEY = 4
private constant real RADIUS_DETECT_TARGET = 500.0 //Detect random target when target is area
endglobals
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false)
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private integer array Ar[1][5]
private string array Cast[1][1]
private real array Duration[1][1]
private integer Total
private hashtable CastCooldownItems_Ht
private group Group
private group copy
private group all
private location loc
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
return Targets(GetFilterUnit())
endfunction
//----------------------------------------------------------------
private function Pick_Actions takes nothing returns nothing
local unit picker = GetTriggerUnit()
local integer pickerID = GetUnitUserData(picker)
local item pickedItem = GetManipulatedItem()
local integer itemType = GetItemTypeId(pickedItem)
local integer itemID = GetItemUserData(pickedItem)
local integer i = 0
local integer j = 0
local boolean exist = false
local item itemF = null
local integer itemFType = 0
local integer itemFID = 0
local real time = 0.0
local integer charge = 0
local boolean charged = false
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(picker, i)
if(itemF != null and itemF != pickedItem) then
set itemFType = GetItemTypeId(itemF)
set j = 0
loop
exitwhen(j >= Total)
if(itemFType == Ar[j][0] and itemType == itemFType) then
set exist = true
set itemFID = GetItemUserData(itemF)
set time = LoadReal(CastCooldownItems_Ht, itemFID, TIMES_KEY)
set charge = LoadInteger(CastCooldownItems_Ht, itemFID, CHARGE_KEY)
call SaveBoolean(CastCooldownItems_Ht, itemID, PICKED_KEY, true)
call SaveUnitHandle(CastCooldownItems_Ht, itemID, UNIT_KEY, picker)
call SaveInteger(CastCooldownItems_Ht, itemID, INDEX_KEY, j)
call SaveReal(CastCooldownItems_Ht, itemID, TIMES_KEY, time)
call SaveInteger(CastCooldownItems_Ht, itemID, CHARGE_KEY, charge)
call SetItemCharges(pickedItem, charge)
if(charge > 0 and (not charged)) then
set charged = true
endif
set j = Total
set i = bj_MAX_INVENTORY
endif
set j = j + 1
endloop
endif
set i = i + 1
endloop
if(not exist) then
set i = 0
loop
exitwhen(i >= Total)
if(itemType == Ar[i][0]) then
if(not IsUnitInGroup(picker, Group)) then
call GroupAddUnit(Group, picker)
endif
call SaveBoolean(CastCooldownItems_Ht, itemID, PICKED_KEY, true)
call SaveUnitHandle(CastCooldownItems_Ht, itemID, UNIT_KEY, picker)
call SaveInteger(CastCooldownItems_Ht, itemID, INDEX_KEY, i)
call SaveReal(CastCooldownItems_Ht, itemID, TIMES_KEY, I2R(Ar[i][1]))
call SaveInteger(CastCooldownItems_Ht, itemID, CHARGE_KEY, 0)
set i = Total
endif
set i = i + 1
endloop
endif
set picker = null
set pickedItem = null
set itemF = null
endfunction
//----------------------------------------------------------------
private function Pick_Conditions takes nothing returns boolean
local unit picker = GetTriggerUnit()
local item itemPicked = GetManipulatedItem()
local integer itemId = GetItemTypeId(itemPicked)
local boolean allow = false
local integer i = 0
local boolean exist = false
if(GetItemType(itemPicked) == ITEM_TYPE_PERMANENT) then
set i = 0
loop
exitwhen(i >= Total)
if(itemId == Ar[i][0]) then
set exist = true
set i = Total
endif
set i = i + 1
endloop
if(exist) then
call Item_SetId(itemPicked)
set allow = Item_OwningConditions(picker, itemPicked) and IsUnitType(picker, UNIT_TYPE_HERO)
endif
endif
set picker = null
set itemPicked = null
return allow
endfunction
//----------------------------------------------------------------
private function Drop_Actions takes nothing returns nothing
local unit dropper = GetTriggerUnit()
local integer dropperID = GetUnitUserData(dropper)
local item droppedItem = GetManipulatedItem()
local integer itemType = GetItemTypeId(droppedItem)
local integer itemID = GetItemUserData(droppedItem)
local integer i = 0
local integer j = 0
local boolean exist = false
local item itemF = null
local integer itemFType = 0
local integer itemFID = 0
local integer index = 0
if(GetItemType(droppedItem) == ITEM_TYPE_PERMANENT) then
set i = 0
loop
exitwhen(i >= Total)
if(itemType == Ar[i][0]) then
set index = i
set exist = true
call UnitRemoveAbility(dropper, Ar[i][2])
call FlushChildHashtable(CastCooldownItems_Ht, itemID)
set i = Total
endif
set i = i + 1
endloop
if(exist) then
set exist = false
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY and (exist))
set itemF = UnitItemInSlot(dropper, i)
if(itemF != null) then
if(itemF != droppedItem) then
set itemFType = GetItemTypeId(itemF)
set j = 0
loop
exitwhen(j >= Total)
if(itemType == Ar[j][0] and itemFType == Ar[j][0]) then
set exist = true
set j = Total
endif
set j = j + 1
endloop
endif
endif
set i = i + 1
endloop
if(not exist) then
call GroupRemoveUnit(Group, dropper)
else
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(dropper, i)
if(itemF != null) then
set itemFType = GetItemTypeId(itemF)
set itemFID = GetItemUserData(itemF)
if(itemFType == itemType) then
call SaveReal(CastCooldownItems_Ht, itemFID, 0, I2R(Ar[index][1]))
call SaveInteger(CastCooldownItems_Ht, itemFID, 1, 0)
call SetItemCharges(itemF, 0)
endif
endif
set i = i + 1
endloop
endif
endif
endif
set dropper = null
set droppedItem = null
set itemF = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit f = null
local integer i = 0
local item itemF = null
local integer itemID = 0
local boolean picked = false
local integer index = 0
local real time = 0.0
local integer charge = 0
set copy = CopyGroup(Group)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set i = 0
set picked = false
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(f, i)
if(itemF != null) then
set itemID = GetItemUserData(itemF)
set picked = LoadBoolean(CastCooldownItems_Ht, itemID, PICKED_KEY)
if(picked) then
set index = LoadInteger(CastCooldownItems_Ht, itemID, INDEX_KEY)
set time = LoadReal(CastCooldownItems_Ht, itemID, TIMES_KEY)
set charge = LoadInteger(CastCooldownItems_Ht, itemID, CHARGE_KEY)
if(time > 0) then
set time = time - 0.5
elseif(charge < Ar[index][4]) then
set charge = charge + 1
set time = I2R(Ar[index][1])
call SaveInteger(CastCooldownItems_Ht, itemID, CHARGE_KEY, charge)
else
set time = I2R(Ar[index][1])
endif
call SaveReal(CastCooldownItems_Ht, itemID, TIMES_KEY, time)
call SetItemCharges(itemF, charge)
endif
endif
set i = i + 1
endloop
endloop
set f = null
set itemF = null
endfunction
//----------------------------------------------------------------
private function Cast_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
local unit target = GetSpellTargetUnit()
local real targetX = casterX
local real targetY = casterY
local integer i = 0
local item itemF = null
local integer itemID = 0
local boolean picked = false
local integer index = 0
local real time = 0.0
local integer charge = 0
local unit f = null
local real fX = 0.0
local real fY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local real targetDistance = 0.0
if(target == null) then
set loc = GetSpellTargetLoc()
if(loc != null) then
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
else
set targetX = casterX
set targetY = casterY
endif
else
set targetX = casterX
set targetY = casterY
endif
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(caster, i)
if(itemF != null) then
set itemID = GetItemUserData(itemF)
set picked = LoadBoolean(CastCooldownItems_Ht, itemID, PICKED_KEY)
if(picked) then
set index = LoadInteger(CastCooldownItems_Ht, itemID, INDEX_KEY)
set time = LoadReal(CastCooldownItems_Ht, itemID, TIMES_KEY)
set charge = LoadInteger(CastCooldownItems_Ht, itemID, CHARGE_KEY)
if(charge > 0) then
if(Ar[index][3] == 2) then
if(target != null) then
if(IsUnitEnemy(target, owner)) then
call TargetCast(owner, GetUnitX(caster), GetUnitY(caster), Duration[index][0], Ar[index][2], 1, Cast[index][0], 0, target)
set charge = charge - 1
endif
else
set target = null
set targetDistance = 0.0
call GroupEnumUnitsInRange(all, targetX, targetY, RADIUS_DETECT_TARGET, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, owner) and IsUnitType(f, UNIT_TYPE_HERO)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = targetX - fX
set dy = targetY - fY
set distance = SquareRoot(dx * dx + dy * dy)
if(target == null) then
set target = f
set targetDistance = distance
elseif(distance < targetDistance) then
set target = f
set targetDistance = distance
endif
endif
endloop
if(target != null) then
call TargetCast(owner, GetUnitX(caster), GetUnitY(caster), Duration[index][0], Ar[index][2], 1, "", 852230, target)
else
call GroupEnumUnitsInRange(all, targetX, targetY, RADIUS_DETECT_TARGET, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, owner)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = targetX - fX
set dy = targetY - fY
set distance = SquareRoot(dx * dx + dy * dy)
if(target == null) then
set target = f
set targetDistance = distance
elseif(distance < targetDistance) then
set target = f
set targetDistance = distance
endif
endif
endloop
if(target != null) then
call TargetCast(owner, GetUnitX(caster), GetUnitY(caster), Duration[index][0], Ar[index][2], 1, "", 852230, target)
else
set charge = charge + 1
endif
endif
call TargetCast(owner, GetUnitX(caster), GetUnitY(caster), Duration[index][0], Ar[index][2], 1, Cast[index][0], 0, target)
set charge = charge - 1
endif
elseif(Ar[index][3] == 3) then
if(target != null) then
if(IsUnitEnemy(target, owner)) then
call PointCast(owner, GetUnitX(caster), GetUnitY(caster), Duration[index][0], Ar[index][2], 1, Cast[index][0], 0, GetUnitX(target), GetUnitY(target))
set charge = charge - 1
endif
else
set target = null
set targetDistance = 0.0
call GroupEnumUnitsInRange(all, targetX, targetY, RADIUS_DETECT_TARGET, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, owner) and IsUnitType(f, UNIT_TYPE_HERO)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = targetX - fX
set dy = targetY - fY
set distance = SquareRoot(dx * dx + dy * dy)
if(target == null) then
set target = f
set targetDistance = distance
elseif(distance < targetDistance) then
set target = f
set targetDistance = distance
endif
endif
endloop
if(target != null) then
call TargetCast(owner, GetUnitX(caster), GetUnitY(caster), Duration[index][0], Ar[index][2], 1, "", 852230, target)
else
call GroupEnumUnitsInRange(all, targetX, targetY, RADIUS_DETECT_TARGET, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, owner)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = targetX - fX
set dy = targetY - fY
set distance = SquareRoot(dx * dx + dy * dy)
if(target == null) then
set target = f
set targetDistance = distance
elseif(distance < targetDistance) then
set target = f
set targetDistance = distance
endif
endif
endloop
if(target != null) then
call TargetCast(owner, GetUnitX(caster), GetUnitY(caster), Duration[index][0], Ar[index][2], 1, "", 852230, target)
else
set charge = charge + 1
endif
endif
call PointCast(owner, GetUnitX(caster), GetUnitY(caster), Duration[index][0], Ar[index][2], 1, Cast[index][0], 0, GetUnitX(target), GetUnitY(target))
set charge = charge - 1
endif
elseif(Ar[index][3] == 4) then
call TargetCast(owner, GetUnitX(caster), GetUnitY(caster), Duration[index][0], Ar[index][2], 1, Cast[index][0], 0, caster)
set charge = charge - 1
elseif(Ar[index][3] == 5) then
if(not IsUnitDead(caster)) then
set charge = charge - 1
endif
elseif(Ar[index][3] == 100) then
if(target != null) then
call TargetCast(owner, GetUnitX(caster), GetUnitY(caster), Duration[index][0], Ar[index][2], 1, "", 852230, target)
set charge = charge - 1
else
set target = null
set targetDistance = 0.0
call GroupEnumUnitsInRange(all, targetX, targetY, RADIUS_DETECT_TARGET, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, owner) and IsUnitType(f, UNIT_TYPE_HERO)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = targetX - fX
set dy = targetY - fY
set distance = SquareRoot(dx * dx + dy * dy)
if(target == null) then
set target = f
set targetDistance = distance
elseif(distance < targetDistance) then
set target = f
set targetDistance = distance
endif
endif
endloop
if(target != null) then
call TargetCast(owner, GetUnitX(caster), GetUnitY(caster), Duration[index][0], Ar[index][2], 1, "", 852230, target)
else
call GroupEnumUnitsInRange(all, targetX, targetY, RADIUS_DETECT_TARGET, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, owner)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = targetX - fX
set dy = targetY - fY
set distance = SquareRoot(dx * dx + dy * dy)
if(target == null) then
set target = f
set targetDistance = distance
elseif(distance < targetDistance) then
set target = f
set targetDistance = distance
endif
endif
endloop
if(target != null) then
call TargetCast(owner, GetUnitX(caster), GetUnitY(caster), Duration[index][0], Ar[index][2], 1, "", 852230, target)
else
set charge = charge + 1
endif
endif
set charge = charge - 1
endif
endif
set charge = IMaxBJ(charge, 0)
//call SaveReal(CastCooldownItems_Ht, itemID, TIMES_KEY, I2R(Ar[index][1]))
call SaveInteger(CastCooldownItems_Ht, itemID, CHARGE_KEY, charge)
call SetItemCharges(itemF, charge)
if(Ar[index][3] == 5) then
if(not IsUnitDead(caster) and (not IsUnitPaused(caster))) then
call UnitAddItemById(caster, Ar[index][2])
set charge = charge - 1
endif
endif
endif
endif
endif
set i = i + 1
endloop
set caster = null
set owner = null
set target = null
set itemF = null
set f = null
endfunction
//----------------------------------------------------------------
private function Cast_Conditions takes nothing returns boolean
local unit caster = GetTriggerUnit()
local integer spell = GetSpellAbilityId()
local boolean okey = IsUnitInGroup(caster, Group) and (GetUnitAbilityLevel(caster, spell) > 0)
set caster = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger CastCooldownItemsTrg = CreateTrigger()
local trigger CastCooldownItemsDropTrg = CreateTrigger()
local trigger CastCooldownItemsCooldownTrg = CreateTrigger()
local trigger CastCooldownItemsCastTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(CastCooldownItemsTrg, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(CastCooldownItemsTrg, Condition(function Pick_Conditions))
call TriggerAddAction(CastCooldownItemsTrg, function Pick_Actions)
call TriggerRegisterAnyUnitEventBJ(CastCooldownItemsDropTrg, EVENT_PLAYER_UNIT_DROP_ITEM)
call TriggerAddAction(CastCooldownItemsDropTrg, function Drop_Actions)
call TriggerRegisterTimerEventPeriodic(CastCooldownItemsCooldownTrg, 0.5)
call TriggerAddAction(CastCooldownItemsCooldownTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(CastCooldownItemsCastTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(CastCooldownItemsCastTrg, Condition(function Cast_Conditions))
call TriggerAddAction(CastCooldownItemsCastTrg, function Cast_Actions)
//setting globals
set CastCooldownItems_Ht = InitHashtable()
set Group = CreateGroup()
set copy = CreateGroup()
set all = CreateGroup()
set loc = Location(0.0, 0.0)
set bexpr = Condition(function Pick)
//Index
//0 - Item id
//1 - Cooldown time
//2 - Ability add or launch
//3 - Mode (1 - enemy cast, give ability to hero,
//2 - enemy cast, cast ability to target,
//3 - enemy cast, cast point ability to target,
//4 - universal cast, cast ability to hero,
//5 - universal spell, give item to hero,
//100 - enemy cast, cast finger of death to target)
//4 - Charge
set Total = 1
set Ar[0][0] = 'I01V' //Power Fragment
set Ar[0][1] = 20
set Ar[0][2] = 'blba'
set Ar[0][3] = 5
set Ar[0][4] = 3
set Ar[1][0] = 'I01N' //Staff of Flamecurse
set Ar[1][1] = 24
set Ar[1][2] = 'A02G'
set Ar[1][3] = 2
set Ar[1][4] = 2
set Ar[2][0] = 'I01O' //Bloodeye Lynch
set Ar[2][1] = 15
set Ar[2][2] = 'AIfz'
set Ar[2][3] = 100
set Ar[2][4] = 1
set Ar[3][0] = 'I01S' //Havocrave Dissever
set Ar[3][1] = 15
set Ar[3][2] = 'ANfd'
set Ar[3][3] = 100
set Ar[3][4] = 2
set Cast[0][0] = ""
set Cast[1][0] = "soulburn"
set Cast[2][0] = ""
set Cast[3][0] = "forkedlightning"
set Duration[0][0] = 0.0
set Duration[1][0] = 1.0
set Duration[2][0] = 0.0
set Duration[3][0] = 1.0
endfunction
endscope
//TESH.scrollpos=387
//TESH.alwaysfold=0
scope TargetCooldownItems initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer PICKED_KEY = 0
private constant integer UNIT_KEY = 1
private constant integer INDEX_KEY = 2
private constant integer TIMES_KEY = 3
private constant integer CHARGE_KEY = 4
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
//----------------------------------------------------------------
globals
private integer array Ar[1][5]
private string array Cast[1][1]
private real array Duration[1][1]
private integer Total
private hashtable TargetCooldownItems_Ht
private group Group
private group copy
endglobals
//----------------------------------------------------------------
private function Pick_Actions takes nothing returns nothing
local unit picker = GetTriggerUnit()
local integer pickerID = GetUnitUserData(picker)
local item pickedItem = GetManipulatedItem()
local integer itemType = GetItemTypeId(pickedItem)
local integer itemID = GetItemUserData(pickedItem)
local integer i = 0
local integer j = 0
local boolean exist = false
local item itemF = null
local integer itemFType = 0
local integer itemFID = 0
local real time = 0.0
local integer charge = 0
local boolean charged = false
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(picker, i)
if(itemF != null and itemF != pickedItem) then
set itemFType = GetItemTypeId(itemF)
set j = 0
loop
exitwhen(j >= Total)
if(itemFType == Ar[j][0] and itemType == itemFType) then
set exist = true
set itemFID = GetItemUserData(itemF)
set time = LoadReal(TargetCooldownItems_Ht, itemFID, TIMES_KEY)
set charge = LoadInteger(TargetCooldownItems_Ht, itemFID, CHARGE_KEY)
call SaveBoolean(TargetCooldownItems_Ht, itemID, PICKED_KEY, true)
call SaveUnitHandle(TargetCooldownItems_Ht, itemID, UNIT_KEY, picker)
call SaveInteger(TargetCooldownItems_Ht, itemID, INDEX_KEY, j)
call SaveReal(TargetCooldownItems_Ht, itemID, TIMES_KEY, time)
call SaveInteger(TargetCooldownItems_Ht, itemID, CHARGE_KEY, charge)
call SetItemCharges(pickedItem, charge)
if(charge > 0 and (not charged)) then
set charged = true
endif
set j = Total
set i = bj_MAX_INVENTORY
endif
set j = j + 1
endloop
endif
set i = i + 1
endloop
if(not exist) then
set i = 0
loop
exitwhen(i >= Total)
if(itemType == Ar[i][0]) then
if(not IsUnitInGroup(picker, Group)) then
call GroupAddUnit(Group, picker)
endif
call SaveBoolean(TargetCooldownItems_Ht, itemID, PICKED_KEY, true)
call SaveUnitHandle(TargetCooldownItems_Ht, itemID, UNIT_KEY, picker)
call SaveInteger(TargetCooldownItems_Ht, itemID, INDEX_KEY, i)
call SaveReal(TargetCooldownItems_Ht, itemID, TIMES_KEY, I2R(Ar[i][1]))
call SaveInteger(TargetCooldownItems_Ht, itemID, CHARGE_KEY, 0)
set i = Total
endif
set i = i + 1
endloop
endif
set picker = null
set pickedItem = null
set itemF = null
endfunction
//----------------------------------------------------------------
private function Pick_Conditions takes nothing returns boolean
local unit picker = GetTriggerUnit()
local item itemPicked = GetManipulatedItem()
local integer itemId = GetItemTypeId(itemPicked)
local boolean allow = false
local integer i = 0
local boolean exist = false
if(GetItemType(itemPicked) == ITEM_TYPE_PERMANENT) then
set i = 0
loop
exitwhen(i >= Total)
if(itemId == Ar[i][0]) then
set exist = true
set i = Total
endif
set i = i + 1
endloop
if(exist) then
call Item_SetId(itemPicked)
set allow = Item_OwningConditions(picker, itemPicked) and IsUnitType(picker, UNIT_TYPE_HERO)
endif
endif
set picker = null
set itemPicked = null
return allow
endfunction
//----------------------------------------------------------------
private function Drop_Actions takes nothing returns nothing
local unit dropper = GetTriggerUnit()
local integer dropperID = GetUnitUserData(dropper)
local item droppedItem = GetManipulatedItem()
local integer itemType = GetItemTypeId(droppedItem)
local integer itemID = GetItemUserData(droppedItem)
local integer i = 0
local integer j = 0
local boolean exist = false
local item itemF = null
local integer itemFType = 0
local integer itemFID = 0
local integer index = 0
if(GetItemType(droppedItem) == ITEM_TYPE_PERMANENT) then
set i = 0
loop
exitwhen(i >= Total)
if(itemType == Ar[i][0]) then
set index = i
set exist = true
call UnitRemoveAbility(dropper, Ar[i][2])
call FlushChildHashtable(TargetCooldownItems_Ht, itemID)
set i = Total
endif
set i = i + 1
endloop
if(exist) then
set exist = false
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY and (exist))
set itemF = UnitItemInSlot(dropper, i)
if(itemF != null) then
if(itemF != droppedItem) then
set itemFType = GetItemTypeId(itemF)
set j = 0
loop
exitwhen(j >= Total)
if(itemType == Ar[j][0] and itemFType == Ar[j][0]) then
set exist = true
set j = Total
endif
set j = j + 1
endloop
endif
endif
set i = i + 1
endloop
if(not exist) then
call GroupRemoveUnit(Group, dropper)
else
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(dropper, i)
if(itemF != null) then
set itemFType = GetItemTypeId(itemF)
set itemFID = GetItemUserData(itemF)
if(itemFType == itemType) then
call SaveReal(TargetCooldownItems_Ht, itemFID, TIMES_KEY, I2R(Ar[index][1]))
call SaveInteger(TargetCooldownItems_Ht, itemFID, CHARGE_KEY, 0)
call SetItemCharges(itemF, 0)
endif
endif
set i = i + 1
endloop
endif
endif
endif
set dropper = null
set droppedItem = null
set itemF = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit f = null
local integer i = 0
local item itemF = null
local integer itemID = 0
local boolean picked = false
local integer index = 0
local real time = 0.0
local integer charge = 0
set copy = CopyGroup(Group)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(f, i)
if(itemF != null) then
set itemID = GetItemUserData(itemF)
set picked = LoadBoolean(TargetCooldownItems_Ht, itemID, PICKED_KEY)
if(picked) then
set index = LoadInteger(TargetCooldownItems_Ht, itemID, INDEX_KEY)
set time = LoadReal(TargetCooldownItems_Ht, itemID, TIMES_KEY)
set charge = LoadInteger(TargetCooldownItems_Ht, itemID, CHARGE_KEY)
if(time > 0) then
set time = time - 0.5
elseif(charge < Ar[index][4]) then
set charge = charge + 1
set time = I2R(Ar[index][1])
call SaveInteger(TargetCooldownItems_Ht, itemID, CHARGE_KEY, charge)
else
set time = I2R(Ar[index][1])
endif
call SaveReal(TargetCooldownItems_Ht, itemID, TIMES_KEY, time)
call SetItemCharges(itemF, charge)
endif
endif
set i = i + 1
endloop
endloop
set f = null
set itemF = null
endfunction
//----------------------------------------------------------------
private function Target_Actions takes nothing returns nothing
local unit target = GetSpellTargetUnit()
local player owner = GetOwningPlayer(target)
local unit caster = GetTriggerUnit()
local player ownerCaster = GetOwningPlayer(caster)
local boolean typeCaster = IsUnitType(caster, UNIT_TYPE_HERO)
local unit hero = GetHero(ownerCaster)
local integer i = 0
local item itemF = null
local integer itemID = 0
local boolean picked = false
local integer index = 0
local real time = 0.0
local integer charge = 0
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(target, i)
if(itemF != null) then
set itemID = GetItemUserData(itemF)
set picked = LoadBoolean(TargetCooldownItems_Ht, itemID, PICKED_KEY)
if(picked) then
set index = LoadInteger(TargetCooldownItems_Ht, itemID, INDEX_KEY)
set time = LoadReal(TargetCooldownItems_Ht, itemID, TIMES_KEY)
set charge = LoadInteger(TargetCooldownItems_Ht, itemID, CHARGE_KEY)
if(charge > 0) then
if(Ar[index][3] == 2) then
if(IsUnitEnemy(caster, owner)) then
if(typeCaster) then
call TargetCast(owner, GetUnitX(target), GetUnitY(target), Duration[index][0], Ar[index][2], 1, Cast[index][0], 0, caster)
else
call TargetCast(owner, GetUnitX(target), GetUnitY(target), Duration[index][0], Ar[index][2], 1, Cast[index][0], 0, hero)
endif
endif
elseif(Ar[index][3] == 3) then
if(IsUnitEnemy(caster, owner)) then
if(typeCaster) then
call PointCast(owner, GetUnitX(target), GetUnitY(target), Duration[index][0], Ar[index][2], 1, Cast[index][0], 0, GetUnitX(hero), GetUnitY(hero))
else
call PointCast(owner, GetUnitX(target), GetUnitY(target), Duration[index][0], Ar[index][2], 1, Cast[index][0], 0, GetUnitX(caster), GetUnitY(caster))
endif
endif
elseif(Ar[index][3] == 4) then
call TargetCast(owner, GetUnitX(target), GetUnitY(target), Duration[index][0], Ar[index][2], 1, Cast[index][0], 0, target)
endif
set charge = charge - 1
set charge = IMaxBJ(charge, 0)
//call SaveReal(TargetCooldownItems_Ht, itemID, TIMES_KEY, I2R(Ar[index][1]))
call SaveInteger(TargetCooldownItems_Ht, itemID, CHARGE_KEY, charge)
call SetItemCharges(itemF, charge)
if(Ar[index][3] == 5) then
if(not IsUnitDead(target) and (not IsUnitPaused(target))) then
call UnitAddItemById(target, Ar[index][2])
endif
endif
endif
endif
endif
set i = i + 1
endloop
set target = null
set owner = null
set caster = null
set ownerCaster = null
set hero = null
set itemF = null
endfunction
//----------------------------------------------------------------
private function Target_Conditions takes nothing returns boolean
local unit target = GetSpellTargetUnit()
local unit caster = GetTriggerUnit()
local player owner = GetOwningPlayer(caster)
local unit hero = GetHero(owner)
local boolean allow = (target != null) and (IsUnitType(caster, UNIT_TYPE_HERO) or (hero != null))
local boolean okey = IsUnitInGroup(target, Group) and allow
set target = null
set caster = null
set owner = null
set hero = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger TargetCooldownItemsTrg = CreateTrigger()
local trigger TargetCooldownItemsDropTrg = CreateTrigger()
local trigger TargetCooldownItemsCooldownTrg = CreateTrigger()
local trigger TargetCooldownItemsCastTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(TargetCooldownItemsTrg, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(TargetCooldownItemsTrg, Condition(function Pick_Conditions))
call TriggerAddAction(TargetCooldownItemsTrg, function Pick_Actions)
call TriggerRegisterAnyUnitEventBJ(TargetCooldownItemsDropTrg, EVENT_PLAYER_UNIT_DROP_ITEM)
call TriggerAddAction(TargetCooldownItemsDropTrg, function Drop_Actions)
call TriggerRegisterTimerEventPeriodic(TargetCooldownItemsCooldownTrg, 0.5)
call TriggerAddAction(TargetCooldownItemsCooldownTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(TargetCooldownItemsCastTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(TargetCooldownItemsCastTrg, Condition(function Target_Conditions))
call TriggerAddAction(TargetCooldownItemsCastTrg, function Target_Actions)
//setting globals
set TargetCooldownItems_Ht = InitHashtable()
set Group = CreateGroup()
set copy = CreateGroup()
//Index
//0 - Item id
//1 - Cooldown time
//2 - Ability add or launch
//3 - Mode (1
//2 - enemy cast, cast ability to target,
//3 - enemy cast, cast point ability to target,
//4 - universal cast, cast ability to hero,
//5 - universal spell, give item to hero
//4 - Charge
set Total = 0
//set Ar[0][0] = 'ssil' //Sunstalker
//set Ar[0][1] = 24
//set Ar[0][2] = 'A095'
//set Ar[0][3] = 2
//set Ar[0][4] = 4
//set Cast[0][0] = "soulburn"
//set Duration[0][0] = 1.0
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope Storage initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer UNIT_ID = 'hgyr' //Unit Flying Storage rawcode
private constant string MESSAGE = "|cffff0000Flying Storage cannot leave the base!|r" //Message
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
endglobals
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit leaver = GetLeavingUnit()
local player owner = GetOwningPlayer(leaver)
call DisplayTextToPlayer(owner, 0.0, 0.0, MESSAGE)
call SetUnitX(leaver, GetPlayerStartLocationX(owner))
call SetUnitY(leaver, GetPlayerStartLocationY(owner))
call SetUnitPosition(leaver, GetUnitX(leaver), GetUnitY(leaver))
set leaver = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetUnitTypeId(GetLeavingUnit()) == UNIT_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger StorageTrg = CreateTrigger()
call TriggerRegisterLeaveRectSimple(StorageTrg, gg_rct_Luminous_Base)
call TriggerAddCondition(StorageTrg, Condition(function Conditions))
call TriggerAddAction(StorageTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=5
//TESH.alwaysfold=0
scope RuneRestoration initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer ITEM1_ID = 'lmbr' //Item Rune of restoration rawcode
private constant integer ITEM2_ID = 'rre1' //Item Rune of restoration rawcode
private constant real HP_BASE_GAIN1 = 100 //Hitpoints base gain
private constant real HP_GAIN1 = 0.1 //Hitpoints gain
private constant real MP_BASE_GAIN1 = 50 //Manapoints base gain
private constant real MP_GAIN1 = 0.05 //Manapoints gain
private constant real HP_BASE_GAIN2 = 200 //Hitpoints base gain
private constant real HP_GAIN2 = 0.2 //Hitpoints gain
private constant real MP_BASE_GAIN2 = 100 //Manapoints base gain
private constant real MP_GAIN2 = 0.1 //Manapoints gain
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Items\\AIre\\AIreTarget.mdl" //Effect heal
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit picker = GetTriggerUnit()
local item pickedItem = GetManipulatedItem()
if(GetItemTypeId(pickedItem) == ITEM1_ID) then
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, picker, "origin"))
call SetUnitState(picker, UNIT_STATE_LIFE, GetUnitState(picker, UNIT_STATE_LIFE) + HP_BASE_GAIN1 + GetUnitState(picker, UNIT_STATE_MAX_LIFE) * HP_GAIN1)
call SetUnitState(picker, UNIT_STATE_MANA, GetUnitState(picker, UNIT_STATE_MANA) + MP_BASE_GAIN1 + GetUnitState(picker, UNIT_STATE_MAX_MANA) * MP_GAIN1)
elseif(GetItemTypeId(pickedItem) == ITEM2_ID) then
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, picker, "origin"))
call SetUnitState(picker, UNIT_STATE_LIFE, GetUnitState(picker, UNIT_STATE_LIFE) + HP_BASE_GAIN2 + GetUnitState(picker, UNIT_STATE_MAX_LIFE) * HP_GAIN2)
call SetUnitState(picker, UNIT_STATE_MANA, GetUnitState(picker, UNIT_STATE_MANA) + MP_BASE_GAIN2 + GetUnitState(picker, UNIT_STATE_MAX_MANA) * MP_GAIN2)
endif
set picker = null
set pickedItem = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local item pickedItem = GetManipulatedItem()
local boolean okey = GetItemTypeId(pickedItem) == ITEM1_ID or /*
*/GetItemTypeId(pickedItem) == ITEM2_ID
set pickedItem = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger RuneRestorationTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(RuneRestorationTrg, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(RuneRestorationTrg, Condition(function Conditions))
call TriggerAddAction(RuneRestorationTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=6
//TESH.alwaysfold=0
scope TabletExperience initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer ITEM1_ID = 'tpow' //Item Tablet of Experience rawcode
private constant integer ITEM2_ID = 'tin2' //Item Greater Tablet of Experience rawcode
private constant integer EXP1_GAIN = 100 //Experience gain
private constant integer EXP2_GAIN = 200 //Experience gain
private constant integer ATT1_GAIN = 1 //Attribute gain
private constant integer ATT2_GAIN = 2 //Attribute gain
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit picker = GetTriggerUnit()
local item pickedItem = GetManipulatedItem()
local integer itemId = GetItemTypeId(pickedItem)
local integer att = 0
if(GetHeroLevel(picker) < 15) then
if(itemId == ITEM1_ID) then
call AddHeroXP(picker, EXP1_GAIN, true)
elseif(itemId == ITEM2_ID) then
call AddHeroXP(picker, EXP2_GAIN, true)
endif
else
set att = GetHeroAttribute(GetUnitTypeId(picker))
if(itemId == ITEM1_ID) then
if(att == 1) then
call SetHeroStr(picker, GetHeroStr(picker, false) + ATT1_GAIN, false)
elseif(att == 2) then
call SetHeroAgi(picker, GetHeroAgi(picker, false) + ATT1_GAIN, false)
elseif(att == 3) then
call SetHeroInt(picker, GetHeroInt(picker, false) + ATT1_GAIN, false)
endif
elseif(itemId == ITEM2_ID) then
if(att == 1) then
call SetHeroStr(picker, GetHeroStr(picker, false) + ATT2_GAIN, false)
elseif(att == 2) then
call SetHeroAgi(picker, GetHeroAgi(picker, false) + ATT2_GAIN, false)
elseif(att == 3) then
call SetHeroInt(picker, GetHeroInt(picker, false) + ATT2_GAIN, false)
endif
endif
endif
set picker = null
set pickedItem = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local item pickedItem = GetManipulatedItem()
local boolean okey = (GetItemTypeId(pickedItem) == ITEM1_ID or GetItemTypeId(pickedItem) == ITEM2_ID)
set pickedItem = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger TabletExperienceTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(TabletExperienceTrg, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(TabletExperienceTrg, Condition(function Conditions))
call TriggerAddAction(TabletExperienceTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=114
//TESH.alwaysfold=0
scope GlyphUltravision initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer ITEM_ID = 'guvi' //Item Glyph of Ultravision rawcode
private constant integer ITEM1_ID = 'tdx2' //Item Rune of restoration rawcode
private constant integer ITEM2_ID = 'gomn' //Item Rune of restoration rawcode
private constant integer ITEM3_ID = 'tint' //Item Rune of restoration rawcode
private constant integer ITEM4_ID = 'texp' //Item Rune of restoration rawcode
private constant integer ITEM5_ID = 'tdex' //Item Rune of restoration rawcode
private constant real DURATION = 30.0 //Duration of reveal
private constant real PING_DURATION = 1.0 //Ping duration
endglobals
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct GlyphUltravision_Data
force f //Owner force
integer i //Owner group index
real d //Duration
endstruct
//----------------------------------------------------------------
globals
private group copy
private timer Tim
private integer Total
private GlyphUltravision_Data array Ar[10]
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local GlyphUltravision_Data sd
local integer i = 0
local integer j = 0
local unit f = null
local player p = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.d > 0.0) then
set sd.d = sd.d - Interval()
else
if(sd.i == 0) then
set copy = CopyGroup(spiritBottomLeft)
elseif(sd.i == 1) then
set copy = CopyGroup(spiritTopLeft)
elseif(sd.i == 2) then
set copy = CopyGroup(spiritTopRight)
elseif(sd.i == 3) then
set copy = CopyGroup(spiritBottomRight)
endif
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set j = 0
loop
exitwhen(j == bj_MAX_PLAYER_SLOTS)
set p = Player(j)
if(IsPlayerInForce(p, sd.f)) then
call UnitShareVision(f, p, false)
endif
set j = j + 1
endloop
endloop
set sd.f = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set p = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local GlyphUltravision_Data sd
local unit picker = GetTriggerUnit()
local player owner = GetOwningPlayer(picker)
local item pickedItem = GetManipulatedItem()
local integer pickedGroupIndex = -1
local force forceOwner = GetPlayerForce(owner)
local integer i = 0
local boolean exist = false
local unit f = null
local real fX = 0.0
local real fY = 0.0
local player p = null
if(pickedItem == Rune_Bottom_Left_Middle) then
set pickedGroupIndex = 0
elseif(pickedItem == Rune_Top_Left_Middle) then
set pickedGroupIndex = 1
elseif(pickedItem == Rune_Top_Right_Middle) then
set pickedGroupIndex = 2
elseif(pickedItem == Rune_Bottom_Right_Middle) then
set pickedGroupIndex = 3
endif
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.i == pickedGroupIndex) then
if(IsPlayerInForce(owner, sd.f)) then
set sd.d = DURATION
set exist = true
set i = Total
endif
endif
set i = i + 1
endloop
if(not exist) then
set sd = GlyphUltravision_Data.create()
set sd.f = forceOwner
set sd.i = pickedGroupIndex
set sd.d = DURATION
if(pickedGroupIndex == 0) then
set copy = CopyGroup(spiritBottomLeft)
elseif(pickedGroupIndex == 1) then
set copy = CopyGroup(spiritTopLeft)
elseif(pickedGroupIndex == 2) then
set copy = CopyGroup(spiritTopRight)
elseif(pickedGroupIndex == 3) then
set copy = CopyGroup(spiritBottomRight)
endif
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set i = 0
loop
exitwhen(i == bj_MAX_PLAYER_SLOTS)
set p = Player(i)
if(IsPlayerInForce(p, forceOwner)) then
call UnitShareVision(f, p, true)
endif
set i = i + 1
endloop
endloop
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
set picker = null
set owner = null
set forceOwner = null
set p = null
set f = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local item pickedItem = GetManipulatedItem()
local boolean okey = GetItemTypeId(pickedItem) == ITEM_ID or /*
*/GetItemTypeId(pickedItem) == ITEM1_ID or /*
*/GetItemTypeId(pickedItem) == ITEM2_ID or /*
*/GetItemTypeId(pickedItem) == ITEM3_ID or /*
*/GetItemTypeId(pickedItem) == ITEM4_ID or /*
*/GetItemTypeId(pickedItem) == ITEM5_ID
set pickedItem = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger GlyphUltravisionTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(GlyphUltravisionTrg, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(GlyphUltravisionTrg, Condition(function Conditions))
call TriggerAddAction(GlyphUltravisionTrg, function Actions)
//setting globals
set copy = CreateGroup()
set Tim = CreateTimer()
set Total = 0
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope Goldcast initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer ITEM_ID = 'I00Z' //Item Goldcast Maccalan rawcode
private constant integer EXTRA_GOLD = 8 //Extra gold credited to killer
private constant string SPECIAL_EFFECT = "UI\\Feedback\\GoldCredit\\GoldCredit.mdl" //Effect gold
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private group goldcaster
endglobals
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit picker = GetTriggerUnit()
call GroupAddUnit(goldcaster, picker)
set picker = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local item pickedItem = GetManipulatedItem()
local boolean okey = GetItemTypeId(pickedItem) == ITEM_ID
set pickedItem = null
return okey
endfunction
//----------------------------------------------------------------
private function Drop_Actions takes nothing returns nothing
local unit dropper = GetTriggerUnit()
call GroupRemoveUnit(goldcaster, dropper)
set dropper = null
endfunction
//----------------------------------------------------------------
private function Drop_Conditions takes nothing returns boolean
local item droppedItem = GetManipulatedItem()
local boolean okey = GetItemTypeId(droppedItem) == ITEM_ID
set droppedItem = null
return okey
endfunction
//----------------------------------------------------------------
private function Kill_Actions takes nothing returns nothing
local unit killer = GetKillingUnit()
local player owner = GetOwningPlayer(killer)
local unit killed = GetTriggerUnit()
local real killedX = GetUnitX(killed)
local real killedY = GetUnitY(killed)
call SetPlayerState(owner, PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(owner, PLAYER_STATE_RESOURCE_GOLD) + EXTRA_GOLD)
call TextTag_AttachUnit( "+" + I2S(EXTRA_GOLD), 8.0 * 0.023 / 10.0, killer, 30.0, /*
*/255, 255, 0, 255, /*
*/Cos(90.0 * bj_DEGTORAD) * 64.0 * 0.071 / 128, Sin(90.0 * bj_DEGTORAD) * 64.0 * 0.071 / 128,/*
*/false, 2.00, 1.0)
set killer = null
set owner = null
set killed = null
endfunction
//----------------------------------------------------------------
private function Kill_Conditions takes nothing returns boolean
return IsUnitInGroup(GetKillingUnit(), goldcaster)
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger GoldcastTrg = CreateTrigger()
local trigger GoldcastDropTrg = CreateTrigger()
local trigger GoldcastKillTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(GoldcastTrg, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(GoldcastTrg, Condition(function Conditions))
call TriggerAddAction(GoldcastTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(GoldcastDropTrg, EVENT_PLAYER_UNIT_DROP_ITEM)
call TriggerAddCondition(GoldcastDropTrg, Condition(function Drop_Conditions))
call TriggerAddAction(GoldcastDropTrg, function Drop_Actions)
call TriggerRegisterAnyUnitEventBJ(GoldcastKillTrg, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(GoldcastKillTrg, Condition(function Kill_Conditions))
call TriggerAddAction(GoldcastKillTrg, function Kill_Actions)
//setting globals
set goldcaster = CreateGroup()
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope JarGreed initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer ITEM_ID = 'lnrn' //Item Jar of Greed rawcode
private constant integer EXTRA_GOLD = 10 //Extra gold credited to killer
private constant string SPECIAL_EFFECT = "UI\\Feedback\\GoldCredit\\GoldCredit.mdl" //Effect gold
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private group greeder
endglobals
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit picker = GetTriggerUnit()
call GroupAddUnit(greeder, picker)
set picker = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local item pickedItem = GetManipulatedItem()
local boolean okey = GetItemTypeId(pickedItem) == ITEM_ID
set pickedItem = null
return okey
endfunction
//----------------------------------------------------------------
private function Drop_Actions takes nothing returns nothing
local unit dropper = GetTriggerUnit()
call GroupRemoveUnit(greeder, dropper)
set dropper = null
endfunction
//----------------------------------------------------------------
private function Drop_Conditions takes nothing returns boolean
local item droppedItem = GetManipulatedItem()
local boolean okey = GetItemTypeId(droppedItem) == ITEM_ID
set droppedItem = null
return okey
endfunction
//----------------------------------------------------------------
private function Kill_Actions takes nothing returns nothing
local unit killer = GetKillingUnit()
local player owner = GetOwningPlayer(killer)
local unit killed = GetTriggerUnit()
local real killedX = GetUnitX(killed)
local real killedY = GetUnitY(killed)
call SetPlayerState(owner, PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(owner, PLAYER_STATE_RESOURCE_GOLD) + EXTRA_GOLD)
call TextTag_AttachUnit( "+" + I2S(EXTRA_GOLD), 8.0 * 0.023 / 10.0, killer, 30.0, /*
*/255, 255, 0, 255, /*
*/Cos(90.0 * bj_DEGTORAD) * 64.0 * 0.071 / 128, Sin(90.0 * bj_DEGTORAD) * 64.0 * 0.071 / 128,/*
*/false, 2.00, 1.0)
set killer = null
set owner = null
set killed = null
endfunction
//----------------------------------------------------------------
private function Kill_Conditions takes nothing returns boolean
return IsUnitInGroup(GetKillingUnit(), greeder)
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger JarGreedTrg = CreateTrigger()
local trigger JarGreedDropTrg = CreateTrigger()
local trigger JarGreedKillTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(JarGreedTrg, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(JarGreedTrg, Condition(function Conditions))
call TriggerAddAction(JarGreedTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(JarGreedDropTrg, EVENT_PLAYER_UNIT_DROP_ITEM)
call TriggerAddCondition(JarGreedDropTrg, Condition(function Drop_Conditions))
call TriggerAddAction(JarGreedDropTrg, function Drop_Actions)
call TriggerRegisterAnyUnitEventBJ(JarGreedKillTrg, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(JarGreedKillTrg, Condition(function Kill_Conditions))
call TriggerAddAction(JarGreedKillTrg, function Kill_Actions)
//setting globals
set greeder = CreateGroup()
endfunction
endscope
//TESH.scrollpos=3
//TESH.alwaysfold=0
scope Vehemence initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer ITEM_ID = 'mlst' //Item Vehemence rawcode
private constant real RESTORE_LIFE = 10.0 //Life restore to killer
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Human\\Heal\\HealTarget.mdl" //Effect restore
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private group vehemencer
endglobals
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit picker = GetTriggerUnit()
call GroupAddUnit(vehemencer, picker)
set picker = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local item pickedItem = GetManipulatedItem()
local boolean okey = GetItemTypeId(pickedItem) == ITEM_ID
set pickedItem = null
return okey
endfunction
//----------------------------------------------------------------
private function Drop_Actions takes nothing returns nothing
local unit dropper = GetTriggerUnit()
call GroupRemoveUnit(vehemencer, dropper)
set dropper = null
endfunction
//----------------------------------------------------------------
private function Drop_Conditions takes nothing returns boolean
local item droppedItem = GetManipulatedItem()
local boolean okey = GetItemTypeId(droppedItem) == ITEM_ID
set droppedItem = null
return okey
endfunction
//----------------------------------------------------------------
private function Kill_Actions takes nothing returns nothing
local unit killer = GetKillingUnit()
local unit killed = GetTriggerUnit()
local effect e = AddSpecialEffectTarget(SPECIAL_EFFECT, killer, "origin")
call SetUnitState(killer, UNIT_STATE_LIFE, GetUnitState(killer, UNIT_STATE_LIFE) + RESTORE_LIFE)
call TriggerSleepAction(1.0)
call DestroyEffect(e)
set killer = null
set killed = null
set e = null
endfunction
//----------------------------------------------------------------
private function Kill_Conditions takes nothing returns boolean
local unit killer = GetKillingUnit()
local unit killed = GetTriggerUnit()
local boolean okey = IsUnitInGroup(killer, vehemencer) and (not IsUnitType(killed, UNIT_TYPE_HERO))
set killer = null
set killed = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger VehemenceTrg = CreateTrigger()
local trigger VehemenceDropTrg = CreateTrigger()
local trigger VehemenceKillTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(VehemenceTrg, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(VehemenceTrg, Condition(function Conditions))
call TriggerAddAction(VehemenceTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(VehemenceDropTrg, EVENT_PLAYER_UNIT_DROP_ITEM)
call TriggerAddCondition(VehemenceDropTrg, Condition(function Drop_Conditions))
call TriggerAddAction(VehemenceDropTrg, function Drop_Actions)
call TriggerRegisterAnyUnitEventBJ(VehemenceKillTrg, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(VehemenceKillTrg, Condition(function Kill_Conditions))
call TriggerAddAction(VehemenceKillTrg, function Kill_Actions)
//setting globals
set vehemencer = CreateGroup()
endfunction
endscope
//TESH.scrollpos=18
//TESH.alwaysfold=0
scope Reaver initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer ITEM_ID = 'I00O' //Item Reaver rawcode
private constant real RESTORE_LIFE = 100.0 //Life restore to killer
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Human\\Heal\\HealTarget.mdl" //Effect restore
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private group reaver
endglobals
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit picker = GetTriggerUnit()
call GroupAddUnit(reaver, picker)
set picker = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local item pickedItem = GetManipulatedItem()
local boolean okey = GetItemTypeId(pickedItem) == ITEM_ID
set pickedItem = null
return okey
endfunction
//----------------------------------------------------------------
private function Drop_Actions takes nothing returns nothing
local unit dropper = GetTriggerUnit()
call GroupRemoveUnit(reaver, dropper)
set dropper = null
endfunction
//----------------------------------------------------------------
private function Drop_Conditions takes nothing returns boolean
local item droppedItem = GetManipulatedItem()
local boolean okey = GetItemTypeId(droppedItem) == ITEM_ID
set droppedItem = null
return okey
endfunction
//----------------------------------------------------------------
private function Kill_Actions takes nothing returns nothing
local unit killer = GetKillingUnit()
local unit killed = GetTriggerUnit()
local effect e = AddSpecialEffectTarget(SPECIAL_EFFECT, killer, "origin")
call SetUnitState(killer, UNIT_STATE_LIFE, GetUnitState(killer, UNIT_STATE_LIFE) + RESTORE_LIFE)
call TriggerSleepAction(1.0)
call DestroyEffect(e)
set killer = null
set killed = null
set e = null
endfunction
//----------------------------------------------------------------
private function Kill_Conditions takes nothing returns boolean
local unit killer = GetKillingUnit()
local unit killed = GetTriggerUnit()
local boolean okey = IsUnitInGroup(killer, reaver) and (not IsUnitType(killed, UNIT_TYPE_HERO))
set killer = null
set killed = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger ReaverTrg = CreateTrigger()
local trigger ReaverDropTrg = CreateTrigger()
local trigger ReaverKillTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(ReaverTrg, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(ReaverTrg, Condition(function Conditions))
call TriggerAddAction(ReaverTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(ReaverDropTrg, EVENT_PLAYER_UNIT_DROP_ITEM)
call TriggerAddCondition(ReaverDropTrg, Condition(function Drop_Conditions))
call TriggerAddAction(ReaverDropTrg, function Drop_Actions)
call TriggerRegisterAnyUnitEventBJ(ReaverKillTrg, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(ReaverKillTrg, Condition(function Kill_Conditions))
call TriggerAddAction(ReaverKillTrg, function Kill_Actions)
//setting globals
set reaver = CreateGroup()
endfunction
endscope
//TESH.scrollpos=59
//TESH.alwaysfold=0
scope AphoticalScythe initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer ITEM_ID = 'rugt' //Item Aphotical Scythe rawcode
private constant integer CAST_ID = 'Acht' //Cast Aphotical Scythe (Howl) rawcode
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Items\\AIhe\\AIheTarget.mdl" //Effect restore
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private group copy
private group aphoticer
private trigger AphoticalScytheTrg
endglobals
//----------------------------------------------------------------
private function Pick_Actions takes nothing returns nothing
local unit picker = GetTriggerUnit()
call GroupAddUnit(aphoticer, picker)
call EnableTrigger(AphoticalScytheTrg)
set picker = null
endfunction
//----------------------------------------------------------------
private function Pick_Conditions takes nothing returns boolean
local item pickedItem = GetManipulatedItem()
local boolean okey = GetItemTypeId(pickedItem) == ITEM_ID
set pickedItem = null
return okey
endfunction
//----------------------------------------------------------------
private function Drop_Actions takes nothing returns nothing
local unit dropper = GetTriggerUnit()
call GroupRemoveUnit(aphoticer, dropper)
if(FirstOfGroup(aphoticer) == null) then
call DisableTrigger(AphoticalScytheTrg)
endif
set dropper = null
endfunction
//----------------------------------------------------------------
private function Drop_Conditions takes nothing returns boolean
local item droppedItem = GetManipulatedItem()
local boolean okey = GetItemTypeId(droppedItem) == ITEM_ID
set droppedItem = null
return okey
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit f = null
local player fOwner = null
local real fX = 0.0
local real fY = 0.0
set copy = CopyGroup(aphoticer)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not IsUnitDead(f)) then
set fOwner = GetOwningPlayer(f)
set fX = GetUnitX(f)
set fY = GetUnitY(f)
call ImmediateCast(fOwner, fX, fY, 1.0, CAST_ID, 1, "howlofterror", 0)
endif
endloop
set f = null
set fOwner = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger AphoticalScythePickTrg = CreateTrigger()
local trigger AphoticalScytheDropTrg = CreateTrigger()
set AphoticalScytheTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(AphoticalScythePickTrg, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(AphoticalScythePickTrg, Condition(function Pick_Conditions))
call TriggerAddAction(AphoticalScythePickTrg, function Pick_Actions)
call TriggerRegisterAnyUnitEventBJ(AphoticalScytheDropTrg, EVENT_PLAYER_UNIT_DROP_ITEM)
call TriggerAddCondition(AphoticalScytheDropTrg, Condition(function Drop_Conditions))
call TriggerAddAction(AphoticalScytheDropTrg, function Drop_Actions)
call TriggerRegisterTimerEventPeriodic(AphoticalScytheTrg, 3.0)
call TriggerAddAction(AphoticalScytheTrg, function Actions)
call DisableTrigger(AphoticalScytheTrg)
//setting globals
set copy = CreateGroup()
set aphoticer = CreateGroup()
endfunction
endscope
//TESH.scrollpos=8
//TESH.alwaysfold=0
scope PowerOverforce initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer ITEM1_ID = 'tdex' //Item Power of Overforce rawcode
private constant integer ITEM2_ID = 'rat3' //Item Power of Overforce (Dummy) rawcode
private constant real RADIUS = 9000.0 //Radius ally
endglobals
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_HERO))
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Pick_Actions takes nothing returns nothing
local unit picker = GetTriggerUnit()
local player owner = GetOwningPlayer(picker)
local real pickerX = GetUnitX(picker)
local real pickerY = GetUnitY(picker)
local unit f = null
call GroupEnumUnitsInRange(all, pickerX, pickerY, RADIUS, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(GetOwningPlayer(f) == owner) then//IsUnitAlly(f, owner) and (GetOwningPlayer(f) != Player(PLAYER_NEUTRAL_PASSIVE))) then
call UnitAddItemById(f, ITEM2_ID)
endif
endloop
set picker = null
set owner = null
set f = null
endfunction
//----------------------------------------------------------------
private function Pick_Conditions takes nothing returns boolean
local item pickedItem = GetManipulatedItem()
local boolean okey = GetItemTypeId(pickedItem) == ITEM1_ID
set pickedItem = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger PowerOverforcePickTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(PowerOverforcePickTrg, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(PowerOverforcePickTrg, Condition(function Pick_Conditions))
call TriggerAddAction(PowerOverforcePickTrg, function Pick_Actions)
//setting globals
set all = CreateGroup()
set bexpr = Condition(function Pick)
endfunction
endscope
//TESH.scrollpos=1
//TESH.alwaysfold=0
scope PowerAbyss initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer ITEM1_ID = 'tdx2' //Item Power of Abyss rawcode
private constant integer ITEM2_ID = 'asbl' //Item Power of Abyss (Dummy) rawcode
private constant real RADIUS = 9000.0 //Radius ally
endglobals
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_HERO))
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Pick_Actions takes nothing returns nothing
local unit picker = GetTriggerUnit()
local player owner = GetOwningPlayer(picker)
local real pickerX = GetUnitX(picker)
local real pickerY = GetUnitY(picker)
local unit f = null
call GroupEnumUnitsInRange(all, pickerX, pickerY, RADIUS, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(GetOwningPlayer(f) == owner) then//(IsUnitAlly(f, owner) and (GetOwningPlayer(f) != Player(PLAYER_NEUTRAL_PASSIVE))) then
call UnitAddItemById(f, ITEM2_ID)
endif
endloop
set picker = null
set owner = null
set f = null
endfunction
//----------------------------------------------------------------
private function Pick_Conditions takes nothing returns boolean
local item pickedItem = GetManipulatedItem()
local boolean okey = GetItemTypeId(pickedItem) == ITEM1_ID
set pickedItem = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger PowerAbyssPickTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(PowerAbyssPickTrg, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(PowerAbyssPickTrg, Condition(function Pick_Conditions))
call TriggerAddAction(PowerAbyssPickTrg, function Pick_Actions)
//setting globals
set all = CreateGroup()
set bexpr = Condition(function Pick)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope Skypath initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A01S'
private constant string SPELL_EFFECT = "Abilities\\Spells\\Human\\MassTeleport\\MassTeleportTo.mdl"
private constant string TARGET_EFFECT = "Abilities\\Spells\\Human\\MassTeleport\\MassTeleportTo.mdl"
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Human\\MassTeleport\\MassTeleportCaster.mdl"
endglobals
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct TeleportationBoots_Data
unit u
player o
unit t
real tX
real tY
effect sfxT
effect sfxU
boolean f //Finish cast
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private TeleportationBoots_Data array Ar[100]
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local TeleportationBoots_Data td
local integer i = 0
loop
exitwhen(i >= Total)
set td = Ar[i]
if(td.t != null) then
if(GetUnitState(td.t, UNIT_STATE_LIFE) <= 0 and/*
*/ not IsUnitVisible(td.t, td.o)) then
call IssueImmediateOrder(td.t, "stop")
set td.f = true
endif
endif
if(td.f) then
call DestroyEffect(td.sfxT)
call DestroyEffect(td.sfxU)
set td.u = null
set td.o = null
set td.t = null
set td.sfxT = null
set td.sfxU = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call td.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local TeleportationBoots_Data td = TeleportationBoots_Data.create()
local unit caster = GetTriggerUnit()
local unit target = GetSpellTargetUnit()
local real targetX = 0.0
local real targetY = 0.0
if(target == null) then
set targetX = GetSpellTargetX()
set targetY = GetSpellTargetY()
set td.sfxT = AddSpecialEffect(TARGET_EFFECT, targetX, targetY)
else
set targetX = 0
set targetY = 0
set td.sfxT = AddSpecialEffectTarget(TARGET_EFFECT, target, "origin")
endif
set td.u = caster
set td.o = GetOwningPlayer(caster)
set td.t = target
set td.tX = targetX
set td.tY = targetY
set td.sfxU = AddSpecialEffectTarget(SPELL_EFFECT, caster, "origin")
set td.f = false
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = td
set caster = null
set target = null
endfunction
//----------------------------------------------------------------
private function Cast_Actions takes nothing returns nothing
local TeleportationBoots_Data td
local unit caster = GetTriggerUnit()
local integer i = 0
loop
exitwhen(i >= Total)
set td = Ar[i]
if(td.u == caster) then
if(td.t == null) then
//call SetUnitPosition(td.u, td.tX, td.tY)
call SetUnitX(td.u, td.tX)
call SetUnitY(td.u, td.tY)
else
call SetUnitX(td.u, GetUnitX(td.t))
call SetUnitY(td.u, GetUnitY(td.t))
//call SetUnitPosition(td.u, GetUnitX(td.t), GetUnitY(td.t))
endif
call Pather(td.u, 1.0)
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, td.u, "origin"))
set td.f = true
endif
set i = i + 1
endloop
set caster = null
endfunction
//----------------------------------------------------------------
private function Stop_Actions takes nothing returns nothing
local TeleportationBoots_Data td
local unit caster = GetTriggerUnit()
local integer i = 0
loop
exitwhen(i >= Total)
set td = Ar[i]
if(td.u == caster) then
set td.f = true
endif
set i = i + 1
endloop
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger SkypathTrg = CreateTrigger()
local trigger SkypathCastTrg = CreateTrigger()
local trigger SkypathStopTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(SkypathTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(SkypathTrg, Condition(function Conditions))
call TriggerAddAction(SkypathTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(SkypathCastTrg, EVENT_PLAYER_UNIT_SPELL_FINISH)
call TriggerAddCondition(SkypathCastTrg, Condition(function Conditions))
call TriggerAddAction(SkypathCastTrg, function Cast_Actions)
call TriggerRegisterAnyUnitEventBJ(SkypathStopTrg, EVENT_PLAYER_UNIT_SPELL_ENDCAST)
call TriggerAddCondition(SkypathStopTrg, Condition(function Conditions))
call TriggerAddAction(SkypathStopTrg, function Stop_Actions)
//setting globals
set Tim = CreateTimer()
set Total = 0
endfunction
endscope
//TESH.scrollpos=9
//TESH.alwaysfold=0
scope VeteranSmokePipe initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A038' //Spell Veteren Smoke Pipe rawcode
private constant real DURATION = 5.0 //Duration of shift attributes
private constant string SPELL_EFFECT = "Abilities\\Spells\\Human\\FlakCannons\\FlakTarget.mdl" //Spell effect
endglobals
//Interval
private function Interval takes nothing returns real
return 0.5
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Veteran_Data
unit u //Unit caster
player o //Owner of caster
real t //Time remain
integer str //Str change
integer agi //Agi change
integer int //Int change
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Veteran_Data array Ar[10]
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Veteran_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t > 0) then
set sd.t = sd.t - Interval()
else
call SetHeroStr(sd.u, GetHeroStr(sd.u, false) - sd.str, false)
call SetHeroAgi(sd.u, GetHeroAgi(sd.u, false) - sd.agi, false)
call SetHeroInt(sd.u, GetHeroInt(sd.u, false) - sd.int, false)
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Veteran_Data sd
local unit caster = GetTriggerUnit()
local integer casterType = GetUnitTypeId(caster)
local player owner = GetOwningPlayer(caster)
local integer att = GetHeroAttribute(casterType)
local integer i = 0
local boolean exist = false
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set exist = true
set sd.t = DURATION
endif
set i = i + 1
endloop
if(not exist) then
//call TargetCast(owner, casterX, casterY, 1.0, CAST_ID, 1, "antimagicshell", 0, caster)
set sd = Veteran_Data.create()
set sd.u = caster
set sd.o = owner
set sd.t = DURATION
if(att == 1) then
set sd.str = GetHeroStr(sd.u, true)
set sd.agi = (GetHeroAgi(sd.u, true) / 2) * -1
set sd.int = (GetHeroInt(sd.u, true) / 2) * -1
elseif(att == 2) then
set sd.str = (GetHeroStr(sd.u, true) / 2) * -1
set sd.agi = GetHeroAgi(sd.u, true)
set sd.int = (GetHeroInt(sd.u, true) / 2) * -1
else
set sd.str = (GetHeroStr(sd.u, true) / 2) * -1
set sd.agi = (GetHeroAgi(sd.u, true) / 2) * -1
set sd.int = GetHeroInt(sd.u, true)
endif
call SetHeroStr(sd.u, GetHeroStr(sd.u, false) + sd.str, false)
call SetHeroAgi(sd.u, GetHeroAgi(sd.u, false) + sd.agi, false)
call SetHeroInt(sd.u, GetHeroInt(sd.u, false) + sd.int, false)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, caster, "head"))
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger VeteranSmokePipeTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(VeteranSmokePipeTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(VeteranSmokePipeTrg, Condition(function Conditions))
call TriggerAddAction(VeteranSmokePipeTrg, function Actions)
//setting globals
set Tim = CreateTimer()
set Total = 0
endfunction
endscope
//TESH.scrollpos=38
//TESH.alwaysfold=0
scope ArcaniteReaver initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer ITEM_ID = 'klmm' //Item Arcanite Reaver (dummy) rawcode
private constant integer DUMMY_ID = 'n02T' //Unit Arcanite Reaver (dummy) rawcode
private constant real DAMAGE = 100.0 //Damage
private constant real RADIUS = 100.0 //Radius
private constant real ANGLE_MOVE = 10.0 //Angle move
private constant real DISTANCE_OFFSET = 200.0 //Distance offset
private constant real HEAL_KILL_TREE = 150.0 //Heal tree kill
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_NORMAL //Spell attack type
private constant string SPELL_EFFECT = "Abilities\\Spells\\Human\\FlakCannons\\FlakTarget.mdl" //Spell effect
endglobals
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct ArcaniteReaver_Data
unit u //Unit picker
player o //Owner of caster
unit array dum[5] //Dummies
integer t //Total tomahawk
real a //Angle
real dd //Damage
real dr //Damage radius
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private ArcaniteReaver_Data array Ar[10]
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local ArcaniteReaver_Data sd
local integer i = 0
local integer j = 0
local real dummyX = 0.0
local real dummyY = 0.0
local boolean hit = false
local unit f = null
local real targetX = 0.0
local real targetY = 0.0
local real rad = 0.0
local integer treeCount = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t > 0) then
if(IsUnitDead(sd.u)) then
set sd.t = 0
endif
set j = 0
loop
exitwhen(j >= sd.t)
set dummyX = GetUnitX(sd.dum[j])
set dummyY = GetUnitY(sd.dum[j])
set hit = false
set treeCount = 0
call GroupEnumUnitsInRange(all, dummyX, dummyY, sd.dr, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
if(IsUnitType(f, UNIT_TYPE_HERO)) then
set hit = true
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
else
call UnitDamageTarget(sd.u, f, sd.dd/10.0, true, false, A_TYPE, D_TYPE, null)
endif
endif
endloop
set treeCount = HitTree(dummyX, dummyY, sd.dr, 0.0, 3.0)
if(treeCount > 0) then
call SetUnitState(sd.u, UNIT_STATE_LIFE, GetUnitState(sd.u, UNIT_STATE_LIFE) + HEAL_KILL_TREE)
endif
if(hit) then
call KillUnit(sd.dum[j])
set sd.t = sd.t - 1
if(j < sd.t) then
set sd.dum[j] = sd.dum[sd.t]
endif
else
set targetX = GetUnitX(sd.u)
set targetY = GetUnitY(sd.u)
set rad = (sd.a + ((360.0 / sd.t) * j)) * bj_DEGTORAD
set targetX = targetX + DISTANCE_OFFSET * Cos(rad)
set targetY = targetY + DISTANCE_OFFSET * Sin(rad)
call SetUnitX(sd.dum[j], targetX)
call SetUnitY(sd.dum[j], targetY)
endif
set j = j + 1
endloop
set sd.a = sd.a + ANGLE_MOVE
else
set j = 0
loop
exitwhen(j >= 5)
set sd.dum[j] = null
set j = j + 1
endloop
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Pick_Actions takes nothing returns nothing
local ArcaniteReaver_Data sd
local unit picker = GetTriggerUnit()
local player owner = GetOwningPlayer(picker)
local real pickerX = GetUnitX(picker)
local real pickerY = GetUnitY(picker)
local real facing = GetUnitFacing(picker)
local integer i = 0
local boolean exist = false
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == picker) then
set exist = true
if(sd.t < 5) then
set sd.dum[sd.t] = CreateUnit(owner, DUMMY_ID, pickerX, pickerY, facing)
set sd.t = sd.t + 1
endif
endif
set i = i + 1
endloop
if(not exist) then
set sd = ArcaniteReaver_Data.create()
set sd.u = picker
set sd.o = owner
set sd.dum[0] = CreateUnit(owner, DUMMY_ID, pickerX, pickerY, facing)
set sd.t = 1
set sd.a = 0.0
set sd.dd = DAMAGE
set sd.dr = RADIUS
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
set picker = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Pick_Conditions takes nothing returns boolean
local item pickedItem = GetManipulatedItem()
local boolean okey = GetItemTypeId(pickedItem) == ITEM_ID
set pickedItem = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger ArcaniteReaverPickTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(ArcaniteReaverPickTrg, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(ArcaniteReaverPickTrg, Condition(function Pick_Conditions))
call TriggerAddAction(ArcaniteReaverPickTrg, function Pick_Actions)
//setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
endfunction
endscope
//TESH.scrollpos=74
//TESH.alwaysfold=0
scope OrendaSpectrum initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A03E' //Spell Orenda Specturm rawcode
private constant integer CAST_ID = 'ACam' //Cast Orenda Spectrum rawcode
private constant integer ABILITY_ID = 'A053' //Ability Orenda Spectrum (Hide Icon) rawcode
private constant real DURATION = 8.0 //Duration lasts
private constant string SPELL_EFFECT = "Abilities\\Spells\\Human\\DivineShield\\DivineShieldTarget.mdl" //Spell effect
endglobals
//Interval
private function Interval takes nothing returns real
return 0.5
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct OrendaSpectrum_Data
unit u //Unit caster
player o //Owner of caster
real t //Time remain
effect e //Effect
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private OrendaSpectrum_Data array Ar[10]
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local OrendaSpectrum_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t > 0) then
set sd.t = sd.t - Interval()
if(GetUnitAbilityLevel(sd.u, ABILITY_ID) <= 0) then
call UnitAddAbility(sd.u, ABILITY_ID)
endif
else
call UnitRemoveAbility(sd.u, ABILITY_ID)
call DestroyEffect(sd.e)
set sd.e = null
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local OrendaSpectrum_Data sd = OrendaSpectrum_Data.create()
local unit caster = GetTriggerUnit()
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
//call TargetCast(owner, casterX, casterY, 1.0, CAST_ID, 1, "antimagicshell", 0, caster)
set sd.u = caster
set sd.o = GetOwningPlayer(caster)
set sd.t = DURATION
set sd.e = AddSpecialEffectTarget(SPELL_EFFECT, caster, "origin")
call UnitAddAbility(caster, ABILITY_ID)
call SetPlayerAbilityAvailable(owner, ABILITY_ID, false)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger OrendaSpectrumTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(OrendaSpectrumTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(OrendaSpectrumTrg, Condition(function Conditions))
call TriggerAddAction(OrendaSpectrumTrg, function Actions)
//setting globals
set Tim = CreateTimer()
set Total = 0
endfunction
endscope
//TESH.scrollpos=55
//TESH.alwaysfold=0
scope ExzelSneaker initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A02Q' //Spell Exzel Sneaker rawcode
private constant integer BUFF_ID = 'B00W' //Buff Exzel Sneaker rawcode
private constant string SPELL_EFFECT = "Abilities\\Spells\\Human\\FlakCannons\\FlakTarget.mdl" //Spell effect
endglobals
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct ExzelSneaker_Data
unit u //Unit caster
player o //Owner of caster
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private ExzelSneaker_Data array Ar[10]
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local ExzelSneaker_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(GetUnitAbilityLevel(sd.u, BUFF_ID) > 0) then
else
call SetUnitPathing(sd.u, true)
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local ExzelSneaker_Data sd = ExzelSneaker_Data.create()
local unit caster = GetTriggerUnit()
local player owner = GetOwningPlayer(caster)
set sd.u = caster
set sd.o = GetOwningPlayer(caster)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, caster, "origin"))
call UnitAddAbility(sd.u, 'Arav')
call UnitRemoveAbility(sd.u, 'Arav')
call SetUnitPathing(sd.u, false)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger ExzelSneakerTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(ExzelSneakerTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(ExzelSneakerTrg, Condition(function Conditions))
call TriggerAddAction(ExzelSneakerTrg, function Actions)
//setting globals
set Tim = CreateTimer()
set Total = 0
endfunction
endscope
//TESH.scrollpos=29
//TESH.alwaysfold=0
scope Deathshard initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A03H' //Spell rawcode
private constant integer CAST_ID = 'ACif' //Cast rawcode
private constant attacktype A_TYPE = ATTACK_TYPE_CHAOS //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_UNIVERSAL //Spell damage type
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
call TargetCast(owner, casterX, casterY, 1.0, CAST_ID, 1, "innerfire", 0, caster)
set caster = null
set owner = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
function Deathshard_onDamage takes unit attacker, unit attacked, real amount returns nothing
local boolean heroType = IsUnitType(attacker, UNIT_TYPE_HERO)
local player owner = GetOwningPlayer(attacker)
local integer ownerID = GetPlayerId(owner)
local unit hero = null
if(ownerID < 8) then
if(heroType) then
if(not IsUnitType(attacker, UNIT_TYPE_MAGIC_IMMUNE)) then
call UnitDamageTarget(attacked, attacker, amount, true, false, A_TYPE, D_TYPE, null)
endif
else
if(GetUnitAbilityLevel(attacker, 'Aloc') > 0) then
set hero = GetHero(owner)
if(not IsUnitType(attacker, UNIT_TYPE_MAGIC_IMMUNE)) then
call UnitDamageTarget(attacked, hero, amount, true, false, A_TYPE, D_TYPE, null)
endif
else
if(not IsUnitType(attacker, UNIT_TYPE_MAGIC_IMMUNE)) then
call UnitDamageTarget(attacked, attacker, amount, true, false, A_TYPE, D_TYPE, null)
endif
endif
endif
else
if(not IsUnitType(attacker, UNIT_TYPE_MAGIC_IMMUNE)) then
call UnitDamageTarget(attacked, attacker, amount, true, false, A_TYPE, D_TYPE, null)
endif
endif
set attacker = null
set attacked = null
set hero = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger DeathshardTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(DeathshardTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(DeathshardTrg, Condition(function Conditions))
call TriggerAddAction(DeathshardTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope Firebringer initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'ACbl' //Spell rawcode
private constant real DAMAGE = 100.0 //Damage sacrifice
private constant attacktype A_TYPE = ATTACK_TYPE_CHAOS //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_UNIVERSAL //Spell damage type
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local player owner = GetOwningPlayer(caster)
local unit target = GetSpellTargetUnit()
local real life = GetUnitState(target, UNIT_STATE_LIFE)
local real amount = RMinBJ(DAMAGE, life - 10.0)
if(owner == GetOwningPlayer(target)) then
call UnitDamageTarget(target, target, amount, true, false, A_TYPE, D_TYPE, null)
endif
set caster = null
set owner = null
set target = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger FirebringerTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(FirebringerTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(FirebringerTrg, Condition(function Conditions))
call TriggerAddAction(FirebringerTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=173
//TESH.alwaysfold=0
scope Vangage initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'AIps' //Spell rawcode
private constant integer SPELL2_ID = 'AIpg' //Spell rawcode
private constant real DAMAGE_MULTIPLIER = 3.0 //Damage by agility
private constant real RADIUS = 300.0 //Radius destroy summon or illusion
private constant integer ABILITY1_ID = 'Asph' //Ability Burning Orbs (3 Spheres) rawcode
private constant integer ABILITY2_ID = 'A04X' //Ability Burning Orbs (2 Spheres) rawcode
private constant integer ABILITY3_ID = 'A04Y' //Ability Burning Orbs (1 Sphere) rawcode
private constant attacktype A_TYPE = ATTACK_TYPE_HERO //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_UNIVERSAL //Spell damage type
endglobals
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false)
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private group copy
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local player owner = GetOwningPlayer(caster)
local integer agi = GetHeroAgi(caster, true)
local unit target = GetSpellTargetUnit()
local real targetX = GetUnitX(target)
local real targetY = GetUnitY(target)
local real amount = agi * DAMAGE_MULTIPLIER
local integer count = R2I(amount)
local real angle = (GetUnitFacing(target) + 180.0) * bj_DEGTORAD
local unit f = null
local real fX = 0.0
local real fY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
if(IsUnitAlly(target, owner)) then
//call SetUnitState(target, UNIT_STATE_LIFE, GetUnitState(target, UNIT_STATE_LIFE) + amount)
else
call TextTag_AttachUnit(I2S(count), 10.0 * 0.023 / 10.0, target, 30.0, /*
*/R2I(50.0 * 255.0 * 0.01), R2I(50.0 * 255.0 * 0.01), R2I(100.0 * 255.0 * 0.01), R2I(100.0 * 255.0 * 0.01), /*
*/50.0 * 0.071 / 128.0 * Cos(angle), 50.0 * 0.071 / 128.0 * Sin(angle), /*
*/false, 5.00, 1.75)
call UnitDamageTarget(caster, target, amount, true, false, A_TYPE, D_TYPE, null)
call UnitRemoveAbility(target, ABILITY1_ID)
call UnitRemoveAbility(target, ABILITY2_ID)
call UnitRemoveAbility(target, ABILITY3_ID)
endif
call GroupEnumUnitsInRange(all, targetX, targetY, RADIUS, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if((IsUnitIllusion(f) or IsUnitType(f, UNIT_TYPE_SUMMONED)) and IsUnitEnemy(f, owner)) then
call KillUnit(f)
endif
endloop
set copy = CopyGroup(RisingDeadUnit)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(IsUnitEnemy(f, owner)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = fX - targetX
set dy = fY - targetY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= RADIUS) then
call KillUnit(f)
endif
endif
endloop
set copy = CopyGroup(SpawnDeceasedUnit)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(IsUnitEnemy(f, owner)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = fX - targetX
set dy = fY - targetY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= RADIUS) then
call KillUnit(f)
endif
endif
endloop
set copy = CopyGroup(AtropyRitualUnit)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(IsUnitEnemy(f, owner)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = fX - targetX
set dy = fY - targetY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= RADIUS) then
call KillUnit(f)
endif
endif
endloop
set copy = CopyGroup(BlendNatureDummy)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(IsUnitEnemy(f, owner)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = fX - targetX
set dy = fY - targetY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= RADIUS) then
call KillUnit(f)
endif
endif
endloop
set copy = CopyGroup(Wolves)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(IsUnitEnemy(f, owner)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = fX - targetX
set dy = fY - targetY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= RADIUS) then
call KillUnit(f)
endif
endif
endloop
set copy = CopyGroup(Lava)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(IsUnitEnemy(f, owner)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = fX - targetX
set dy = fY - targetY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= RADIUS) then
call KillUnit(f)
endif
endif
endloop
set caster = null
set owner = null
set target = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID or GetSpellAbilityId() == SPELL2_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger VangageTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(VangageTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(VangageTrg, Condition(function Conditions))
call TriggerAddAction(VangageTrg, function Actions)
//Setting globals
set copy = CreateGroup()
set all = CreateGroup()
set bexpr = Condition(function Pick)
endfunction
endscope
//TESH.scrollpos=9
//TESH.alwaysfold=0
scope Chronos initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'AIha' //Spell rawcode
private constant integer ABILITY_IMMORTAL_ID = 'A07U' //Ability Immortal rawcode
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
call UnitResetCooldown(caster)
if(GetUnitAbilityLevel(caster, ABILITY_IMMORTAL_ID) > 0) then
call GroupAddUnit(ImmortalRefresh, caster)
endif
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger ChronosTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(ChronosTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(ChronosTrg, Condition(function Conditions))
call TriggerAddAction(ChronosTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=1
//TESH.alwaysfold=0
scope HavocraveDissever initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A0AV' //Spell rawcode
private constant integer CAST_ID = 'ANfd' //Ability Immortal rawcode
private constant real RADIUS = 350.0 //Radius effect
endglobals
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private group all
private boolexpr bexpr
private location loc
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
local real targetX = 0.0
local real targetY = 0.0
local unit f = null
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
call GroupEnumUnitsInRange(all, targetX, targetY, RADIUS, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, owner)) then
call TargetCast(owner, casterX, casterY, 1.0, CAST_ID, 1, "", 852230, f)
endif
endloop
set caster = null
set owner = null
set f = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger HavocraveDisseverTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(HavocraveDisseverTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(HavocraveDisseverTrg, Condition(function Conditions))
call TriggerAddAction(HavocraveDisseverTrg, function Actions)
//Setting globals
set all = CreateGroup()
set bexpr = Condition(function Pick)
set loc = Location(0, 0)
endfunction
endscope
//TESH.scrollpos=36
//TESH.alwaysfold=0
globals
group SerpentWards = CreateGroup()
endglobals
scope SerpentWard initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'AChw' //Spell rawcode
private constant integer UNIT_ID = 'osp4' //Unit Serpent Ward rawcode
private constant real RADIUS = 900.0 //Radius effect
private constant real DURATION = 10.0 //Duration
endglobals
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private group all
private group copy
private boolexpr bexpr
private location loc
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit f = null
local real fX = 0.0
local real fY = 0.0
local player owner = null
local unit g = null
set copy = CopyGroup(SerpentWards)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not IsUnitDead(f)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set owner = GetOwningPlayer(f)
call SetUnitPosition(f, fX, fY)
call GroupEnumUnitsInRange(all, fX, fY, RADIUS, bexpr)
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
if(IsUnitEnemy(g, owner) and IsUnitType(g, UNIT_TYPE_HERO)) then
call IssueTargetOrder(f, "attack", g)
endif
endloop
else
call GroupRemoveUnit(SerpentWards, f)
endif
endloop
set f = null
set g = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Cast_Actions takes nothing returns nothing
local unit caster = GetSummoningUnit()
local unit target = GetSummonedUnit()
if(target != null) then
call GroupAddUnit(SerpentWards, target)
endif
call PauseUnit(target, true)
call SetUnitVertexColor(target, 255, 255, 0, 50)
call TriggerSleepAction(DURATION)
call PauseUnit(target, false)
call SetUnitVertexColor(target, 255, 255, 255, 255)
set caster = null
set target = null
endfunction
//----------------------------------------------------------------
private function Cast_Conditions takes nothing returns boolean
local unit summoned = GetSummonedUnit()
local boolean okey = (GetUnitTypeId(summoned) == UNIT_ID)
set summoned = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger SerpentWardTrg = CreateTrigger()
local trigger SerpentWardCastTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(SerpentWardCastTrg, EVENT_PLAYER_UNIT_SUMMON)
call TriggerAddCondition(SerpentWardCastTrg, Condition(function Cast_Conditions))
call TriggerAddAction(SerpentWardCastTrg, function Cast_Actions)
call TriggerRegisterTimerEventPeriodic(SerpentWardTrg, 1.0)
call TriggerAddAction(SerpentWardTrg, function Actions)
//Setting globals
set all = CreateGroup()
set copy = CreateGroup()
set bexpr = Condition(function Pick)
set loc = Location(0, 0)
endfunction
endscope
//TESH.scrollpos=50
//TESH.alwaysfold=0
scope Moonstalker initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A0AW' //Spell rawcode
private constant real RADIUS = 550.0 //Radius effect
private constant real MANA_ABSORB = 200.0 //Mana absorb each target
private constant string SPELL_EFFECT = "Abilities\\Spells\\Other\\Drain\\ManaDrainCaster.mdl" //Target effect
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Other\\Drain\\ManaDrainTarget.mdl" //Target effect
endglobals
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private group all
private boolexpr bexpr
private location loc
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local player owner = GetOwningPlayer(caster)
local real targetX = 0.0
local real targetY = 0.0
local unit f = null
local real mana = 0.0
local real amount = 0
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
call GroupEnumUnitsInRange(all, targetX, targetY, RADIUS, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, owner)) then
set mana = GetUnitState(f, UNIT_STATE_MANA)
if(mana > 0) then
if(mana < 200) then
set amount = amount + mana
else
set amount = amount + MANA_ABSORB
endif
call SetUnitState(f, UNIT_STATE_MANA, mana - MANA_ABSORB)
call Timed_AddSpecialEffectTarget(SPELL_EFFECT, f, "overhead", 2.0)
endif
endif
endloop
if(amount > 0) then
set mana = GetUnitState(caster, UNIT_STATE_MANA)
call SetUnitState(caster, UNIT_STATE_MANA, mana + amount)
call Timed_AddSpecialEffectTarget(SPECIAL_EFFECT, caster, "overhead", 2.0)
endif
set caster = null
set f = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger MoonstalkerTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(MoonstalkerTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(MoonstalkerTrg, Condition(function Conditions))
call TriggerAddAction(MoonstalkerTrg, function Actions)
//Setting globals
set all = CreateGroup()
set bexpr = Condition(function Pick)
set loc = Location(0, 0)
endfunction
endscope
//TESH.scrollpos=134
//TESH.alwaysfold=0
scope EnvironmentChanger initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer ITEM1_ID = 'rman' //Item rawcode
private constant integer ITEM2_ID = 'rreb' //Item rawcode
private constant integer ITEM3_ID = 'rres' //Item rawcode
private constant integer ITEM4_ID = 'rsps' //Item rawcode
private constant integer ITEM5_ID = 'rspl' //Item rawcode
private constant integer ITEM6_ID = 'rwat' //Item rawcode
private constant integer ITEM7_ID = 'I00E' //Item rawcode
private constant integer ITEM8_ID = 'tst2' //Item rawcode
private constant integer ABILITY_ID = 'A042' //Ability Atok sell id
private constant real PAUSE_DURATION = 30.0 //Pause duration
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local item itemPicked = GetManipulatedItem()
local integer itemPickedId = GetItemTypeId(itemPicked)
local unit picker = GetTriggerUnit()
call SetUnitAnimation(gg_unit_Ogld_0031, "spell")
call QueueUnitAnimation(gg_unit_Ogld_0031, "stand")
if(itemPickedId == ITEM1_ID) then
call Change_Weather(WEATHER_HEAVY_RAIN, 60.0)
set WeatherCaster = picker
if(IsUnitInForce(picker, Players_Luminous)) then
set WeatherForce = Players_Luminous
elseif(IsUnitInForce(picker, Players_Overcast)) then
set WeatherForce = Players_Overcast
endif
elseif(itemPickedId == ITEM2_ID) then
call Change_Weather(WEATHER_LIGHT_RAIN, 240.0)
set WeatherCaster = picker
if(IsUnitInForce(picker, Players_Luminous)) then
set WeatherForce = Players_Luminous
elseif(IsUnitInForce(picker, Players_Overcast)) then
set WeatherForce = Players_Overcast
endif
elseif(itemPickedId == ITEM3_ID) then
call Change_Weather(WEATHER_WINDY, 120.0)
set WeatherCaster = picker
if(IsUnitInForce(picker, Players_Luminous)) then
set WeatherForce = Players_Luminous
elseif(IsUnitInForce(picker, Players_Overcast)) then
set WeatherForce = Players_Overcast
endif
elseif(itemPickedId == ITEM4_ID) then
call Change_Weather(WEATHER_NONE, 60.0)
elseif(itemPickedId == ITEM5_ID) then
if(CurrentPhenomenon == PHENOMENON_NONE or CurrentPhenomenon == PHENOMENON_EARTHQUAKE) then
call Trigger_Earthquake()
else
call Clear_Blight()
call Trigger_Earthquake()
endif
set PhenomenonCaster = picker
if(IsUnitInForce(picker, Players_Luminous)) then
set PhenomenonForce = Players_Luminous
elseif(IsUnitInForce(picker, Players_Overcast)) then
set PhenomenonForce = Players_Overcast
endif
elseif(itemPickedId == ITEM6_ID) then
if(CurrentPhenomenon == PHENOMENON_EARTHQUAKE) then
call Clear_Earthquake()
elseif(CurrentPhenomenon == PHENOMENON_BLIGHT) then
call Clear_Blight()
elseif(CurrentPhenomenon == PHENOMENON_HINDRANCE) then
call Clear_Hindrance()
endif
set PhenomenonForce = null
set PhenomenonCaster = null
elseif(itemPickedId == ITEM7_ID) then
if(CurrentPhenomenon == PHENOMENON_NONE or CurrentPhenomenon == PHENOMENON_BLIGHT) then
call Trigger_Blight()
else
call Clear_Earthquake()
call Clear_Hindrance()
call Trigger_Blight()
endif
set PhenomenonCaster = picker
if(IsUnitInForce(picker, Players_Luminous)) then
set PhenomenonForce = Players_Luminous
elseif(IsUnitInForce(picker, Players_Overcast)) then
set PhenomenonForce = Players_Overcast
endif
elseif(itemPickedId == ITEM8_ID) then
if(CurrentPhenomenon == PHENOMENON_NONE or CurrentPhenomenon == PHENOMENON_HINDRANCE) then
call Trigger_Hindrance()
else
call Clear_Earthquake()
call Clear_Blight()
call Trigger_Hindrance()
endif
set PhenomenonCaster = picker
if(IsUnitInForce(picker, Players_Luminous)) then
set PhenomenonForce = Players_Luminous
elseif(IsUnitInForce(picker, Players_Overcast)) then
set PhenomenonForce = Players_Overcast
endif
endif
call RemoveItem(itemPicked)
set itemPicked = null
set picker = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetItemTypeId(GetManipulatedItem()) == ITEM1_ID or /*
*/GetItemTypeId(GetManipulatedItem()) == ITEM2_ID or /*
*/GetItemTypeId(GetManipulatedItem()) == ITEM3_ID or /*
*/GetItemTypeId(GetManipulatedItem()) == ITEM4_ID or /*
*/GetItemTypeId(GetManipulatedItem()) == ITEM5_ID or /*
*/GetItemTypeId(GetManipulatedItem()) == ITEM6_ID or /*
*/GetItemTypeId(GetManipulatedItem()) == ITEM7_ID or /*
*/GetItemTypeId(GetManipulatedItem()) == ITEM8_ID
endfunction
//----------------------------------------------------------------
private function Sold_Actions takes nothing returns nothing
local unit seller = GetSellingUnit()
call UnitRemoveAbility(seller, ABILITY_ID)
call TriggerSleepAction(PAUSE_DURATION)
call UnitAddAbility(seller, ABILITY_ID)
set seller = null
endfunction
//----------------------------------------------------------------
private function Sold_Conditions takes nothing returns boolean
return GetItemTypeId(GetSoldItem()) == ITEM1_ID or /*
*/GetItemTypeId(GetSoldItem()) == ITEM2_ID or /*
*/GetItemTypeId(GetSoldItem()) == ITEM3_ID or /*
*/GetItemTypeId(GetSoldItem()) == ITEM4_ID or /*
*/GetItemTypeId(GetSoldItem()) == ITEM5_ID or /*
*/GetItemTypeId(GetSoldItem()) == ITEM6_ID or /*
*/GetItemTypeId(GetSoldItem()) == ITEM7_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger EnvironmentChangerTrg = CreateTrigger()
local trigger EnvironmentChangerSoldTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(EnvironmentChangerTrg, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(EnvironmentChangerTrg, Condition(function Conditions))
call TriggerAddAction(EnvironmentChangerTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(EnvironmentChangerSoldTrg, EVENT_PLAYER_UNIT_SELL_ITEM)
call TriggerAddCondition(EnvironmentChangerSoldTrg, Condition(function Sold_Conditions))
call TriggerAddAction(EnvironmentChangerSoldTrg, function Sold_Actions)
//Setting globals
call PauseUnit(gg_unit_Ogld_0031, true)
endfunction
endscope
//TESH.scrollpos=376
//TESH.alwaysfold=0
globals
//Light Bringer
trigger HolyLightTrg = CreateTrigger()
trigger HolyLightStopTrg = CreateTrigger()
trigger UnityBlessLearnTrg = CreateTrigger()
trigger AngelFlashTrg = CreateTrigger()
trigger GraceTrg = CreateTrigger()
trigger GraceCastTrg = CreateTrigger()
trigger DivineInterventionTrg = CreateTrigger()
//Arcane Wizard
trigger ArcaneFallTrg = CreateTrigger()
trigger ArcaneFallStopTrg = CreateTrigger()
trigger EnergyRefluxTrg = CreateTrigger()
trigger EnergyRefluxLearnTrg = CreateTrigger()
trigger ImpotentTrg = CreateTrigger()
trigger EsotericFormTrg = CreateTrigger()
trigger EsotericFormAttackTrg = CreateTrigger()
trigger ForceNovaTrg = CreateTrigger()
trigger ForceNovaStopTrg = CreateTrigger()
//King of Tempest
trigger StormHammerTrg = CreateTrigger()
trigger StormHammerJumpTrg = CreateTrigger()
trigger ThunderSmackTrg = CreateTrigger()
trigger BashAttackTrg = CreateTrigger()
trigger BashLearnTrg = CreateTrigger()
trigger LightningChargeTrg = CreateTrigger()
trigger AvatarWrathTrg = CreateTrigger()
//Pyromancer
trigger FireBlastTrg = CreateTrigger()
trigger FireBlastLaunchTrg = CreateTrigger()
trigger BloodSiphonTrg = CreateTrigger()
trigger IncinerateTrg = CreateTrigger()
trigger BloodEruptionTrg = CreateTrigger()
trigger BloodMeteorTrg = CreateTrigger()
trigger BurningOrbsTrg = CreateTrigger()
trigger BurningOrbsAttackTrg = CreateTrigger()
trigger ApocalypseTrg = CreateTrigger()
trigger ApocalypseStopTrg = CreateTrigger()
//Archslayer
trigger TorridStingTrg = CreateTrigger()
trigger SupremeTrg = CreateTrigger()
trigger FatalStrikeAttackTrg = CreateTrigger()
trigger FatalStrikeLearnTrg = CreateTrigger()
trigger ZealousTrg = CreateTrigger()
trigger ZealousStopTrg = CreateTrigger()
trigger WhirlingBladeTrg = CreateTrigger()
//Spirit Caller
trigger EarthTrembleTrg = CreateTrigger()
trigger TrackingSenseTrg = CreateTrigger()
trigger FireWallTrg = CreateTrigger()
trigger FireWallLearnTrg = CreateTrigger()
trigger FireWallAttackTrg = CreateTrigger()
trigger StormCalledTrg = CreateTrigger()
//Grandtaur
trigger PulverizeTrg = CreateTrigger()
trigger PulverizeStopTrg = CreateTrigger()
trigger EnduranceTrg = CreateTrigger()
trigger EnduranceStopTrg = CreateTrigger()
trigger VigorousAttackTrg = CreateTrigger()
trigger VigorousAttackLearnTrg = CreateTrigger()
trigger CrushingTrg = CreateTrigger()
trigger CrushingLearnTrg = CreateTrigger()
trigger TerraShockTrg = CreateTrigger()
//Occult Sage
trigger MysticWaveTrg = CreateTrigger()
trigger MysticWaveDieTrg = CreateTrigger()
trigger PalmFlipTrg = CreateTrigger()
trigger HexLearnTrg = CreateTrigger()
trigger TormentWardTrg = CreateTrigger()
trigger TormentWardDieTrg = CreateTrigger()
trigger TormentWardAttackTrg = CreateTrigger()
trigger VoodooTrg = CreateTrigger()
trigger VoodooStopTrg = CreateTrigger()
//Death Legion
trigger NecroDrawTrg = CreateTrigger()
trigger RisingDeadTrg = CreateTrigger()
trigger RisingDeadDieTrg = CreateTrigger()
trigger RisingDeadAttackTrg = CreateTrigger()
trigger SwordAbyssTrg = CreateTrigger()
trigger DeathPathTrg = CreateTrigger()
trigger EvilPactTrg = CreateTrigger()
trigger EvilPactStopTrg = CreateTrigger()
//Skeleton Witch
trigger FrostShattersTrg = CreateTrigger()
trigger FrostShattersAttackTrg = CreateTrigger()
trigger EssenceDrainTrg = CreateTrigger()
trigger EssenceDrainStopTrg = CreateTrigger()
trigger WickedPresenceLearnTrg = CreateTrigger()
trigger DarkVeilTrg = CreateTrigger()
trigger AtropyRitualTrg = CreateTrigger()
trigger AtropyRitualKillTrg = CreateTrigger()
//Mortal Predator
trigger ClawAssaultTrg = CreateTrigger()
trigger IsolationTrg = CreateTrigger()
trigger IsolationIlluTrg = CreateTrigger()
trigger IsolationKillTrg = CreateTrigger()
trigger IsolationKillTrg2 = CreateTrigger()
trigger ImmortalTrg = CreateTrigger()
trigger ImmortalCastTrg = CreateTrigger()
trigger SoulPrisonTrg = CreateTrigger()
trigger FingerDreadTrg = CreateTrigger()
//Swarm Titan
trigger MassImpaleTrg = CreateTrigger()
trigger SpikingCarapaceTrg = CreateTrigger()
trigger SpawnDeceasedTrg = CreateTrigger()
trigger SpawnDeceasedAttackTrg = CreateTrigger()
trigger SpawnDeceasedKillTrg = CreateTrigger()
trigger SpawnDeceasedLearnTrg = CreateTrigger()
trigger SpawnDeceasedTimeTrg = CreateTrigger()
trigger LocustsAttackTrg = CreateTrigger()
trigger GroundBreakerTrg = CreateTrigger()
trigger GroundBreakerAttackTrg = CreateTrigger()
//Guardian of the Nature
trigger VinesRootTrg = CreateTrigger()
trigger PollensDisperseTrg = CreateTrigger()
trigger PollensDisperseStopTrg = CreateTrigger()
trigger RazorLeavesTrg = CreateTrigger()
trigger BlendNatureLearnTrg = CreateTrigger()
trigger BlendNatureAttackedTrg = CreateTrigger()
trigger ForestArisenTrg = CreateTrigger()
//Celestial Princess
trigger MultishotsTrg = CreateTrigger()
trigger MultishotsLearnTrg = CreateTrigger()
trigger TigerLeapTrg = CreateTrigger()
trigger LucentArrowTrg = CreateTrigger()
trigger LucentArrowLearnTrg = CreateTrigger()
trigger WatcherTrg = CreateTrigger()
trigger HeavensTwilightTrg = CreateTrigger()
//Demon-half
trigger VorpalSlashTrg = CreateTrigger()
trigger VorpalSlashStopTrg = CreateTrigger()
trigger SwiftBladeTrg = CreateTrigger()
trigger InfiniteCrossTrg = CreateTrigger()
trigger InfiniteCrossLearnTrg = CreateTrigger()
trigger VoidImpulseTrg = CreateTrigger()
trigger VengeanceTrg = CreateTrigger()
trigger VengeanceStopTrg = CreateTrigger()
trigger VengeanceCancelTrg = CreateTrigger()
trigger VengeanceAttackTrg = CreateTrigger()
//Shadow Assassin
trigger PhantomKnivesTrg = CreateTrigger()
trigger PhantomKnivesStopTrg = CreateTrigger()
trigger BlinkTrg = CreateTrigger()
trigger BlinkLearnTrg = CreateTrigger()
trigger PoisonGlaiveTrg = CreateTrigger()
trigger ShadowStabTrg = CreateTrigger()
trigger ShadowStabAttackTrg = CreateTrigger()
trigger ShadowStabLearnTrg = CreateTrigger()
trigger ShadeShiftTrg = CreateTrigger()
trigger ShadeShiftAttackTrg = CreateTrigger()
//Damned Amok
trigger BerserkTrg = CreateTrigger()
trigger MadnessTrg = CreateTrigger()
trigger EnrageLearnTrg = CreateTrigger()
trigger InfernalTrg = CreateTrigger()
trigger InfernalLearnTrg = CreateTrigger()
trigger OverkillTrg = CreateTrigger()
//Lone Ranger
trigger SkyVolleyTrg = CreateTrigger()
trigger SkyVolleyStopTrg = CreateTrigger()
trigger StrideTrg = CreateTrigger()
trigger StrideStopTrg = CreateTrigger()
trigger MarksmanshipTrg = CreateTrigger()
trigger MarksmanshipLearnTrg = CreateTrigger()
trigger WingmateTrg = CreateTrigger()
trigger WingmateLearnTrg = CreateTrigger()
trigger WingmateGuardTrg = CreateTrigger()
trigger UltraboltTrg = CreateTrigger()
//Brutelord
trigger CrippleGrazeTrg = CreateTrigger()
trigger CrippleGrazeStopTrg = CreateTrigger()
trigger FeralWolvesTrg = CreateTrigger()
trigger FeralWolvesLearnTrg = CreateTrigger()
trigger FeralWolvesDieTrg = CreateTrigger()
trigger FeralWolvesDieTrg2 = CreateTrigger()
trigger FeralWolvesAttackTrg = CreateTrigger()
trigger FeralWolvesAttackTrg2 = CreateTrigger()
trigger FeralWolvesFollowTrg = CreateTrigger()
trigger FerociousMaulTrg = CreateTrigger()
trigger FerociousMaulLearnTrg = CreateTrigger()
trigger HowlTrg = CreateTrigger()
trigger HowlStopTrg = CreateTrigger()
trigger FrenzyTrg = CreateTrigger()
//Sorceress
trigger TidalWaveTrg = CreateTrigger()
trigger PortalLearnTrg = CreateTrigger()
trigger PortalFirstTrg = CreateTrigger()
trigger PortalSecondTrg = CreateTrigger()
trigger PortalTrainTrg = CreateTrigger()
trigger AquashieldTrg = CreateTrigger()
trigger AdaptationTrg = CreateTrigger()
trigger WaterRemnantTrg = CreateTrigger()
//Black Archer
trigger HauntTrg = CreateTrigger()
trigger GhostringTrg = CreateTrigger()
trigger ApparitionsTrg = CreateTrigger()
trigger ApparitionsCastTrg = CreateTrigger()
trigger WraithTrg = CreateTrigger()
trigger WraithAttackTrg = CreateTrigger()
trigger WraithJumpTrg = CreateTrigger()
trigger WraithLearnTrg = CreateTrigger()
//Sky Wanderer
trigger GushTrg = CreateTrigger()
trigger GushStopTrg = CreateTrigger()
trigger WhirlblowTrg = CreateTrigger()
trigger WindEludeTrg = CreateTrigger()
trigger WindEludeLearnTrg = CreateTrigger()
trigger TurbineTrg = CreateTrigger()
trigger ColossalCycloneTrg = CreateTrigger()
//Beast Hunter
trigger BeastUnleashedTrg = CreateTrigger()
trigger BeastUnleashedAttackTrg = CreateTrigger()
trigger SavageChargeTrg = CreateTrigger()
trigger SavageChargeCastTrg = CreateTrigger()
trigger BreakingAxeTrg = CreateTrigger()
trigger BreakingAxeLearnTrg = CreateTrigger()
trigger StampedeTrg = CreateTrigger()
trigger BattleRoarTrg = CreateTrigger()
//Snake Widow
trigger ConstrictionsTrg = CreateTrigger()
trigger FanFangsTrg = CreateTrigger()
trigger GlideTrg = CreateTrigger()
trigger ReplenishTrg = CreateTrigger()
trigger ParalyzingGazeTrg = CreateTrigger()
//First Conjurer
trigger ConjuringImageTrg = CreateTrigger()
trigger ConjuringImageDieTrg = CreateTrigger()
trigger ConjuringImageLearnTrg = CreateTrigger()
trigger ConjuringImageCastTrg = CreateTrigger()
trigger JuxtaposeTrg = CreateTrigger()
trigger JuxtaposeStopTrg = CreateTrigger()
trigger DisappearanceTrg = CreateTrigger()
trigger GatesDeceptionTrg = CreateTrigger()
trigger GatesDeceptionOrderTrg = CreateTrigger()
//Volcanic Core
trigger StarRuptureTrg = CreateTrigger()
trigger StarRuptureCastTrg = CreateTrigger()
trigger LavaBirthTrg = CreateTrigger()
trigger LavaBirthLearnTrg = CreateTrigger()
trigger LavaBirthAttackTrg = CreateTrigger()
trigger ConsumeWarmthTrg = CreateTrigger()
trigger MoltenFlowTrg = CreateTrigger()
trigger MoltenFlowCastTrg = CreateTrigger()
trigger VolcanicEruptionTrg = CreateTrigger()
trigger VolcanicEruptionCastTrg = CreateTrigger()
trigger VolcanicEruptionLearnTrg = CreateTrigger()
endglobals
scope AbilityTrigger initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Light Bringer
call DisableTrigger(HolyLightTrg)
call DisableTrigger(HolyLightStopTrg)
call DisableTrigger(UnityBlessLearnTrg)
call DisableTrigger(AngelFlashTrg)
call DisableTrigger(GraceTrg)
call DisableTrigger(GraceCastTrg)
call DisableTrigger(DivineInterventionTrg)
//Arcane Wizard
call DisableTrigger(ArcaneFallTrg)
call DisableTrigger(ArcaneFallStopTrg)
call DisableTrigger(EnergyRefluxTrg)
call DisableTrigger(EnergyRefluxLearnTrg)
call DisableTrigger(ImpotentTrg)
call DisableTrigger(EsotericFormTrg)
call DisableTrigger(EsotericFormAttackTrg)
call DisableTrigger(ForceNovaTrg)
call DisableTrigger(ForceNovaStopTrg)
//King of Tempest
call DisableTrigger(StormHammerTrg)
call DisableTrigger(StormHammerJumpTrg)
call DisableTrigger(ThunderSmackTrg)
call DisableTrigger(BashAttackTrg)
call DisableTrigger(BashLearnTrg)
call DisableTrigger(LightningChargeTrg)
call DisableTrigger(AvatarWrathTrg)
//Pyromancer
call DisableTrigger(FireBlastTrg)
call DisableTrigger(FireBlastLaunchTrg)
call DisableTrigger(IncinerateTrg)
call DisableTrigger(BloodEruptionTrg)
call DisableTrigger(BloodMeteorTrg)
call DisableTrigger(BurningOrbsTrg)
call DisableTrigger(BurningOrbsAttackTrg)
call DisableTrigger(ApocalypseTrg)
call DisableTrigger(ApocalypseStopTrg)
//Archslayer
call DisableTrigger(TorridStingTrg)
call DisableTrigger(SupremeTrg)
call DisableTrigger(FatalStrikeAttackTrg)
call DisableTrigger(FatalStrikeLearnTrg)
call DisableTrigger(ZealousTrg)
call DisableTrigger(ZealousStopTrg)
call DisableTrigger(WhirlingBladeTrg)
//Spirit Caller
call DisableTrigger(EarthTrembleTrg)
call DisableTrigger(TrackingSenseTrg)
call DisableTrigger(FireWallTrg)
call DisableTrigger(FireWallLearnTrg)
call DisableTrigger(FireWallAttackTrg)
call DisableTrigger(StormCalledTrg)
//Grandtaur
call DisableTrigger(PulverizeTrg)
call DisableTrigger(PulverizeStopTrg)
call DisableTrigger(EnduranceTrg)
call DisableTrigger(EnduranceStopTrg)
call DisableTrigger(VigorousAttackTrg)
call DisableTrigger(VigorousAttackLearnTrg)
call DisableTrigger(CrushingTrg)
call DisableTrigger(CrushingLearnTrg)
call DisableTrigger(TerraShockTrg)
//Occult Sage
call DisableTrigger(MysticWaveTrg)
call DisableTrigger(MysticWaveDieTrg)
call DisableTrigger(PalmFlipTrg)
call DisableTrigger(HexLearnTrg)
call DisableTrigger(TormentWardTrg)
call DisableTrigger(TormentWardDieTrg)
call DisableTrigger(TormentWardAttackTrg)
call DisableTrigger(VoodooTrg)
call DisableTrigger(VoodooStopTrg)
//Death Legion
call DisableTrigger(NecroDrawTrg)
call DisableTrigger(RisingDeadTrg)
call DisableTrigger(RisingDeadDieTrg)
call DisableTrigger(RisingDeadAttackTrg)
call DisableTrigger(SwordAbyssTrg)
call DisableTrigger(DeathPathTrg)
call DisableTrigger(EvilPactTrg)
call DisableTrigger(EvilPactStopTrg)
//Skeleton Witch
call DisableTrigger(FrostShattersTrg)
call DisableTrigger(FrostShattersAttackTrg)
call DisableTrigger(EssenceDrainTrg)
call DisableTrigger(EssenceDrainStopTrg)
call DisableTrigger(WickedPresenceLearnTrg)
call DisableTrigger(DarkVeilTrg)
call DisableTrigger(AtropyRitualTrg)
call DisableTrigger(AtropyRitualKillTrg)
//Mortal Predator
call DisableTrigger(ClawAssaultTrg)
call DisableTrigger(IsolationTrg)
call DisableTrigger(IsolationIlluTrg)
call DisableTrigger(IsolationKillTrg)
call DisableTrigger(IsolationKillTrg2)
call DisableTrigger(ImmortalTrg)
call DisableTrigger(SoulPrisonTrg)
call DisableTrigger(FingerDreadTrg)
//Swarm Titan
call DisableTrigger(MassImpaleTrg)
call DisableTrigger(SpikingCarapaceTrg)
call DisableTrigger(SpawnDeceasedTrg)
call DisableTrigger(SpawnDeceasedAttackTrg)
call DisableTrigger(SpawnDeceasedKillTrg)
call DisableTrigger(SpawnDeceasedTimeTrg)
call DisableTrigger(LocustsAttackTrg)
call DisableTrigger(GroundBreakerTrg)
call DisableTrigger(GroundBreakerAttackTrg)
//Guardian of the Nature
call DisableTrigger(VinesRootTrg)
call DisableTrigger(PollensDisperseTrg)
call DisableTrigger(PollensDisperseStopTrg)
call DisableTrigger(RazorLeavesTrg)
call DisableTrigger(BlendNatureLearnTrg)
call DisableTrigger(BlendNatureAttackedTrg)
call DisableTrigger(ForestArisenTrg)
//Celestial Princess
call DisableTrigger(MultishotsTrg)
call DisableTrigger(MultishotsLearnTrg)
call DisableTrigger(TigerLeapTrg)
call DisableTrigger(LucentArrowTrg)
call DisableTrigger(LucentArrowLearnTrg)
call DisableTrigger(WatcherTrg)
call DisableTrigger(HeavensTwilightTrg)
//Demon-half
call DisableTrigger(VorpalSlashTrg)
call DisableTrigger(VorpalSlashStopTrg)
call DisableTrigger(SwiftBladeTrg)
call DisableTrigger(InfiniteCrossTrg)
call DisableTrigger(InfiniteCrossLearnTrg)
call DisableTrigger(VoidImpulseTrg)
call DisableTrigger(VengeanceTrg)
call DisableTrigger(VengeanceStopTrg)
call DisableTrigger(VengeanceCancelTrg)
call DisableTrigger(VengeanceAttackTrg)
//Shadow Assassin
call DisableTrigger(PhantomKnivesTrg)
call DisableTrigger(PhantomKnivesStopTrg)
call DisableTrigger(BlinkTrg)
call DisableTrigger(BlinkLearnTrg)
call DisableTrigger(PoisonGlaiveTrg)
call DisableTrigger(ShadowStabTrg)
call DisableTrigger(ShadowStabAttackTrg)
call DisableTrigger(ShadowStabLearnTrg)
call DisableTrigger(ShadeShiftTrg)
call DisableTrigger(ShadeShiftAttackTrg)
//Damned Amok
call DisableTrigger(BerserkTrg)
call DisableTrigger(MadnessTrg)
call DisableTrigger(EnrageLearnTrg)
call DisableTrigger(InfernalTrg)
call DisableTrigger(InfernalLearnTrg)
call DisableTrigger(OverkillTrg)
//Lone Ranger
call DisableTrigger(SkyVolleyTrg)
call DisableTrigger(SkyVolleyStopTrg)
call DisableTrigger(StrideTrg)
call DisableTrigger(StrideStopTrg)
call DisableTrigger(MarksmanshipTrg)
call DisableTrigger(MarksmanshipLearnTrg)
call DisableTrigger(WingmateTrg)
call DisableTrigger(WingmateLearnTrg)
call DisableTrigger(WingmateGuardTrg)
call DisableTrigger(UltraboltTrg)
//Brutelord
call DisableTrigger(CrippleGrazeTrg)
call DisableTrigger(CrippleGrazeStopTrg)
call DisableTrigger(FeralWolvesTrg)
call DisableTrigger(FeralWolvesLearnTrg)
call DisableTrigger(FeralWolvesDieTrg)
call DisableTrigger(FeralWolvesDieTrg2)
call DisableTrigger(FeralWolvesAttackTrg)
call DisableTrigger(FeralWolvesAttackTrg2)
call DisableTrigger(FeralWolvesFollowTrg)
call DisableTrigger(FerociousMaulTrg)
call DisableTrigger(FerociousMaulLearnTrg)
call DisableTrigger(HowlTrg)
call DisableTrigger(HowlStopTrg)
call DisableTrigger(FrenzyTrg)
//Sorceress
call DisableTrigger(TidalWaveTrg)
call DisableTrigger(PortalLearnTrg)
call DisableTrigger(PortalFirstTrg)
call DisableTrigger(PortalSecondTrg)
call DisableTrigger(PortalTrainTrg)
call DisableTrigger(AquashieldTrg)
call DisableTrigger(AdaptationTrg)
call DisableTrigger(WaterRemnantTrg)
//Black Archer
call DisableTrigger(HauntTrg)
call DisableTrigger(GhostringTrg)
call DisableTrigger(ApparitionsTrg)
call DisableTrigger(ApparitionsCastTrg)
call DisableTrigger(WraithTrg)
call DisableTrigger(WraithAttackTrg)
call DisableTrigger(WraithJumpTrg)
call DisableTrigger(WraithLearnTrg)
//Sky Wanderer
call DisableTrigger(GushTrg)
call DisableTrigger(GushStopTrg)
call DisableTrigger(WhirlblowTrg)
call DisableTrigger(WindEludeTrg)
call DisableTrigger(WindEludeLearnTrg)
call DisableTrigger(TurbineTrg)
call DisableTrigger(ColossalCycloneTrg)
//Beast Hunter
call DisableTrigger(BeastUnleashedTrg)
call DisableTrigger(BeastUnleashedAttackTrg)
call DisableTrigger(SavageChargeTrg)
call DisableTrigger(SavageChargeCastTrg)
call DisableTrigger(BreakingAxeTrg)
call DisableTrigger(BreakingAxeLearnTrg)
call DisableTrigger(StampedeTrg)
call DisableTrigger(BattleRoarTrg)
//Snake Widow
call DisableTrigger(ConstrictionsTrg)
call DisableTrigger(FanFangsTrg)
call DisableTrigger(GlideTrg)
call DisableTrigger(ReplenishTrg)
call DisableTrigger(ParalyzingGazeTrg)
//First Conjurer
call DisableTrigger(ConjuringImageTrg)
call DisableTrigger(ConjuringImageDieTrg)
call DisableTrigger(ConjuringImageLearnTrg)
call DisableTrigger(ConjuringImageCastTrg)
call DisableTrigger(JuxtaposeTrg)
call DisableTrigger(JuxtaposeStopTrg)
call DisableTrigger(DisappearanceTrg)
call DisableTrigger(GatesDeceptionTrg)
call DisableTrigger(GatesDeceptionOrderTrg)
//Volcanic Core
call DisableTrigger(StarRuptureTrg)
call DisableTrigger(StarRuptureCastTrg)
call DisableTrigger(LavaBirthTrg)
call DisableTrigger(LavaBirthLearnTrg)
call DisableTrigger(LavaBirthAttackTrg)
call DisableTrigger(ConsumeWarmthTrg)
call DisableTrigger(MoltenFlowTrg)
call DisableTrigger(MoltenFlowCastTrg)
call DisableTrigger(VolcanicEruptionTrg)
call DisableTrigger(VolcanicEruptionCastTrg)
call DisableTrigger(VolcanicEruptionLearnTrg)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope CastChecker initializer Init
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetSpellAbilityUnit()
local integer casterID = GetUnitUserData(caster)
local integer spell = GetSpellAbilityId()
local player owner = GetOwningPlayer(caster)
call BJDebugMsg(GetUnitName(caster) + " " + GetPlayerName(owner) + " " + GetObjectName(spell))
set caster = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger CastCheckerTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(CastCheckerTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddAction(CastCheckerTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=167
//TESH.alwaysfold=0
library ORDER
globals
//strange ones at bottom
public constant integer OFFSET=851970
public constant integer absorb=852529
public constant integer acidbomb=852662
public constant integer acolyteharvest=852185
public constant integer AImove=851988
public constant integer ambush=852131
public constant integer ancestralspirit=852490
public constant integer ancestralspirittarget=852491
public constant integer animatedead=852217
public constant integer antimagicshell=852186
public constant integer attack=851983
public constant integer attackground=851984
public constant integer attackonce=851985
public constant integer attributemodskill=852576
public constant integer auraunholy=852215
public constant integer auravampiric=852216
public constant integer autodispel=852132
public constant integer autodispeloff=852134
public constant integer autodispelon=852133
public constant integer autoentangle=852505
public constant integer autoentangleinstant=852506
public constant integer autoharvestgold=852021
public constant integer autoharvestlumber=852022
public constant integer avatar=852086
public constant integer avengerform=852531
public constant integer awaken=852466
public constant integer banish=852486
public constant integer barkskin=852135
public constant integer barkskinoff=852137
public constant integer barkskinon=852136
public constant integer battleroar=852099
public constant integer battlestations=852099
public constant integer bearform=852138
public constant integer berserk=852100
public constant integer blackarrow=852577
public constant integer blackarrowoff=852579
public constant integer blackarrowon=852578
public constant integer blight=852187
public constant integer blink=852525
public constant integer blizzard=852089
public constant integer bloodlust=852101
public constant integer bloodlustoff=852103
public constant integer bloodluston=852102
public constant integer board=852043
public constant integer breathoffire=852580
public constant integer breathoffrost=852560
public constant integer build=851994
public constant integer burrow=852533
public constant integer cannibalize=852188
public constant integer carrionscarabs=852551
public constant integer carrionscarabsinstant=852554
public constant integer carrionscarabsoff=852553
public constant integer carrionscarabson=852552
public constant integer carrionswarm=852218
public constant integer chainlightning=852119
public constant integer channel=852600
public constant integer charm=852581
public constant integer chemicalrage=852663
public constant integer cloudoffog=852473
public constant integer clusterrockets=852652
public constant integer coldarrows=852244
public constant integer coldarrowstarg=852243
public constant integer controlmagic=852474
public constant integer corporealform=852493
public constant integer corrosivebreath=852140
public constant integer coupleinstant=852508
public constant integer coupletarget=852507
public constant integer creepanimatedead=852246
public constant integer creepdevour=852247
public constant integer creepheal=852248
public constant integer creephealoff=852250
public constant integer creephealon=852249
public constant integer creepthunderbolt=852252
public constant integer creepthunderclap=852253
public constant integer cripple=852189
public constant integer curse=852190
public constant integer curseoff=852192
public constant integer curseon=852191
public constant integer cyclone=852144
public constant integer darkconversion=852228
public constant integer darkportal=852229
public constant integer darkritual=852219
public constant integer darksummoning=852220
public constant integer deathanddecay=852221
public constant integer deathcoil=852222
public constant integer deathpact=852223
public constant integer decouple=852509
public constant integer defend=852055
public constant integer detectaoe=852015
public constant integer detonate=852145
public constant integer devour=852104
public constant integer devourmagic=852536
public constant integer disassociate=852240
public constant integer disenchant=852495
public constant integer dismount=852470
public constant integer dispel=852057
public constant integer divineshield=852090
public constant integer doom=852583
public constant integer drain=852487
public constant integer dreadlordinferno=852224
public constant integer dropitem=852001
public constant integer drunkenhaze=852585
public constant integer earthquake=852121
public constant integer eattree=852146
public constant integer elementalfury=852586
public constant integer ensnare=852106
public constant integer ensnareoff=852108
public constant integer ensnareon=852107
public constant integer entangle=852147
public constant integer entangleinstant=852148
public constant integer entanglingroots=852171
public constant integer etherealform=852496
public constant integer evileye=852105
public constant integer faeriefire=852149
public constant integer faeriefireoff=852151
public constant integer faeriefireon=852150
public constant integer fanofknives=852526
public constant integer farsight=852122
public constant integer fingerofdeath=852230
public constant integer firebolt=852231
public constant integer flamestrike=852488
public constant integer flamingarrows=852174
public constant integer flamingarrowstarg=852173
public constant integer flamingattack=852540
public constant integer flamingattacktarg=852539
public constant integer flare=852060
public constant integer forceboard=852044
public constant integer forceofnature=852176
public constant integer forkedlightning=852586
public constant integer freezingbreath=852195
public constant integer frenzy=852561
public constant integer frenzyoff=852563
public constant integer frenzyon=852562
public constant integer frostarmor=852225
public constant integer frostarmoroff=852459
public constant integer frostarmoron=852458
public constant integer frostnova=852226
public constant integer getitem=851981
public constant integer gold2lumber=852233
public constant integer grabtree=852511
public constant integer harvest=852018
public constant integer heal=852063
public constant integer healingspray=852664
public constant integer healingward=852109
public constant integer healingwave=852501
public constant integer healoff=852065
public constant integer healon=852064
public constant integer hex=852502
public constant integer holdposition=851993
public constant integer holybolt=852092
public constant integer howlofterror=852588
public constant integer humanbuild=851995
public constant integer immolation=852177
public constant integer impale=852555
public constant integer incineratearrow=852670
public constant integer incineratearrowoff=852672
public constant integer incineratearrowon=852671
public constant integer inferno=852232
public constant integer innerfire=852066
public constant integer innerfireoff=852068
public constant integer innerfireon=852067
public constant integer instant=852200
public constant integer invisibility=852069
public constant integer lavamonster=852667
public constant integer lightningshield=852110
public constant integer load=852046
public constant integer loadarcher = 852142
public constant integer loadcorpse=852050
public constant integer loadcorpseinstant=852053
public constant integer locustswarm=852556
public constant integer lumber2gold=852234
public constant integer magicdefense=852478
public constant integer magicleash=852480
public constant integer magicundefense=852479
public constant integer manaburn=852179
public constant integer manaflareoff=852513
public constant integer manaflareon=852512
public constant integer manashieldoff=852590
public constant integer manashieldon=852589
public constant integer massteleport=852093
public constant integer mechanicalcritter=852564
public constant integer metamorphosis=852180
public constant integer militia=852072
public constant integer militiaconvert=852071
public constant integer militiaoff=852073
public constant integer militiaunconvert=852651
public constant integer mindrot=852565
public constant integer mirrorimage=852123
public constant integer monsoon=852591
public constant integer mount=852469
public constant integer mounthippogryph=852143
public constant integer move=851986
public constant integer nagabuild=852467
public constant integer neutraldetectaoe=852023
public constant integer neutralinteract=852566
public constant integer neutralspell=852630
public constant integer nightelfbuild=851997
public constant integer orcbuild=851996
public constant integer parasite=852601
public constant integer parasiteoff=852603
public constant integer parasiteon=852602
public constant integer patrol=851990
public constant integer phaseshift=852514
public constant integer phaseshiftinstant=852517
public constant integer phaseshiftoff=852516
public constant integer phaseshifton=852515
public constant integer phoenixfire=852481
public constant integer phoenixmorph=852482
public constant integer poisonarrows=852255
public constant integer poisonarrowstarg=852254
public constant integer polymorph=852074
public constant integer possession=852196
public constant integer preservation=852568
public constant integer purge=852111
public constant integer rainofchaos=852237
public constant integer rainoffire=852238
public constant integer raisedead=852197
public constant integer raisedeadoff=852199
public constant integer raisedeadon=852198
public constant integer ravenform=852155
public constant integer recharge=852157
public constant integer rechargeoff=852159
public constant integer rechargeon=852158
public constant integer rejuvination=852160
public constant integer renew=852161
public constant integer renewoff=852163
public constant integer renewon=852162
public constant integer repair=852024
public constant integer repairoff=852026
public constant integer repairon=852025
public constant integer replenish=852542
public constant integer replenishlife=852545
public constant integer replenishlifeoff=852547
public constant integer replenishlifeon=852546
public constant integer replenishmana=852548
public constant integer replenishmanaoff=852550
public constant integer replenishmanaon=852549
public constant integer replenishoff=852544
public constant integer replenishon=852543
public constant integer request_hero=852239
public constant integer requestsacrifice=852201
public constant integer restoration=852202
public constant integer restorationoff=852204
public constant integer restorationon=852203
public constant integer resumebuild=851999
public constant integer resumeharvesting=852017
public constant integer resurrection=852094
public constant integer returnresources=852020
public constant integer revenge=852241
public constant integer revive=852039
public constant integer roar=852164
public constant integer robogoblin=852656
public constant integer root=852165
public constant integer sacrifice=852205
public constant integer sanctuary=852569
public constant integer scout=852181
public constant integer selfdestruct=852040
public constant integer selfdestructoff=852042
public constant integer selfdestructon=852041
public constant integer sentinel=852182
public constant integer setrally=851980
public constant integer shadowsight=852570
public constant integer shadowstrike=852527
public constant integer shockwave=852125
public constant integer silence=852592
public constant integer sleep=852227
public constant integer slow=852075
public constant integer slowoff=852077
public constant integer slowon=852076
public constant integer smart=851971
public constant integer soulburn=852668
public constant integer soulpreservation=852242
public constant integer spellshield=852571
public constant integer spellshieldaoe=852572
public constant integer spellsteal=852483
public constant integer spellstealoff=852485
public constant integer spellstealon=852484
public constant integer spies=852235
public constant integer spiritlink=852499
public constant integer spiritofvengeance=852528
public constant integer spirittroll=852573
public constant integer spiritwolf=852126
public constant integer stampede=852593
public constant integer standdown=852113
public constant integer starfall=852183
public constant integer stasistrap=852114
public constant integer steal=852574
public constant integer stomp=852127
public constant integer stoneform=852206
public constant integer stop=851972
public constant integer submerge=852604
public constant integer summonfactory=852658
public constant integer summongrizzly=852594
public constant integer summonphoenix=852489
public constant integer summonquillbeast=852595
public constant integer summonwareagle=852596
public constant integer tankdroppilot=852079
public constant integer tankloadpilot=852080
public constant integer tankpilot=852081
public constant integer taunt=852520
public constant integer thunderbolt=852095
public constant integer thunderclap=852096
public constant integer tornado=852597
public constant integer townbelloff=852083
public constant integer townbellon=852082
public constant integer tranquility=852184
public constant integer transmute=852665
public constant integer unavatar=852087
public constant integer unavengerform=852532
public constant integer unbearform=852139
public constant integer unburrow=852534
public constant integer uncoldarrows=852245
public constant integer uncorporealform=852494
public constant integer undeadbuild=851998
public constant integer undefend=852056
public constant integer undivineshield=852091
public constant integer unetherealform=852497
public constant integer unflamingarrows=852175
public constant integer unflamingattack=852541
public constant integer unholyfrenzy=852209
public constant integer unimmolation=852178
public constant integer unload=852047
public constant integer unloadall=852048
public constant integer unloadallcorpses=852054
public constant integer unloadallinstant=852049
public constant integer unpoisonarrows=852256
public constant integer unravenform=852156
public constant integer unrobogoblin=852657
public constant integer unroot=852166
public constant integer unstableconcoction=852500
public constant integer unstoneform=852207
public constant integer unsubmerge=852605
public constant integer unsummon=852210
public constant integer unwindwalk=852130
public constant integer vengeance=852521
public constant integer vengeanceinstant=852524
public constant integer vengeanceoff=852523
public constant integer vengeanceon=852522
public constant integer volcano=852669
public constant integer voodoo=852503
public constant integer ward=852504
public constant integer waterelemental=852097
public constant integer wateryminion=852598
public constant integer web=852211
public constant integer weboff=852213
public constant integer webon=852212
public constant integer whirlwind=852128
public constant integer windwalk=852129
public constant integer wispharvest=852214
public constant integer scrollofspeed=852285
public constant integer cancel=851976
public constant integer moveslot1=852002
public constant integer moveslot2=852003
public constant integer moveslot3=852004
public constant integer moveslot4=852005
public constant integer moveslot5=852006
public constant integer moveslot6=852007
public constant integer useslot1=852008
public constant integer useslot2=852009
public constant integer useslot3=852010
public constant integer useslot4=852011
public constant integer useslot5=852012
public constant integer useslot6=852013
public constant integer skillmenu=852000
public constant integer stunned=851973
public constant integer instant1=851991 //?
public constant integer instant2=851987 //?
public constant integer instant3=851975 //?
public constant integer instant4=852019 //?
endglobals
endlibrary
//TESH.scrollpos=60
//TESH.alwaysfold=0
scope BasicAbilityTemplate initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A00N' //Spell Forest Arisen rawcode
private constant string SPELL_EFFECT = "Objects\\Spawnmodels\\NightElf\\EntBirthTarget\\EntBirthTarget.mdl" //Death effect
endglobals
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct BasicAbilityTemplate_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of ability
unit dum //Dummy revealer
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private BasicAbilityTemplate_Data array Ar[10]
private group all
private boolexpr bexpr
private location target
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
return Targets(GetFilterUnit())
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local BasicAbilityTemplate_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
call sd.destroy()
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local BasicAbilityTemplate_Data sd = BasicAbilityTemplate_Data.create()
local unit caster = GetSpellAbilityUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(BasicAbilityTemplateTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(BasicAbilityTemplateTrg, Condition(function Conditions))
call TriggerAddAction(BasicAbilityTemplateTrg, function Actions)
//setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
set target = Location(0, 0)
endfunction
endscope
//TESH.scrollpos=12
//TESH.alwaysfold=0
scope Picker initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'ACtc' //Spell Pick Hero rawcode
private constant string SELECT_MESSAGE = "Select an |cff00ff00obelisk|r (wall structure with the pointy head) and you may see the available hero there" //Select message
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local player owner = GetOwningPlayer(caster)
local string str = ""
local string agi = ""
local string int = ""
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0.0, 0.0, SELECT_MESSAGE)
endif
if(GetLocalPlayer() == owner) then
set str = STRENGTH_EFFECT
set agi = AGILITY_EFFECT
set int = INTELLIGENCE_EFFECT
endif
if(GameMode == MODE_NORMAL) then
if(IsPlayerInForce(owner, Players_Luminous)) then
call DestroyEffect(AddSpecialEffect(str, GetUnitX(Obelisk_Luminous[0]), GetUnitY(Obelisk_Luminous[0])))
call DestroyEffect(AddSpecialEffect(agi, GetUnitX(Obelisk_Luminous[1]), GetUnitY(Obelisk_Luminous[1])))
call DestroyEffect(AddSpecialEffect(int, GetUnitX(Obelisk_Luminous[2]), GetUnitY(Obelisk_Luminous[2])))
elseif(IsPlayerInForce(owner, Players_Overcast)) then
call DestroyEffect(AddSpecialEffect(str, GetUnitX(Obelisk_Overcast[0]), GetUnitY(Obelisk_Overcast[0])))
call DestroyEffect(AddSpecialEffect(agi, GetUnitX(Obelisk_Overcast[1]), GetUnitY(Obelisk_Overcast[1])))
call DestroyEffect(AddSpecialEffect(int, GetUnitX(Obelisk_Overcast[2]), GetUnitY(Obelisk_Overcast[2])))
endif
elseif(GameMode == MODE_ALLPICK or /*
*/GameMode == MODE_TEST or /*
*/GameMode == MODE_ALLSAME) then
call DestroyEffect(AddSpecialEffect(str, GetUnitX(Obelisk_Luminous[0]), GetUnitY(Obelisk_Luminous[0])))
call DestroyEffect(AddSpecialEffect(str, GetUnitX(Obelisk_Overcast[0]), GetUnitY(Obelisk_Overcast[0])))
call DestroyEffect(AddSpecialEffect(agi, GetUnitX(Obelisk_Luminous[1]), GetUnitY(Obelisk_Luminous[1])))
call DestroyEffect(AddSpecialEffect(agi, GetUnitX(Obelisk_Overcast[1]), GetUnitY(Obelisk_Overcast[1])))
call DestroyEffect(AddSpecialEffect(int, GetUnitX(Obelisk_Luminous[2]), GetUnitY(Obelisk_Luminous[2])))
call DestroyEffect(AddSpecialEffect(int, GetUnitX(Obelisk_Overcast[2]), GetUnitY(Obelisk_Overcast[2])))
endif
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger PickerTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(PickerTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(PickerTrg, Condition(function Conditions))
call TriggerAddAction(PickerTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=186
//TESH.alwaysfold=0
scope Randomer initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'Awrh' //Spell Random Hero rawcode
private constant integer ABILITY3_ID = 'Awrh' //Ability Rune (Random) rawcode
private constant integer ABILITY4_ID = 'ACtc' //Ability Rune (Pick) rawcode
private constant string RANDOM_TIPS = " has randomed " //Random message
private constant string WAIT_TIPS = "|cff00ff00Wait for the game to start.|r\n" + /*
*/"Countdown timer is at the top of your screen.\n" + /*
*/"Your hero will be at your ship when the countdown finished. \n" + /*
*/"Move your ship to any water location that you prefer." //Wait message
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Items\\TomeOfRetraining\\TomeOfRetrainingCaster.mdl" //Start game hero effect
private constant integer RANDOM_COST = 100 //Cost of getting a random hero
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private group copy
endglobals
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local player owner = GetOwningPlayer(caster)
local integer playerNum = GetPlayerId(owner)
local integer loc = GetPlayerStartLocation(owner)
local integer position = LoadInteger(Info_Ht, playerNum, MULTIBOARD_ROW_KEY)
local multiboarditem mbItem = MultiboardGetItem(MultiB, position, MULTIBOARD_PLAYER_NAME)
local integer i = 0
local integer j = 0
local integer randomInt = 0
local boolean exist = false
local integer Min = 0
local integer Max = 0
local real startLocX = GetPlayerStartLocationX(owner)
local real startLocY = GetPlayerStartLocationY(owner)
local unit hero = null
local integer heroID
local unit boat = null
local unit f = null
local player p = null
local real x = 0
local real y = 0
call SetPlayerState(owner, PLAYER_STATE_RESOURCE_GOLD, GetPlayerState( owner, PLAYER_STATE_RESOURCE_GOLD) - RANDOM_COST)
call UnitRemoveAbility(Rune[playerNum], ABILITY3_ID)
call UnitRemoveAbility(Rune[playerNum], ABILITY4_ID)
if(GameMode == MODE_NORMAL) then
if(IsPlayerInForce(owner, Players_Luminous)) then
set Min = 0
set Max = Total_Luminous_Heroes - 1
elseif(IsPlayerInForce(owner, Players_Overcast)) then
set Min = Total_Luminous_Heroes
set Max = Total_Luminous_Heroes + Total_Overcast_Heroes - 1
endif
loop
set exist = false
set randomInt = GetRandomInt(Min, Max)
set j = 0
loop
exitwhen(j >= 8)
if(randomInt == Hero_Selected_Player[j]) then
set j = 8
set exist = true
endif
set j = j + 1
endloop
if(not exist and (Allow_Heroes[randomInt])) then
set Hero_Selected_Player[playerNum] = randomInt
set exist = false
else
set exist = true
endif
exitwhen(exist == false)
endloop
else
set Min = 0
set Max = Total_Heroes - 1
loop
set exist = false
set randomInt = GetRandomInt(Min, Max)
set j = 0
loop
exitwhen(j >= 8)
if(randomInt == Hero_Selected_Player[j]) then
set j = 8
set exist = true
endif
set j = j + 1
endloop
if(not exist and (Allow_Heroes[randomInt])) then
set Hero_Selected_Player[playerNum] = randomInt
set exist = false
else
set exist = true
endif
exitwhen(exist == false)
endloop
endif
set hero = CreateUnit(owner, All_Heroes[Hero_Selected_Player[playerNum]], startLocX, startLocY, bj_UNIT_FACING)
set heroID = GetUnitTypeId(hero)
call SetPlayerTechResearched(owner, 'HERO', 1)
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
call SetPlayerTechMaxAllowed(p, heroID, 0)
if(IsPlayerInForce(p, CommentaryForce)) then
call DisplayTextToPlayer(p, 0, 0, Player_Name[playerNum] + RANDOM_TIPS + Player_Colors[playerNum] + GetUnitName(hero) + ".|r")
endif
set i = i + 1
endloop
call GroupAddUnit(Unit_Outside_Temple, hero)
call GroupAddUnit(Heroes, hero)
call MultiboardSetItemIcon(mbItem, GetHeroIcon(heroID))
call HeroesSetup(hero)
set copy = CopyGroup(Boats)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(owner == GetOwningPlayer(f) and boat == null) then
set boat = f
endif
endloop
if(boat != null) then
call AddItemRectify(boat, GetUnitTypeId(hero))
endif
if(GamePhase == GAME_PHASE_READY or GamePhase == GAME_PHASE_INITIALIZE) then
if(hero != null) then
//call ShowUnit(hero, false)
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0, 0, WAIT_TIPS)
endif
if(boat != null) then
set x = GetUnitX(boat)
set y = GetUnitY(boat)
call SetUnitPosition(hero, x, y)
call IssueTargetOrder(boat, "load", hero)
endif
endif
elseif(GamePhase == GAME_PHASE_START) then
if(hero != null) then
if(boat != null) then
set x = GetUnitX(boat)
set y = GetUnitY(boat)
call SetUnitPosition(hero, x, y)
endif
endif
endif
set Players_Ready[playerNum] = true
call TriggerSleepAction(0.5)
if(GamePhase == GAME_PHASE_READY or GamePhase == GAME_PHASE_INITIALIZE) then
if(boat != null) then
set x = GetUnitX(boat)
set y = GetUnitY(boat)
if(GetLocalPlayer() == owner) then
call PanCameraToTimed(x, y, 1.0)
call ClearSelection()
call SelectUnit(boat, true)
endif
endif
elseif(GamePhase == GAME_PHASE_START) then
if(hero != null) then
if(boat != null) then
set x = GetUnitX(boat)
set y = GetUnitY(boat)
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, hero, "origin"))
if(GetLocalPlayer() == owner) then
call PanCameraToTimed(x, y, 1.0)
call ClearSelection()
call SelectUnit(hero, true)
endif
endif
endif
endif
call UnitAddItemById(hero, 'pman')
call UnitAddItemById(hero, 'phea')
call UnitAddItemById(hero, 'pman')
call UnitAddItemById(hero, 'phea')
call UnitAddItemById(hero, 'pman')
call UnitAddItemById(hero, 'phea')
call UnitAddItemById(hero, 'uflg')
call UnitAddItemById(hero, 'wswd')
call AppendPlayerNameHero(owner, hero)
set owner = null
set hero = null
set boat = null
set mbItem = null
set caster = null
set f = null
set p = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger RandomerTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(RandomerTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(RandomerTrg, Condition(function Conditions))
call TriggerAddAction(RandomerTrg, function Actions)
//setting globals
set copy = CreateGroup()
endfunction
endscope
//TESH.scrollpos=15
//TESH.alwaysfold=0
scope LockUnCamera initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A08C' //Spell Lock/Unlock Selecter rawcode
private constant string LOCK_MESSAGE = "Camera has been locked to your hero." //Locked message
private constant string UNLOCK_MESSAGE = "Camera has been unlocked to your hero." //Unlocked message
private constant string WAIT_MESSAGE = "|cffff0000Wait for your hero to appear when the game has started|r." //Wait message
private constant string NO_HERO_MESSAGE = "|cffff0000You have no hero yet|r." //No hero message
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local player owner = GetOwningPlayer(caster)
local integer ownerNum = GetPlayerId(owner)
local unit hero = GetHero(owner)
local real x = 0.0
local real y = 0.0
local camerafield cm = null
if(GamePhase != 0) then
if(hero != null) then
set Camera_Lock[ownerNum] = (not Camera_Lock[ownerNum])
if(Camera_Lock[ownerNum]) then
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0.0, 0.0, LOCK_MESSAGE)
endif
set x = GetUnitX(hero)
set y = GetUnitY(hero)
if(GetLocalPlayer() == owner) then
call PanCameraToTimed(x, y, 1.0)
call SetCameraTargetController(hero, 0.0, 0.0, false)
endif
else
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0.0, 0.0, UNLOCK_MESSAGE)
endif
set cm = CAMERA_FIELD_TARGET_DISTANCE
if(GetLocalPlayer() == owner) then
call ResetToGameCamera(0.0)
call SetCameraField(cm, Camera_Distance[ownerNum], 0.0)
endif
set cm = null
endif
else
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0.0, 0.0, NO_HERO_MESSAGE)
endif
endif
else
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0.0, 0.0, WAIT_MESSAGE)
endif
endif
set caster = null
set hero = null
set owner = null
set cm = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger LockUnCameraTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(LockUnCameraTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(LockUnCameraTrg, Condition(function Conditions))
call TriggerAddAction(LockUnCameraTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=18
//TESH.alwaysfold=0
scope LockUnSelecter initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A0BJ' //Spell Lock/Unlock Selecter rawcode
private constant string LOCK_MESSAGE = "Selecting has been locked to your hero." //Locked message
private constant string UNLOCK_MESSAGE = "Selecting has been unlocked to your hero." //Unlocked message
private constant string WAIT_MESSAGE = "|cffff0000Wait for your hero to appear when the game has started|r." //Wait message
private constant string NO_HERO_MESSAGE = "|cffff0000You have no hero yet|r." //No hero message
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local player owner = GetOwningPlayer(caster)
local integer ownerNum = GetPlayerId(owner)
local unit hero = GetHero(owner)
local real x = 0.0
local real y = 0.0
if(GamePhase != 0) then
if(hero != null) then
set Selecter_Lock[ownerNum] = (not Selecter_Lock[ownerNum])
if(Selecter_Lock[ownerNum]) then
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0.0, 0.0, LOCK_MESSAGE)
endif
if((not IsUnitDead(hero)) and (IsUnitVisible(hero, owner))) then
set x = GetUnitX(hero)
set y = GetUnitY(hero)
if(GetLocalPlayer() == owner) then
call PanCameraToTimed(x, y, 1.0)
call ClearSelection()
call SelectUnit(hero, true)
endif
endif
else
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0.0, 0.0, UNLOCK_MESSAGE)
endif
if((not IsUnitDead(hero)) and (IsUnitVisible(hero, owner))) then
set x = GetUnitX(hero)
set y = GetUnitY(hero)
if(GetLocalPlayer() == owner) then
call PanCameraToTimed(x, y, 1.0)
call ClearSelection()
call SelectUnit(hero, false)
endif
endif
endif
else
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0.0, 0.0, NO_HERO_MESSAGE)
endif
endif
else
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0.0, 0.0, WAIT_MESSAGE)
endif
endif
set caster = null
set hero = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger LockUnSelecterTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(LockUnSelecterTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(LockUnSelecterTrg, Condition(function Conditions))
call TriggerAddAction(LockUnSelecterTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=13
//TESH.alwaysfold=0
scope IncreaseCamera initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A08E' //Spell Increase Distance Camera rawcode
private constant real DISTANCE_INCREASE = 100.0 //Distance increase
private constant string DISTANCE_MESSAGE = "Camera distance is " //Distance update message
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local player owner = GetOwningPlayer(caster)
local integer ownerNum = GetPlayerId(owner)
if(Camera_Distance[ownerNum] < MAX_CAMERA_DISTANCE) then
set Camera_Distance[ownerNum] = Camera_Distance[ownerNum] + DISTANCE_INCREASE
endif
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0.0, 0.0, DISTANCE_MESSAGE + R2S(Camera_Distance[ownerNum]) + ".")
endif
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger IncreaseCameraTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(IncreaseCameraTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(IncreaseCameraTrg, Condition(function Conditions))
call TriggerAddAction(IncreaseCameraTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=14
//TESH.alwaysfold=0
scope DecreaseCamera initializer Deit
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A08F' //Spell Increase Distance Camera rawcode
private constant real DISTANCE_INCREASE = 100.0 //Distance increase
private constant string DISTANCE_MESSAGE = "Camera distance is " //Distance update message
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local player owner = GetOwningPlayer(caster)
local integer ownerNum = GetPlayerId(owner)
if(Camera_Distance[ownerNum] > MIN_CAMERA_DISTANCE) then
set Camera_Distance[ownerNum] = Camera_Distance[ownerNum] - DISTANCE_INCREASE
endif
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0.0, 0.0, DISTANCE_MESSAGE + R2S(Camera_Distance[ownerNum]) + ".")
endif
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Deit takes nothing returns nothing
local trigger DecreaseCameraTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(DecreaseCameraTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(DecreaseCameraTrg, Condition(function Conditions))
call TriggerAddAction(DecreaseCameraTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=7
//TESH.alwaysfold=0
scope ResetCamera initializer Deit
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A08G' //Spell Reset Camera rawcode
private constant string RESET_MESSAGE = "Camera is reset." //Reset message
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local player owner = GetOwningPlayer(caster)
local integer ownerNum = GetPlayerId(owner)
set Camera_Distance[ownerNum] = 2000.0
set Camera_Lock[ownerNum] = true
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0.0, 0.0, RESET_MESSAGE)
endif
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Deit takes nothing returns nothing
local trigger ResetCameraTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(ResetCameraTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(ResetCameraTrg, Condition(function Conditions))
call TriggerAddAction(ResetCameraTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=18
//TESH.alwaysfold=0
scope ShortcutCamera initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A08Q' //Spell Enable/Disable Camera rawcode
private constant string DISABLE_MESSAGE = "Camera shortcuts have been disabled." //Disable message
private constant string ENABLE_MESSAGE = "Camera shortcuts have been enabled." //Enable message
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local player owner = GetOwningPlayer(caster)
if(IsPlayerInForce(owner, Camera_Shortcut)) then
call ForceRemovePlayer(Camera_Shortcut, owner)
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0.0, 0.0, DISABLE_MESSAGE)
endif
else
call ForceAddPlayer(Camera_Shortcut, owner)
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0.0, 0.0, ENABLE_MESSAGE)
endif
endif
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger ShortcutCameraTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(ShortcutCameraTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(ShortcutCameraTrg, Condition(function Conditions))
call TriggerAddAction(ShortcutCameraTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=12
//TESH.alwaysfold=0
scope CommentarySetting initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A08R' //Spell Enable/Disable Commentary rawcode
private constant string DISABLE_MESSAGE = "Commentary has been disabled." //Disable message
private constant string ENABLE_MESSAGE = "Commentary has been enabled." //Enable message
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local player owner = GetOwningPlayer(caster)
if(IsPlayerInForce(owner, CommentaryForce)) then
call ForceRemovePlayer(CommentaryForce, owner)
call DisplayTextToPlayer(owner, 0.0, 0.0, DISABLE_MESSAGE)
else
call ForceAddPlayer(CommentaryForce, owner)
call DisplayTextToPlayer(owner, 0.0, 0.0, ENABLE_MESSAGE)
endif
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger CommentaryTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(CommentaryTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(CommentaryTrg, Condition(function Conditions))
call TriggerAddAction(CommentaryTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=19
//TESH.alwaysfold=0
scope TipsSetting initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A08S' //Spell Enable/Disable Tips rawcode
private constant string DISABLE_MESSAGE = "Tips has been disabled." //Disable message
private constant string ENABLE_MESSAGE = "Tips has been enabled." //Enable message
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local player owner = GetOwningPlayer(caster)
if(IsPlayerInForce(owner, TipsForce)) then
call ForceRemovePlayer(TipsForce, owner)
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0.0, 0.0, DISABLE_MESSAGE)
endif
else
call ForceAddPlayer(TipsForce, owner)
if(IsPlayerInForce(owner, CommentaryForce)) then
call DisplayTextToPlayer(owner, 0.0, 0.0, ENABLE_MESSAGE)
endif
endif
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger TipsTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(TipsTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(TipsTrg, Condition(function Conditions))
call TriggerAddAction(TipsTrg, function Actions)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope Recall initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A003' //Spell Recall rawcode
private constant real TIME_FACTOR_CAST = 1.0 //Time for cast to teleport
private constant real MIN_TIME = 5.0 //Minimum casting time
private constant real MAX_TIME = 10.0 //Maximum casting time
private constant string LOAD_MESSAGE = "Cannot recall because your hero is loaded in the ship" //Message when hero is loaded
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Human\\MassTeleport\\MassTeleportTo.mdl" //Teleport cast
private constant string SPELL_EFFECT = "Abilities\\Spells\\Human\\MassTeleport\\MassTeleportCaster.mdl" //Teleport effect
endglobals
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Recall_Data
unit u //Caster
unit t //Target
player o //Owner of caster
real r //Time remain
real x //Y of target
real y //X of target
effect e //Effect to target
boolean ok //Ok teleport
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Recall_Data array Ar[10]
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Recall_Data ld
local integer i = 0
local integer j = 0
local real x = 0.0
local real y = 0.0
local real tX = 0.0
local real tY = 0.0
local boolean pathable = false
local real randomDistance = 0.0
local real randomAngle = 0.0
local real rad = 0.0
loop
exitwhen(i >= Total)
set ld = Ar[i]
if(IsUnitDead(ld.t)) then
set ld.r = 0.0
set ld.ok = false
endif
if(ld.r > 0.0) then
set ld.r = ld.r - Interval()
if(ld.x != GetUnitX(ld.t) or ld.y != GetUnitY(ld.t)) then
set ld.r = 0.0
set ld.ok = false
endif
else
call DestroyEffect(ld.e)
call IssueImmediateOrder(ld.u, "stop")
if(ld.ok) then
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, ld.t, "origin"))
set tX = GetUnitX(ld.u)
set tY = GetUnitY(ld.u)
set x = tX
set y = tY
/*set pathable = false
set j = 0
loop
exitwhen(j >= 100 and pathable)
set randomDistance = I2R(GetRandomInt(200, 300))
set randomAngle = I2R(GetRandomInt(0, 360))
set rad = randomAngle * bj_DEGTORAD
set x = tX + randomDistance * Cos(rad)
set y = tY + randomDistance * Sin(rad)
set pathable = IsTerrainPathable(x, y, PATHING_TYPE_WALKABILITY)
set j = j + 1
endloop*/
call SetUnitPosition(ld.t, x, y)
call Pather(ld.u, 2.0)
endif
set ld.u = null
set ld.t = null
set ld.o = null
set ld.e = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call ld.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if(Total == 0) then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Recall_Data ld
local unit caster = GetTriggerUnit()
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
local unit target = GetHero(owner)
local real targetX = GetUnitX(target)
local real targetY = GetUnitY(target)
local real dx = casterX - targetX
local real dy = casterY - targetY
local real distance = SquareRoot(dx * dx + dy * dy)
local real time = RMaxBJ(RMinBJ(TIME_FACTOR_CAST * (distance / 200.0), MAX_TIME), MIN_TIME)
local integer i = 0
local boolean exist = false
if(not IsUnitInGroup(target, LoadedHero)) then
loop
exitwhen(i >= Total)
set ld = Ar[i]
if(ld.u == caster) then
set exist = true
set i = Total
endif
set i = i + 1
endloop
if(target != null and (not exist)) then
if(not IsUnitDead(target)) then
set ld = Recall_Data.create()
set ld.u = caster
set ld.t = target
set ld.o = owner
set ld.r = time
set ld.x = GetUnitX(target)
set ld.y = GetUnitY(target)
set ld.e = AddSpecialEffectTarget(SPECIAL_EFFECT, target, "origin")
set ld.ok = true
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = ld
endif
endif
else
call DisplayTextToPlayer(owner, 0.0, 0.0, LOAD_MESSAGE)
endif
set caster = null
set owner = null
set target = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger RecallTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(RecallTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(RecallTrg, Condition(function Conditions))
call TriggerAddAction(RecallTrg, function Actions)
//setting globals
set Tim = CreateTimer()
set Total = 0
endfunction
endscope
//TESH.scrollpos=422
//TESH.alwaysfold=0
globals
group LoadedHero = CreateGroup()
endglobals
scope Load initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer UNIT_ID = 'hbot' //Unit transport ship rawcode
private constant integer SPELL1_ID = 'A07P' //Spell Load rawcode
private constant integer SPELL2_ID = 'A0BE' //Spell Unload rawcode
private constant real HEAL_HP = 0.05 //Healing hitpoint factor
private constant real HEAL_MP = 0.05 //Healing mana factor
private constant real DISTANCE_CAST = 500.0 //Distance to cast load
private constant string SPELL_EFFECT = "Abilities\\Spells\\Items\\TomeOfRetraining\\TomeOfRetrainingCaster.mdl" //Load hero effect
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Items\\AIlm\\AIlmTarget.mdl" //Heal effect
endglobals
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Load_Data
unit u //Loaded
unit l //Loader
player o //Owner
boolean d //Loaded
real i //Interval
real im //Interval max
real hp //Hp percent heal
real mp //Mp percent heal
endstruct
//----------------------------------------------------------------
struct Order_Load_Data
unit u //Loaded
unit l //Loader
player o //Owner
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Load_Data array Ar[10]
private timer Tim2
private integer Total2
private Order_Load_Data array Ar2[10]
private rect array base[8]
private group copy
private group orderedHero
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Load_Data ld
local integer i = 0
local real life = 0.0
local real maxLife = 0.0
local real mana = 0.0
local real maxMana = 0.0
local boolean heal = false
local real x = 0.0
local real y = 0.0
local real tX = 0.0
local real tY = 0.0
local real rad = 0.0
loop
exitwhen(i >= Total)
set ld = Ar[i]
if(ld.d) then
if(ld.i > 0) then
set ld.i = ld.i - Interval()
else
set ld.i = ld.im
set life = GetUnitState(ld.u, UNIT_STATE_LIFE)
set maxLife = GetUnitState(ld.u, UNIT_STATE_MAX_LIFE)
set mana = GetUnitState(ld.u, UNIT_STATE_MANA)
set maxMana = GetUnitState(ld.u, UNIT_STATE_MAX_MANA)
set heal = false
if(life < maxLife) then
call SetUnitState(ld.u, UNIT_STATE_LIFE, life + maxLife * ld.hp)
set heal = true
endif
if(mana < maxMana) then
call SetUnitState(ld.u, UNIT_STATE_MANA, mana + maxMana * ld.mp)
set heal = true
endif
set x = GetUnitX(ld.u)
set y = GetUnitY(ld.u)
set tX = GetUnitX(ld.l)
set tY = GetUnitY(ld.l)
set rad = Atan2(tY - y, tX - x)
call SetUnitFacing(ld.u, rad * bj_RADTODEG)
if(heal) then
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, ld.l, "origin"))
endif
endif
call SetUnitInvulnerable(ld.u, true)
else
call SetUnitMoveSpeed(ld.l, GetUnitDefaultMoveSpeed(ld.l))
call Pather(ld.u, 2.0)
call SetUnitInvulnerable(ld.u, false)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, ld.u, "origin"))
set x = GetUnitX(ld.l)
set y = GetUnitY(ld.l)
call SetUnitX(ld.u, x)
call SetUnitY(ld.u, y)
if(ld.o == GetLocalPlayer()) then
call SelectUnit(ld.u, true)
call SelectUnit(ld.l, false)
call PanCameraToTimed(x, y, 0.0)
endif
call SetPlayerAbilityAvailable(ld.o, SPELL1_ID, true)
call UnitRemoveAbility(ld.l, SPELL2_ID)
call GroupRemoveUnit(LoadedHero, ld.u)
set ld.u = null
set ld.l = null
set ld.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call ld.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if(Total == 0) then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Load_Actions takes nothing returns nothing
local Load_Data ld = Load_Data.create()
local unit loaded = GetSpellTargetUnit()
local unit loader = GetTriggerUnit()
local player owner = GetOwningPlayer(loaded)
local integer ownerId = GetPlayerId(owner)
local real x = 0.0
local real y = 0.0
if(IsPlayerInForce(owner, All_Luminous)) then
set x = GetRectCenterX(gg_rct_Luminous_Base)
set y = GetRectCenterX(gg_rct_Luminous_Base)
elseif(IsPlayerInForce(owner, All_Overcast)) then
set x = GetRectCenterX(gg_rct_Overcast_Base)
set y = GetRectCenterX(gg_rct_Overcast_Base)
endif
set ld.u = loaded
set ld.l = loader
set ld.o = GetOwningPlayer(loaded)
set ld.d = true
set ld.i = 0.0
set ld.im = 1.0
set ld.hp = HEAL_HP
set ld.mp = HEAL_MP
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, loaded, "origin"))
call SetUnitMoveSpeed(loader, 522)
call SetUnitPosition(loaded, GetRectCenterX(base[ownerId]), GetRectCenterY(base[ownerId]))
call ShowUnit(loaded, true)
call SetUnitInvulnerable(loaded, true)
if(GetLocalPlayer() == owner) then
call SelectUnit(ld.u, true)
call SelectUnit(ld.l, false)
call PanCameraToTimed(x, y, 0.0)
endif
call SetPlayerAbilityAvailable(owner, SPELL1_ID, false)
call UnitAddAbility(loader, SPELL2_ID)
call GroupAddUnit(LoadedHero, loaded)
if(IsUnitInGroup(loaded, orderedHero)) then
call GroupRemoveUnit(orderedHero, loaded)
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = ld
call TriggerSleepAction(0.1)
call IssueImmediateOrder(loader, "stop")
set loaded = null
set loader = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Load_Conditions takes nothing returns boolean
local unit loader = GetTriggerUnit()
local boolean okey = GetUnitTypeId(loader) == UNIT_ID and /*
*/GetSpellAbilityId() == SPELL1_ID
set loader = null
return okey
endfunction
//----------------------------------------------------------------
private function Unload_Actions takes nothing returns nothing
local Load_Data ld
local unit loader = GetTriggerUnit()
local integer i = 0
loop
exitwhen(i >= Total)
set ld = Ar[i]
if(ld.d and loader == ld.l) then
set ld.d = false
set i = Total
endif
set i = i + 1
endloop
set loader = null
endfunction
//----------------------------------------------------------------
private function Unload_Conditions takes nothing returns boolean
local unit loader = GetTriggerUnit()
local boolean okey = GetUnitTypeId(loader) == UNIT_ID and /*
*/GetSpellAbilityId() == SPELL2_ID
set loader = null
return okey
endfunction
//----------------------------------------------------------------
private function Actions_Execute2 takes nothing returns nothing
local Order_Load_Data ld
local integer i = 0
local real x = 0.0
local real y = 0.0
local real tX = 0.0
local real tY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
loop
exitwhen(i >= Total2)
set ld = Ar2[i]
if(IsUnitInGroup(ld.u, orderedHero)) then
set x = GetUnitX(ld.u)
set y = GetUnitY(ld.u)
set tX = GetUnitX(ld.l)
set tY = GetUnitY(ld.l)
set dx = x - tX
set dy = y - tY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance < DISTANCE_CAST) then
call IssueTargetOrder(ld.l, "load", ld.u)
endif
else
call GroupRemoveUnit(orderedHero, ld.u)
set Ar2[i] = Ar2[Total2 - 1]
set Total2 = Total2 - 1
call ld.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if(Total2 == 0) then
call PauseTimer(Tim2)
endif
endfunction
//----------------------------------------------------------------
private function Order_Actions takes nothing returns nothing
local Order_Load_Data ld
local unit ordered = GetTriggerUnit()
local player owner = GetOwningPlayer(ordered)
local unit target = GetOrderTargetUnit()
local integer i = 0
local boolean exist = false
loop
exitwhen(i >= Total2)
set ld = Ar2[i]
if(ld.u == ordered and ld.l == target) then
set exist = true
set i = Total
endif
set i = i + 1
endloop
if(not exist) then
set ld = Order_Load_Data.create()
set ld.u = ordered
set ld.l = target
set ld.o = owner
call GroupAddUnit(orderedHero, ordered)
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = ld
endif
set ordered = null
set owner = null
set target = null
endfunction
//----------------------------------------------------------------
private function Order_Conditions takes nothing returns boolean
local unit ordered = GetTriggerUnit()
local unit target = GetOrderTargetUnit()
local integer orderID = GetIssuedOrderId()
local boolean okey = false
if(target != null) then
set okey = ((IsUnitType(ordered, UNIT_TYPE_HERO)) and /*
*/(not IsUnitIllusion(ordered)) and /*
*/(GetUnitTypeId(target) == UNIT_ID) and /*
*/(not IsUnitInGroup(ordered, orderedHero)) and /*
*/(orderID == 851971) and /*
*/(GetOwningPlayer(ordered) == GetOwningPlayer(target)) and /*
*/(not IsUnitInGroup(ordered, LoadedHero)))
endif
set ordered = null
set target = null
return okey
endfunction
//----------------------------------------------------------------
private function Cancel_Actions takes nothing returns nothing
local unit ordered = GetTriggerUnit()
call GroupRemoveUnit(orderedHero, ordered)
set ordered = null
endfunction
//----------------------------------------------------------------
private function Cancel_Conditions takes nothing returns boolean
local unit ordered = GetTriggerUnit()
local unit target = GetOrderTargetUnit()
local item targetItem = GetOrderTargetItem()
local destructable targetDest = GetOrderTargetDestructable()
local integer orderID = GetIssuedOrderId()
local boolean okey = false
if(target != null) then
set okey = IsUnitInGroup(ordered, orderedHero) and /*
*/(not IsUnitIllusion(ordered)) and /*
*/(GetUnitTypeId(target) != UNIT_ID)
else
set okey = (IsUnitInGroup(ordered, orderedHero) and /*
*/(not IsUnitIllusion(ordered))) or /*
*/(targetItem != null or targetDest != null)
endif
set ordered = null
set target = null
return okey
endfunction
//----------------------------------------------------------------
private function Leave_Actions takes nothing returns nothing
local unit leaver = GetTriggerUnit()
local player owner = GetOwningPlayer(leaver)
local integer ownerId = GetPlayerId(owner)
call SetUnitPosition(leaver, GetRectCenterX(base[ownerId]), GetRectCenterY(base[ownerId]))
set leaver = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Leave_Conditions takes nothing returns boolean
local unit leaver = GetTriggerUnit()
local boolean okey = IsUnitInGroup(leaver, Heroes) and IsUnitInGroup(leaver, LoadedHero)
set leaver = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger LoadTrg = CreateTrigger()
local trigger UnloadTrg = CreateTrigger()
local trigger LoadOrderTrg = CreateTrigger()
local trigger LoadCancelTrg = CreateTrigger()
local integer i = 0
local player p = null
call TriggerRegisterAnyUnitEventBJ(LoadTrg, EVENT_PLAYER_UNIT_SPELL_CAST)
call TriggerAddCondition(LoadTrg, Condition(function Load_Conditions))
call TriggerAddAction(LoadTrg, function Load_Actions)
call TriggerRegisterAnyUnitEventBJ(UnloadTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(UnloadTrg, Condition(function Unload_Conditions))
call TriggerAddAction(UnloadTrg, function Unload_Actions)
call TriggerRegisterAnyUnitEventBJ(LoadOrderTrg, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER)
call TriggerAddCondition(LoadOrderTrg, Condition(function Order_Conditions))
call TriggerAddAction(LoadOrderTrg, function Order_Actions)
call TriggerRegisterAnyUnitEventBJ(LoadCancelTrg, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER)
call TriggerRegisterAnyUnitEventBJ(LoadCancelTrg, EVENT_PLAYER_UNIT_ISSUED_ORDER)
call TriggerRegisterAnyUnitEventBJ(LoadCancelTrg, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER)
call TriggerAddCondition(LoadCancelTrg, Condition(function Cancel_Conditions))
call TriggerAddAction(LoadCancelTrg, function Cancel_Actions)
call TriggerRegisterLeaveRectSimple(ForceBaseTrg, gg_rct_Luminous_Base)
call TriggerRegisterLeaveRectSimple(ForceBaseTrg, gg_rct_Overcast_Base)
call TriggerAddCondition(ForceBaseTrg, Condition(function Leave_Conditions))
call TriggerAddAction(ForceBaseTrg, function Leave_Actions)
//setting globals
set Tim = CreateTimer()
set Total = 0
set Tim2 = CreateTimer()
set Total2 = 0
set copy = CreateGroup()
set orderedHero = CreateGroup()
set base[0] = gg_rct_Base_1
set base[1] = gg_rct_Base_2
set base[2] = gg_rct_Base_3
set base[3] = gg_rct_Base_4
set base[4] = gg_rct_Base_5
set base[5] = gg_rct_Base_6
set base[6] = gg_rct_Base_7
set base[7] = gg_rct_Base_8
set p = null
endfunction
endscope
//TESH.scrollpos=18
//TESH.alwaysfold=0
scope CollectItem initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'Awrg' //Spell Transfer Item rawcode
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private unit Caster
private unit Hero
endglobals
//----------------------------------------------------------------
function Item_Function takes nothing returns nothing
local item enumItem = GetEnumItem()
local integer enumItemId = GetItemUserData(enumItem)
local integer itemOwnerId = LoadInteger(Item_Ht, enumItemId, ITEM_OWNER_KEY)
local player owner = GetOwningPlayer(Caster)
local integer ownerId = GetPlayerId(owner)
local boolean allow = (itemOwnerId == ownerId) and (not Rune_Conditions(enumItem)) and (not ShareItem_Conditions(enumItem))
if(allow) then
if(Hero == null) then
call SetItemPosition(enumItem, GetUnitX(Caster), GetUnitY(Caster))
call UnitAddItem(Caster, enumItem)
else
if(not UnitHasItem(Hero, enumItem)) then
call SetItemPosition(enumItem, GetUnitX(Caster), GetUnitY(Caster))
call UnitAddItem(Caster, enumItem)
endif
endif
endif
set enumItem = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local player owner = GetOwningPlayer(caster)
local integer ownerId = GetPlayerId(owner)
local unit hero = GetHero(owner)
local item itemF = null
local integer i = 0
local integer total = 0
if(hero != null) then
/*if(not (HaveSavedInteger(Item_Ht, ownerId, ITEM_TOTAL_SAVE_KEY))) then
call SaveInteger(Item_Ht, ownerId, ITEM_TOTAL_SAVE_KEY, 1)
else
set total = LoadInteger(Item_Ht, ownerId, ITEM_TOTAL_SAVE_KEY)
set i = 1
loop
exitwhen(i >= total)
set itemF = LoadItemHandle(Item_Ht, ownerId, i)
if(itemF != null) then
if(not UnitHasItem(hero, itemF)) then
call UnitAddItem(caster, itemF)
endif
endif
set i = i + 1
endloop
endif*/
if(caster == null) then
set Caster = caster
set Hero = hero
call EnumItemsInRect(bj_mapInitialPlayableArea, null, function Item_Function)
else
call TriggerSleepAction(0.1)
set Caster = caster
set Hero = hero
call EnumItemsInRect(bj_mapInitialPlayableArea, null, function Item_Function)
endif
set Caster = null
set Hero = null
else
if(caster == null) then
set Caster = caster
call EnumItemsInRect(bj_mapInitialPlayableArea, null, function Item_Function)
else
call TriggerSleepAction(0.1)
set Caster = caster
call EnumItemsInRect(bj_mapInitialPlayableArea, null, function Item_Function)
endif
set Caster = null
endif
set caster = null
set hero = null
set itemF = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger CollectItemTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(CollectItemTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(CollectItemTrg, Condition(function Conditions))
call TriggerAddAction(CollectItemTrg, function Actions)
//setting glboals
set Caster = null
set Hero = null
endfunction
endscope
//TESH.scrollpos=45
//TESH.alwaysfold=0
scope TransferItem initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'ANta' //Spell Transfer Item rawcode
private constant real OFFSET = 50.0 //Offset transfer
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local player owner = GetOwningPlayer(caster)
local integer ownerId = GetPlayerId(owner)
local unit hero = GetHero(owner)
local real heroX = 0.0
local real heroY = 0.0
local real rad = 0.0
local item itemF = null
local integer i = 0
local integer j = 0
local integer count = 0
if(hero != null) then
if(not IsUnitDead(hero)) then
set rad = GetUnitFacing(hero) * bj_DEGTORAD
set heroX = GetUnitX(hero) + OFFSET * Cos(rad)
set heroY = GetUnitY(hero) + OFFSET * Sin(rad)
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(caster, i)
if(itemF != null) then
call UnitRemoveItem(caster, itemF)
call SetItemPosition(itemF, heroX, heroY)
set count = 0
set j = 0
loop
exitwhen(j >= bj_MAX_INVENTORY)
if(UnitItemInSlot(hero, j) != null) then
set count = count + 1
endif
set j = j + 1
endloop
if(count < bj_MAX_INVENTORY) then
call UnitAddItem(hero, itemF)
else
call Item_Take_Upgrade_Actions(hero, itemF)
endif
endif
set i = i + 1
endloop
endif
endif
set caster = null
set hero = null
set itemF = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Cast_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local player owner = GetOwningPlayer(caster)
local integer ownerId = GetPlayerId(owner)
local unit hero = GetHero(owner)
local real heroX = 0.0
local real heroY = 0.0
local real rad = 0.0
local item itemF = null
local integer i = 0
local integer j = 0
local integer count = 0
if(hero != null) then
if(not IsUnitDead(hero)) then
if(IsUnitInGroup(hero, LoadedHero)) then
set rad = GetUnitFacing(hero) * bj_DEGTORAD
set heroX = GetUnitX(hero) + OFFSET * Cos(rad)
set heroY = GetUnitY(hero) + OFFSET * Sin(rad)
set i = 0
loop
exitwhen(i >= bj_MAX_INVENTORY)
set itemF = UnitItemInSlot(caster, i)
if(itemF != null) then
call UnitRemoveItem(caster, itemF)
call SetItemPosition(itemF, heroX, heroY)
set count = 0
set j = 0
loop
exitwhen(j >= bj_MAX_INVENTORY)
if(UnitItemInSlot(hero, j) != null) then
set count = count + 1
endif
set j = j + 1
endloop
if(count < bj_MAX_INVENTORY) then
call UnitAddItem(hero, itemF)
else
call Item_Take_Upgrade_Actions(hero, itemF)
endif
endif
set i = i + 1
endloop
call IssueImmediateOrder(caster, "stop")
endif
endif
endif
set caster = null
set hero = null
set itemF = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger TransferItemTrg = CreateTrigger()
local trigger TransferItemCastTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(TransferItemTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(TransferItemTrg, Condition(function Conditions))
call TriggerAddAction(TransferItemTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(TransferItemCastTrg, EVENT_PLAYER_UNIT_SPELL_CAST)
call TriggerAddCondition(TransferItemCastTrg, Condition(function Conditions))
call TriggerAddAction(TransferItemCastTrg, function Cast_Actions)
endfunction
endscope
//TESH.scrollpos=91
//TESH.alwaysfold=0
scope HolyLight initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A047' //Spell Holy Light rawcode
private constant real MAX_INTERVAL = 1.0 //Interval delay
private constant real MIN_INTERVAL = 0.2 //Minimum interval
private constant real RATE_DECREASE = 0.2 //Rate speed decrease
private constant integer ITEM1_UPGRADE1 = 'rlif' //Item Runical Ring
private constant integer ITEM1_UPGRADE2 = 'I00A' //Item Aurelian Ring
private constant integer ITEM1_UPGRADE3 = 'I01U' //Item Royaltouch
private constant integer ITEM1_UPGRADE4 = 'rnsp' //Item Ivory Halo
private constant integer ITEM2_UPGRADE = 'I015' //Item Orb of Descent
private constant integer ITEM3_UPGRADE = 'I01G' //Item Throne of Emperor
private constant integer ITEM4_UPGRADE = 'I01P' //Item Anexiler
private constant real UPGRADE1_DURATION1 = 1.0 //Upgrade 1 effect 1
private constant real UPGRADE1_DURATION2 = 2.0 //Upgrade 1 effect 2
private constant real UPGRADE1_DURATION3 = 3.0 //Upgrade 1 effect 3
private constant real UPGRADE1_DURATION4 = 4.0 //Upgrade 1 effect 4
private constant real UPGRADE1_HEAL3 = 30.0 //Upgrade 1 effect 3
private constant real UPGRADE1_HEAL4 = 60.0 //Upgrade 1 effect 4
private constant real UPGRADE2_MAX_RANGE = 1200.0 //Upgrade 2 effect
private constant real UPGRADE3_RATE_DECREASE = 0.1 //Upgrade 3 effect
private constant real UPGRADE4_START_INTERVAL = 0.6 //Upgrade 4 effect
private constant real MAX_RANGE = 1200.0 //Max range of target
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_DIVINE //Spell attack type
private constant string SPELL_EFFECT = "Abilities\\Spells\\Human\\Resurrect\\ResurrectTarget.mdl" //Effect to area
endglobals
//Damage multiple
private function Damage takes integer level returns real
if(level == 1) then
return 60.0
elseif(level == 2) then
return 80.0
elseif(level == 3) then
return 120.0
elseif(level == 4) then
return 200.0
else
return 0.0
endif
endfunction
//Radius of effect
private function Radius takes integer level returns real
return 250.0 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct HolyLight_Data
unit u //Unit caster
player o //Owner of caster
unit t //Unit target
boolean c //Channel
real x //Target x
real y //Target y
real r //Radius
real i //Interval
real im //Interval max
real f //Rate decrease
real et //Extra time
real mc //Max channel range
real d //Damage
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private HolyLight_Data array Ar[100]
private group all
private boolexpr bexpr
private location loc
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local HolyLight_Data sd
local integer i = 0
local unit f = null
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.c or sd.et > 0.0) then
if(not sd.c) then
set sd.et = sd.et - Interval()
else
call QueueUnitAnimation(sd.u, "channel")
endif
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
if(sd.t != null) then
set sd.x = GetUnitX(sd.t)
set sd.y = GetUnitY(sd.t)
set dx = sd.x - GetUnitX(sd.u)
set dy = sd.y - GetUnitY(sd.u)
set distance = SquareRoot(dx * dx + dy * dy)
if(distance > MAX_RANGE) then
set sd.c = false
endif
endif
if(sd.im > MIN_INTERVAL) then
set sd.im = sd.im - sd.f
else
set sd.im = MIN_INTERVAL
endif
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, sd.x, sd.y))
call GroupEnumUnitsInRange(all, sd.x, sd.y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
if(not IsUnitType(f, UNIT_TYPE_MAGIC_IMMUNE)) then
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, (sd.d/2), true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, (sd.d/2), true, false, A_TYPE, D_TYPE, null)
endif
endif
elseif(IsUnitAlly(f, sd.o) and (GetOwningPlayer(f) != Player(PLAYER_NEUTRAL_PASSIVE))) then
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call SetUnitState(f, UNIT_STATE_LIFE, GetUnitState(f, UNIT_STATE_LIFE) + sd.d * ETHEREAL_BONUS)
else
call SetUnitState(f, UNIT_STATE_LIFE, GetUnitState(f, UNIT_STATE_LIFE) + sd.d)
endif
endif
endloop
endif
else
call PauseUnit(sd.u, true)
call PauseUnit(sd.u, false)
set sd.u = null
set sd.o = null
set sd.t = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local HolyLight_Data sd = HolyLight_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local unit target = GetSpellTargetUnit()
local real targetX = 0.0
local real targetY = 0.0
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM1_UPGRADE4)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE)
local integer item6 = IsUnitHasItemType(caster, ITEM3_UPGRADE)
local integer item7 = IsUnitHasItemType(caster, ITEM4_UPGRADE)
if(target == null) then
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
else
set targetX = GetUnitX(target)
set targetY = GetUnitY(target)
endif
set sd.u = caster
set sd.o = owner
set sd.t = target
set sd.c = true
set sd.x = targetX
set sd.y = targetY
set sd.r = Radius(level)
set sd.i = 0.0
set sd.im = MAX_INTERVAL
set sd.f = RATE_DECREASE
set sd.et = 0.0
set sd.mc = MAX_RANGE
set sd.d = Damage(level)
set sd.d = sd.d + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
if(item1 > 0) then
set sd.et = sd.et + (UPGRADE1_DURATION1 * item1)
endif
if(item2 > 0) then
set sd.et = sd.et + (UPGRADE1_DURATION2 * item2)
endif
if(item3 > 0) then
set sd.et = sd.et + (UPGRADE1_DURATION3 * item3)
set sd.d = sd.d + (UPGRADE1_HEAL3 * item3)
endif
if(item4 > 0) then
set sd.et = sd.et + (UPGRADE1_DURATION4 * item4)
set sd.d = sd.d + (UPGRADE1_HEAL4 * item4)
endif
if(item5 > 0) then
set sd.mc = sd.mc + (UPGRADE2_MAX_RANGE * item5)
endif
if(item6 > 0) then
set sd.f = sd.f - (UPGRADE3_RATE_DECREASE * item6)
endif
if(item7 > 0) then
set sd.im = UPGRADE4_START_INTERVAL
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
set target = null
endfunction
//----------------------------------------------------------------
private function Stop_Actions takes nothing returns nothing
local HolyLight_Data sd
local unit caster = GetTriggerUnit()
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set sd.c = false
endif
set i = i + 1
endloop
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(HolyLightTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(HolyLightTrg, Condition(function Conditions))
call TriggerAddAction(HolyLightTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(HolyLightStopTrg, EVENT_PLAYER_UNIT_SPELL_ENDCAST)
call TriggerAddCondition(HolyLightStopTrg, Condition(function Conditions))
call TriggerAddAction(HolyLightStopTrg, function Stop_Actions)
//Setting globals
set all = CreateGroup()
set bexpr = Condition(function Pick)
set Tim = CreateTimer()
set Total = 0
set loc = Location(0, 0)
//Preload
call Preload(SPELL_EFFECT)
call AbilityPreload(SPELL_ID)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope UnityBless initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A06E' //Spell Unity Bless rawcode
private constant real RADIUS = 900.0 //Radius area of effect
private constant real INTERVAL = 0.05 //Interval
private constant real MAX_INTERVAL = 1.0 //Max interval
private constant integer MAX_STACK = 5 //Max stack
private constant integer ITEM1_UPGRADE1 = 'rde1' //Item Barrel Buckler
private constant integer ITEM1_UPGRADE2 = 'rde2' //Item Solid Defense
private constant integer ITEM1_UPGRADE3 = 'I026' //Item Adamandatank
private constant integer ITEM1_UPGRADE4 = 'I023' //Item Orenda Spectrum
private constant real UPGRADE1_RADIUS1 = 100.0 //Upgrade 1 effect
private constant real UPGRADE1_RADIUS2 = 200.0 //Upgrade 1 effect
private constant real UPGRADE1_RADIUS3 = 300.0 //Upgrade 1 effect
private constant real UPGRADE1_RADIUS4 = 400.0 //Upgrade 1 effect
private constant real UPGRADE1_HEAL3 = 25.0 //Upgrade 1 effect
private constant real UPGRADE1_HEAL4 = 50.0 //Upgrade 1 effect
private constant integer CAST_ID = 'Ainf' //Cast Unity Bless (Dummy) rawcode
private constant integer BUFF2_ID = 'Binf' //Buff Unity Bless (Dummy) rawcode
private constant integer DUMMY0_ID = 'n02M' //Dummy Unity Bless (Level 2) rawcode
private constant integer DUMMY1_ID = 'n029' //Dummy Unity Bless (Level 2) rawcode
private constant integer DUMMY2_ID = 'n02A' //Dummy Unity Bless (Level 3) rawcode
private constant integer DUMMY3_ID = 'n02B' //Dummy Unity Bless (Level 4) rawcode
private constant integer DUMMY4_ID = 'n02C' //Dummy Unity Bless (Level 5) rawcode
endglobals
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetOwningPlayer(target) != Player(PLAYER_NEUTRAL_PASSIVE)) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false)
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private trigger UnityBlessTrg
private group Group
private group Dummies
private group copy
private group all
private boolexpr bexpr
private real interval
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit f = null
local real fX = 0.0
local real fY = 0.0
local integer level = 0
local player owner = null
local integer total = 0
local unit g = null
local real radius = 0.0
local real heal = 0.0
local integer item1 = 0
local integer item2 = 0
local integer item3 = 0
local integer item4 = 0
set copy = CopyGroup(Group)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set level = GetUnitAbilityLevel(f, SPELL_ID)
if(level > 0) then
set owner = GetOwningPlayer(f)
set item1 = IsUnitHasItemType(f, ITEM1_UPGRADE1)
set item2 = IsUnitHasItemType(f, ITEM1_UPGRADE2)
set item3 = IsUnitHasItemType(f, ITEM1_UPGRADE3)
set item4 = IsUnitHasItemType(f, ITEM1_UPGRADE4)
set radius = RADIUS
set heal = 0.0
if(item1 > 0) then
set radius = RADIUS + (UPGRADE1_RADIUS1 * item1)
endif
if(item2 > 0) then
set radius = RADIUS + (UPGRADE1_RADIUS2 * item2)
endif
if(item3 > 0) then
set radius = RADIUS + (UPGRADE1_RADIUS3 * item3)
set heal = heal + (UPGRADE1_HEAL3 * item3)
endif
if(item4 > 0) then
set radius = RADIUS + (UPGRADE1_RADIUS4 * item4)
set heal = heal + (UPGRADE1_HEAL4 * item4)
endif
if(interval > 0) then
set interval = interval - INTERVAL
else
set interval = MAX_INTERVAL
set total = 0
if(not IsUnitDead(f)) then
call GroupEnumUnitsInRange(all, fX, fY, radius, bexpr)
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
if(IsUnitType(g, UNIT_TYPE_HERO) and IsUnitAlly(g, owner) and (GetOwningPlayer(g) != Player(PLAYER_NEUTRAL_PASSIVE))) then
set total = total + 1
endif
endloop
endif
if(total > 0) then
call GroupEnumUnitsInRange(all, fX, fY, radius, bexpr)
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
//if(GetUnitAbilityLevel(g, BUFF2_ID) <= 0) then
if(IsUnitAlly(g, owner) and (GetOwningPlayer(g) != Player(PLAYER_NEUTRAL_PASSIVE)) and IsUnitType(g, UNIT_TYPE_HERO)) then
call TargetCast(owner, GetUnitX(g), GetUnitY(g), 1.0, CAST_ID, (level - 1) * 5 + total, "innerfire", 0, g)
if(total == MAX_STACK) then
if(item3 > 0) then
call SetUnitState(g, UNIT_STATE_LIFE, GetUnitState(g, UNIT_STATE_LIFE) + heal)
endif
if(item4 > 0) then
call SetUnitState(g, UNIT_STATE_LIFE, GetUnitState(g, UNIT_STATE_LIFE) + heal)
endif
endif
endif
//endif
endloop
endif
set all = CopyGroup(Dummies)
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
if(IsUnitAlly(g, owner)) then
if(GetUnitTypeId(g) == DUMMY0_ID) then
if(total > 0) then
call SetUnitVertexColor(g, 255, 255, 255, 255)
else
call SetUnitVertexColor(g, 255, 255, 255, 0)
endif
elseif(GetUnitTypeId(g) == DUMMY1_ID) then
if(total > 1) then
call SetUnitVertexColor(g, 255, 255, 255, 255)
else
call SetUnitVertexColor(g, 255, 255, 255, 0)
endif
elseif(GetUnitTypeId(g) == DUMMY2_ID) then
if(total > 2) then
call SetUnitVertexColor(g, 255, 255, 255, 255)
else
call SetUnitVertexColor(g, 255, 255, 255, 0)
endif
elseif(GetUnitTypeId(g) == DUMMY3_ID) then
if(total > 3) then
call SetUnitVertexColor(g, 255, 255, 255, 255)
else
call SetUnitVertexColor(g, 255, 255, 255, 0)
endif
elseif(GetUnitTypeId(g) == DUMMY4_ID) then
if(total > 4) then
call SetUnitVertexColor(g, 255, 255, 255, 255)
else
call SetUnitVertexColor(g, 255, 255, 255, 0)
endif
endif
endif
endloop
endif
else
set total = 0
set all = CopyGroup(Dummies)
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
if(IsUnitAlly(g, owner)) then
call SetUnitVertexColor(g, 255, 255, 255, 0)
call SetUnitVertexColor(g, 255, 255, 255, 0)
call SetUnitVertexColor(g, 255, 255, 255, 0)
call SetUnitVertexColor(g, 255, 255, 255, 0)
call SetUnitVertexColor(g, 255, 255, 255, 0)
endif
endloop
endif
set all = CopyGroup(Dummies)
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
if(IsUnitAlly(g, owner)) then
call SetUnitX(g, fX)
call SetUnitY(g, fY)
endif
endloop
endloop
set f = null
set g = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local unit learner = GetLearningUnit()
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
local real face = GetUnitFacing(learner)
local real learnerX = GetUnitX(learner)
local real learnerY = GetUnitY(learner)
local player owner = GetOwningPlayer(learner)
local unit dummy = null
if(GetUnitAbilityLevel(learner, SPELL_ID) <= 1 and (not IsUnitInGroup(learner, Group))) then
call GroupAddUnit(Group, learner)
set dummy = CreateUnit(owner, DUMMY0_ID, learnerX, learnerY, face)
call UnitAddAbility(dummy, 'Arav')
call UnitRemoveAbility(dummy, 'Arav')
call SetUnitPathing(dummy, false)
call SetUnitX(dummy, learnerX)
call SetUnitY(dummy, learnerY)
call GroupAddUnit(Dummies, dummy)
set dummy = CreateUnit(owner, DUMMY1_ID, learnerX, learnerY, face)
call UnitAddAbility(dummy, 'Arav')
call UnitRemoveAbility(dummy, 'Arav')
call SetUnitPathing(dummy, false)
call SetUnitX(dummy, learnerX)
call SetUnitY(dummy, learnerY)
call GroupAddUnit(Dummies, dummy)
set dummy = CreateUnit(owner, DUMMY2_ID, learnerX, learnerY, face)
call UnitAddAbility(dummy, 'Arav')
call UnitRemoveAbility(dummy, 'Arav')
call SetUnitPathing(dummy, false)
call SetUnitX(dummy, learnerX)
call SetUnitY(dummy, learnerY)
call GroupAddUnit(Dummies, dummy)
set dummy = CreateUnit(owner, DUMMY3_ID, learnerX, learnerY, face)
call UnitAddAbility(dummy, 'Arav')
call UnitRemoveAbility(dummy, 'Arav')
call SetUnitPathing(dummy, false)
call SetUnitX(dummy, learnerX)
call SetUnitY(dummy, learnerY)
call GroupAddUnit(Dummies, dummy)
set dummy = CreateUnit(owner, DUMMY4_ID, learnerX, learnerY, face)
call UnitAddAbility(dummy, 'Arav')
call UnitRemoveAbility(dummy, 'Arav')
call SetUnitPathing(dummy, false)
call SetUnitX(dummy, learnerX)
call SetUnitY(dummy, learnerY)
call GroupAddUnit(Dummies, dummy)
if(not IsTriggerEnabled(UnityBlessTrg)) then
call EnableTrigger(UnityBlessTrg)
endif
endif
set learner = null
set dummy = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
return GetLearnedSkill() == SPELL_ID and (not IsUnitIllusion(GetTriggerUnit()))
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set UnityBlessTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(UnityBlessLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(UnityBlessLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(UnityBlessLearnTrg, function Learn_Actions)
call TriggerRegisterTimerEventPeriodic(UnityBlessTrg, INTERVAL)
call DisableTrigger(UnityBlessTrg)
call TriggerAddAction(UnityBlessTrg, function Actions)
//Setting globals
set Group = CreateGroup()
set Dummies = CreateGroup()
set copy = CreateGroup()
set all = CreateGroup()
set bexpr = Condition(function Pick)
set interval = 0.0
//Preload
call AbilityPreload(SPELL_ID)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope AngelFlash initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A049' //Spell AngelFlash rawcode
private constant integer DUMMY_ID = 'n00I' //Dummy AngelFlash rawcode
private constant integer DUMMY2_ID = 'n00J' //Dummy AngelFlash rawcode
private constant integer DUMMY3_ID = 'n00K' //Dummy AngelFlash rawcode
private constant integer ABILITY_ID = 'A047' //Spell Holy Light rawcode
private constant real PING_DURATION = 2.0 //Ping duration
private constant integer ITEM1_UPGRADE1 = 'tels' //Item Hunting Scope
private constant integer ITEM1_UPGRADE2 = 'crys' //Item Crystal Ball
private constant integer ITEM2_UPGRADE1 = 'I01Q' //Item Book of Spirit
private constant integer ITEM2_UPGRADE2 = 'I01R' //Item Shadow Grimoire
private constant integer ITEM3_UPGRADE1 = 'I00H' //Item Warmarcher
private constant integer ITEM3_UPGRADE2 = 'I019' //Item Skypath Strider
private constant real UPGRADE1_TIME_REMAIN1 = 1.0 //Upgrade 1 effect 1
private constant real UPGRADE1_TIME_REMAIN2 = 2.0 //Upgrade 1 effect 2
private constant real UPGRADE3_DELAY1 = 0.5 //Upgrade 3 effect 1
private constant real UPGRADE3_DELAY2 = 1.0 //Upgrade 3 effect 2
private constant string HOLY_LIGHT_EFFECT = "Abilities\\Spells\\Human\\Resurrect\\ResurrectTarget.mdl" //Effect to area
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_DIVINE //Spell attack type
endglobals
//Time remain
private function Time_Remain takes integer level returns real
if(level == 1) then
return 4.0
elseif(level == 2) then
return 5.0
elseif(level == 3) then
return 6.0
else
return 0.0
endif
endfunction
//Max interval
private function Delay takes integer level returns real
if(level == 1) then
return 3.0
elseif(level == 2) then
return 2.5
elseif(level == 3) then
return 2.0
else
return 0.0
endif
endfunction
//Radius of holy light
private function Radius takes integer level returns real
return 0.0 + (300.0 * level)
endfunction
//Holy Light damage
private function HolyLight_Damage takes integer level returns real
if(level == 1) then
return 60.0
elseif(level == 2) then
return 80.0
elseif(level == 3) then
return 120.0
elseif(level == 4) then
return 200.0
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct AngelFlash_Data
unit u //Unit caster
player o //Owner of caster
group g //Group target holy light
unit dum //Dummy
unit dum2 //Dummy
unit dum3 //Dummy
boolean l //Going to launch
real t //Time remain
real d //Delay
boolean j //Jump
integer up2 //Item upgrade 2
boolean up //Upgrade invulnerable
boolean iv //Invulnerable
endstruct
//----------------------------------------------------------------
globals
private AngelFlash_Data array Ar[100]
private timer Tim
private integer Total
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local AngelFlash_Data sd
local integer i = 0
local real x = 0.0
local real y = 0.0
local integer level = 0
local real damage = 0.0
local unit f = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t > 0) then
set sd.t = sd.t - Interval()
if(not sd.j) then
if(sd.d > 0.0) then
if(IsUnitVisible(sd.dum, sd.o)) then
set sd.d = sd.d - Interval()
endif
if(not sd.l) then
if(sd.d < 0.5) then
set sd.l = true
set sd.dum2 = CreateUnit(sd.o, DUMMY2_ID, GetUnitX(sd.u), GetUnitY(sd.u), bj_UNIT_FACING)
call UnitApplyTimedLife(sd.dum2, 'BTLF', 2.0)
call UnitAddAbility(sd.dum2, 'Arav')
call UnitRemoveAbility(sd.dum2, 'Arav')
call SetUnitPathing(sd.dum2, false)
call SetUnitX(sd.dum2, GetUnitX(sd.u))
call SetUnitY(sd.dum2, GetUnitY(sd.u))
endif
else
call SetUnitX(sd.dum2, GetUnitX(sd.u))
call SetUnitY(sd.dum2, GetUnitY(sd.u))
endif
else
set x = GetUnitX(sd.dum)
set y = GetUnitY(sd.dum)
set level = GetUnitAbilityLevel(sd.u, ABILITY_ID)
if(level > 0 and sd.up2 > 0) then
set damage = HolyLight_Damage(level)
set damage = damage + (damage * LoadInteger(MagicDamage_Ht, GetUnitUserData(sd.u), 0) * 0.01)
call GroupEnumUnitsInRange(all, x, y, Radius(sd.up2), bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(not IsUnitInGroup(f, sd.g) and f != sd.u) then
call GroupAddUnit(sd.g, f)
if(IsUnitAlly(f, sd.o)) then
call DestroyEffect(AddSpecialEffectTarget(HOLY_LIGHT_EFFECT, f, "origin"))
call SetUnitState(f, UNIT_STATE_LIFE, GetUnitState(f, UNIT_STATE_LIFE) + damage)
endif
endif
endloop
endif
call SetUnitX(sd.u, x)
call SetUnitY(sd.u, y)
call SetUnitAnimation(sd.u, "ready")
call RemoveUnit(sd.dum)
set sd.dum3 = CreateUnit(sd.o, DUMMY3_ID, x, y, bj_UNIT_FACING)
call UnitApplyTimedLife(sd.dum3, 'BTLF', 2.0)
call UnitAddAbility(sd.dum3, 'Arav')
call UnitRemoveAbility(sd.dum3, 'Arav')
call SetUnitPathing(sd.dum3, false)
call SetUnitX(sd.dum3, GetUnitX(sd.dum))
call SetUnitY(sd.dum3, GetUnitY(sd.dum))
if(sd.up) then
if(not sd.iv) then
call SetUnitInvulnerable(sd.u, true)
set sd.iv = true
endif
endif
set sd.j = true
set sd.d = 5.0
set sd.dum = null
endif
elseif(sd.d > 0.0) then
set sd.d = sd.d - Interval()
call SetUnitX(sd.dum3, GetUnitX(sd.u))
call SetUnitY(sd.dum3, GetUnitY(sd.u))
else
call RemoveUnit(sd.dum)
call RemoveUnit(sd.dum2)
call RemoveUnit(sd.dum3)
if(sd.iv) then
call SetUnitInvulnerable(sd.u, false)
endif
set sd.u = null
set sd.o = null
set sd.dum = null
set sd.dum2 = null
set sd.dum3 = null
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
else
call RemoveUnit(sd.dum)
call RemoveUnit(sd.dum2)
call RemoveUnit(sd.dum3)
if(sd.iv) then
call SetUnitInvulnerable(sd.u, false)
endif
set sd.u = null
set sd.o = null
set sd.dum = null
set sd.dum2 = null
set sd.dum3 = null
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local AngelFlash_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real targetX = GetSpellTargetX()
local real targetY = GetSpellTargetY()
local integer levelHolyLight = GetUnitAbilityLevel(caster, ABILITY_ID)
local real radius = 0.0
local real damage = 0.0
local boolean isNull = (Ar[Total] == null)
local unit f = null
local integer i = 0
local player p = null
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item5 = IsUnitHasItemType(caster, ITEM3_UPGRADE1)
local integer item6 = IsUnitHasItemType(caster, ITEM3_UPGRADE2)
if(targetX > WorldBounds.minX + 300.0 and /*
*/targetX < WorldBounds.maxX - 300.0 and /*
*/targetY > WorldBounds.minY + 300.0 and /*
*/targetY < WorldBounds.maxY - 300.0 and (not IsWall(targetX, targetY, 100.0))) then
if(isNull) then
set sd = AngelFlash_Data.create()
set sd.g = CreateGroup()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.o = owner
set sd.dum = CreateUnit(owner, DUMMY_ID, targetX, targetY, bj_UNIT_FACING)
call SetUnitPosition(sd.dum, targetX, targetY)
call SetUnitExploded(sd.dum, true)
call UnitAddAbility(sd.dum, 'Aloc')
call SetUnitTimeScale(sd.dum, 5.0)
call UnitAddAbility(sd.dum, 'Arav')
call UnitRemoveAbility(sd.dum, 'Arav')
call SetUnitFlyHeight(sd.dum, 100.0, 0.0)
set sd.dum2 = null
set sd.dum3 = null
set sd.l = false
set sd.t = Time_Remain(level)
set sd.d = Delay(level)
set sd.j = false
set sd.up2 = 0
set sd.up = false
set sd.iv = false
if(item1 > 0) then
set sd.t = sd.t + (UPGRADE1_TIME_REMAIN1 * item1)
endif
if(item2 > 0) then
set sd.t = sd.t + (UPGRADE1_TIME_REMAIN2 * item2)
endif
if(item5 > 0) then
set sd.d = sd.d - (UPGRADE3_DELAY1 * item5)
endif
if(item6 > 0) then
set sd.d = sd.d - (UPGRADE3_DELAY2 * item6)
set sd.up = true
endif
if(levelHolyLight > 0 and /*
*/((item3 > 0) or /*
*/(item4 > 0))) then
if(item3 > 0) then
set radius = Radius(1)
set sd.up2 = 1
endif
if(item4 > 0) then
set radius = Radius(2)
set sd.up2 = 2
endif
set damage = HolyLight_Damage(levelHolyLight)
set damage = damage + (damage * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
call GroupEnumUnitsInRange(all, casterX, casterY, radius, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(not IsUnitInGroup(f, sd.g)) then
if(f != sd.u) then
call GroupAddUnit(sd.g, f)
if(IsUnitAlly(f, owner)) then
call DestroyEffect(AddSpecialEffectTarget(HOLY_LIGHT_EFFECT, f, "origin"))
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call SetUnitState(f, UNIT_STATE_LIFE, GetUnitState(f, UNIT_STATE_LIFE) + damage * ETHEREAL_BONUS)
else
call SetUnitState(f, UNIT_STATE_LIFE, GetUnitState(f, UNIT_STATE_LIFE) + damage)
endif
endif
endif
endif
endloop
endif
set i = 0
loop
exitwhen(i >= 8)
set p = Player(i)
if(IsPlayerAlly(p, owner)) then
if(GetLocalPlayer() == p) then
call PingMinimap(targetX, targetY, PING_DURATION)
endif
endif
set i = i + 1
endloop
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
endif
set caster = null
set owner = null
set p = null
set f = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(AngelFlashTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(AngelFlashTrg, Condition(function Conditions))
call TriggerAddAction(AngelFlashTrg, function Actions)
//setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
//preload
call Preload(HOLY_LIGHT_EFFECT)
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY_ID)
endfunction
endscope
//TESH.scrollpos=155
//TESH.alwaysfold=0
scope Grace initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A048' //Spell Grace rawcode
private constant integer ABILITY_ID = 'A047' //Spell Holy Light rawcode
private constant integer CAST1_ID = 'Scri' //Spell Grace (Dummy Enemy) rawcode
private constant integer CAST2_ID = 'S000' //Spell Grace (Dummy Ally) rawcode
private constant integer ITEM1_UPGRADE1 = 'I00Q' //Item Edge of Blaze
private constant integer ITEM1_UPGRADE2 = 'frgd' //Item Heaven Rapier
private constant integer ITEM2_UPGRADE1 = 'I00T' //Item Hardspike Beetle
private constant integer ITEM2_UPGRADE2 = 'I00U' //Item Skull Crusher
private constant integer ITEM3_UPGRADE = 'crdt' //Item Armlet of Insanity
private constant real UPGRADE1_RADIUS1 = 500.0 //Upgrade 1 effect 1
private constant real UPGRADE1_RADIUS2 = 1000.0 //Upgrade 1 effect 2
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_DIVINE //Spell attack type
private constant string SPELL_EFFECT = "Abilities\\Spells\\Undead\\ReplenishHealth\\ReplenishHealthCasterOverhead.mdl" //Effect cast
private constant string HOLY_LIGHT_EFFECT = "Abilities\\Spells\\Human\\Resurrect\\ResurrectTarget.mdl" //Effect to area
endglobals
//Radius of effect
private function Radius takes integer level returns real
return 1000.0 + (0.0 * level)
endfunction
//Radius of holy light
private function HolyLight_Radius takes integer level returns real
return 0.0 + (300.0 * level)
endfunction
//Holy Light damage
private function HolyLight_Damage takes integer level returns real
if(level == 1) then
return 60.0
elseif(level == 2) then
return 80.0
elseif(level == 3) then
return 120.0
elseif(level == 4) then
return 200.0
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false)
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local unit f = null
local integer levelEnemy = level
local integer levelAlly = level
local real radius = Radius(level)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM3_UPGRADE)
if(item1 > 0) then
set radius = radius + (UPGRADE1_RADIUS1 * item1)
endif
if(item2 > 0) then
set radius = radius + (UPGRADE1_RADIUS2 * item2)
endif
if(item3 > 0) then
set levelEnemy = level + 3
endif
call GroupEnumUnitsInRange(all, casterX, casterY, radius, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, owner)) then
call TargetCast(owner, GetUnitX(f), GetUnitY(f), 0.5, CAST1_ID, levelEnemy, "cripple", 0, f)
elseif(IsUnitAlly(f, owner)) then
call TargetCast(owner, GetUnitX(f), GetUnitY(f), 0.5, CAST2_ID, levelAlly, "cripple", 0, f)
endif
endloop
set caster = null
set owner = null
set f = null
endfunction
//----------------------------------------------------------------
private function Cast_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, ABILITY_ID)
local player owner = GetOwningPlayer(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local real damage = HolyLight_Damage(level)
local unit f = null
local real radius = 0.0
local integer item3 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
if(item3 > 0) then
set radius = HolyLight_Radius(1)
endif
if(item4 > 0) then
set radius = HolyLight_Radius(2)
endif
if(level > 0 and ((item3 > 0) or (item4 > 0))) then
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, caster, "overhead"))
set damage = damage + (damage * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
call GroupEnumUnitsInRange(all, casterX, casterY, radius, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
call DestroyEffect(AddSpecialEffectTarget(HOLY_LIGHT_EFFECT, f, "origin"))
if(IsUnitEnemy(f, owner)) then
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(caster, f, (damage/2), true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(caster, f, (damage/2), true, false, A_TYPE, D_TYPE, null)
endif
elseif(IsUnitAlly(f, owner) and f != caster) then
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call SetUnitState(f, UNIT_STATE_LIFE, GetUnitState(f, UNIT_STATE_LIFE) + damage * ETHEREAL_BONUS)
else
call SetUnitState(f, UNIT_STATE_LIFE, GetUnitState(f, UNIT_STATE_LIFE) + damage)
endif
endif
endloop
endif
set caster = null
set owner = null
set f = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(GraceTrg, EVENT_PLAYER_UNIT_SPELL_FINISH)
call TriggerAddCondition(GraceTrg, Condition(function Conditions))
call TriggerAddAction(GraceTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(GraceCastTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(GraceCastTrg, Condition(function Conditions))
call TriggerAddAction(GraceCastTrg, function Cast_Actions)
//setting globals
set all = CreateGroup()
set bexpr = Condition(function Pick)
//preload
call Preload(HOLY_LIGHT_EFFECT)
call Preload(SPELL_EFFECT)
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY_ID)
call AbilityPreload(CAST1_ID)
call AbilityPreload(CAST2_ID)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope DivineIntervention initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A04A' //Spell Divine Intervention rawcode
private constant integer ABILITY_ID = 'A047' //Spell Holy Light rawcode
private constant real TIME_ANIMATE = 2.0 //Time angle animation
private constant integer DUMMY_ID = 'n00M' //Dummy Angel rawcode
private constant integer DUMMY2_ID = 'n00N' //Dummy Explode rawcode
private constant integer ITEM1_UPGRADE = 'gvsm' //Item Chronos the Forbidden
private constant integer ITEM2_UPGRADE1 = 'brac' //Item Giant Belt
private constant integer ITEM2_UPGRADE2 = 'ward' //Item Drum of Horde
private constant integer ITEM2_UPGRADE3 = 'I01H' //Item Wrist of Hercules
private constant integer ITEM3_UPGRADE1 = 'I01U' //Item Bloodeye Lynch
private constant integer ITEM3_UPGRADE2 = 'I01S' //Item Havocrave Dissever
private constant real UPGRADE1_RADIUS_PERCENTAGE = 1.5 //Upgrade 1 radius increase by percentage
private constant real UPGRADE2_HEAL_PERCENT1 = 0.15 //Upgrade 2 heal percent 1
private constant real UPGRADE2_HEAL_PERCENT2 = 0.25 //Upgrade 2 heal percent 2
private constant real UPGRADE2_HEAL_PERCENT3 = 0.50 //Upgrade 2 heal percent 3
private constant attacktype A_TYPE = ATTACK_TYPE_CHAOS //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_DIVINE //Spell attack type
private constant attacktype A1_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D1_TYPE = DAMAGE_TYPE_DIVINE //Spell attack type
private constant string SPELL_EFFECT = "Abilities\\Spells\\Human\\Resurrect\\ResurrectCaster.mdl" //Effect angel
private constant string HOLY_LIGHT_EFFECT = "Abilities\\Spells\\Human\\Resurrect\\ResurrectTarget.mdl" //Effect to area
endglobals
//Damage deal to target
private function Damage takes integer level returns real
if(level == 1) then
return 300.0
elseif(level == 2) then
return 500.0
else
return 0.0
endif
endfunction
//Radius of damage
private function Radius takes integer level returns real
return 600.0 + (0.0 * level)
endfunction
//Radius of holy light
private function HolyLight_Radius takes integer level returns real
return 0.0 + (300.0 * level)
endfunction
//Holy Light damage
private function HolyLight_Damage takes integer level returns real
if(level == 1) then
return 60.0
elseif(level == 2) then
return 80.0
elseif(level == 3) then
return 120.0
elseif(level == 4) then
return 200.0
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct DivineIntervention_Data
unit u //Unit caster
player o //Owner of caster
unit dum //Dummy angel
unit dum2 //Dummy explode
group g //Group target holy light
real t //Time remain
real dd //Damage deal
real r //Radius of damage
real h //Heal
integer hl //Holy light level
real rhl //Radius holy light
real dhl //Damage holy light
integer it1 //Item upgrade 1
boolean up2 //Item upgrade 2
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private DivineIntervention_Data array Ar[10]
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local DivineIntervention_Data sd
local integer i = 0
local real cX = 0.0
local real cY = 0.0
local unit f = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t > 0) then
set sd.t = sd.t - Interval()
set cX = GetUnitX(sd.u)
set cY = GetUnitY(sd.u)
call SetUnitX(sd.dum, cX)
call SetUnitY(sd.dum, cY)
call SetUnitFacing(sd.dum, GetUnitFacing(sd.u))
if(sd.t == 0.6) then
set sd.dum2 = CreateUnit(sd.o, DUMMY2_ID, cX, cY, bj_UNIT_FACING)
call SetUnitTimeScale(sd.dum2, 1.0)
call UnitApplyTimedLife(sd.dum2, 'BTLF', 2.0)
call SetUnitVertexColor(sd.dum2, 255, 255, 255, 100)
call SetUnitX(sd.dum2, cX)
call SetUnitY(sd.dum2, cY)
if(sd.it1 > 0) then
call SetUnitScale(sd.dum2, 7.5, 7.5, 7.5)
endif
if(sd.up2) then
call SetUnitVertexColor(sd.dum2, 255, 255, 0, 100)
endif
elseif(sd.t < 0.6) then
call SetUnitX(sd.dum2, cX)
call SetUnitY(sd.dum2, cY)
endif
if(sd.hl > 0) then
call GroupEnumUnitsInRange(all, cX, cY, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(not IsUnitInGroup(f, sd.g) and f != sd.u) then
call GroupAddUnit(sd.g, f)
if(IsUnitEnemy(f, sd.o)) then
if(not IsUnitType(f, UNIT_TYPE_MAGIC_IMMUNE)) then
call DestroyEffect(AddSpecialEffectTarget(HOLY_LIGHT_EFFECT, f, "origin"))
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, (sd.dhl/2), true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, (sd.dhl/2), true, false, A1_TYPE, D1_TYPE, null)
endif
endif
endif
endif
endloop
endif
else
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
set cX = GetUnitX(sd.u)
set cY = GetUnitY(sd.u)
call PlaySoundAtPointBJ(gg_snd_DivineIntervention, 100, GetUnitLoc(sd.u), 0)
call UnitApplyTimedLife(sd.dum, 'BTLF', 3.0)
call GroupEnumUnitsInRange(all, cX, cY, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
if(not IsUnitType(f, UNIT_TYPE_MAGIC_IMMUNE)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
else
if(sd.up2) then
call SetUnitState(f, UNIT_STATE_LIFE, GetUnitState(f, UNIT_STATE_LIFE) + (sd.h))
endif
endif
endloop
set sd.u = null
set sd.o = null
set sd.dum = null
set sd.dum2 = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local DivineIntervention_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local real facing = GetUnitFacing(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local integer str = GetHeroStr(caster, true)
local real magic = LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01
local player owner = GetOwningPlayer(caster)
local integer levelHolyLight = GetUnitAbilityLevel(caster, ABILITY_ID)
local real damageHolyLight = HolyLight_Damage(level)
local boolean isNull = (Ar[Total] == null)
local unit f = null
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
local integer item2 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item3 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE3)
local integer item5 = IsUnitHasItemType(caster, ITEM3_UPGRADE1)
local integer item6 = IsUnitHasItemType(caster, ITEM3_UPGRADE2)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_LB_DivineIntervention
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
if(isNull) then
set sd = DivineIntervention_Data.create()
set sd.g = CreateGroup()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.o = GetOwningPlayer(caster)
set sd.dum = CreateUnit(sd.o, DUMMY_ID, casterX, casterY, facing)
call SetUnitX(sd.dum, casterX)
call SetUnitY(sd.dum, casterY)
set sd.dum2 = null
set sd.t = TIME_ANIMATE
set sd.dd = Damage(level)
set sd.dd = sd.dd + (sd.dd * magic)
set sd.r = Radius(level)
set sd.h = 0.0
set sd.hl = 0
set sd.rhl = 0.0
set sd.dhl = 0.0
set sd.it1 = item1
set sd.up2 = false
if(item1 > 0) then
set sd.r = sd.r * UPGRADE1_RADIUS_PERCENTAGE
endif
if(item2 > 0) then
set sd.h = sd.h + sd.dd * UPGRADE2_HEAL_PERCENT1 * item2
endif
if(item3 > 0) then
set sd.h = sd.h + sd.dd * UPGRADE2_HEAL_PERCENT2 * item3
endif
if(item4 > 0) then
set sd.h = sd.h + sd.dd * UPGRADE2_HEAL_PERCENT3 * item4
endif
if(levelHolyLight > 0 and ((item5 > 0) or (item6 > 0))) then
if(item5 > 0) then
set sd.rhl = HolyLight_Radius(1)
endif
if(item6 > 0) then
set sd.rhl = HolyLight_Radius(2)
endif
set sd.hl = levelHolyLight
set sd.dhl = damageHolyLight + (damageHolyLight * magic)
endif
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set owner = null
set f = null
set s = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(DivineInterventionTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(DivineInterventionTrg, Condition(function Conditions))
call TriggerAddAction(DivineInterventionTrg, function Actions)
//setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
//preload
call Preload(SPELL_EFFECT)
call Preload(HOLY_LIGHT_EFFECT)
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY_ID)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope ArcaneFall initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A04B' //Spell Arcane Fall rawcode
private constant real INTERVAL = 0.1 //Interval delay
private constant real CHANNELING_DURATION = 5.0 //Channeling duration
private constant real IMPACT_DELAY = 0.9 //Impact delay
private constant integer ITEM1_UPGRADE = 'I01P' //Item Anexiler
private constant integer ITEM2_UPGRADE1 = 'stel' //Item Magical Stick
private constant integer ITEM2_UPGRADE2 = 'I00L' //Item Twinkle Rod
private constant integer ITEM2_UPGRADE3 = 'I00M' //Item Mystic Wand
private constant integer ITEM2_UPGRADE4 = 'I01O' //Item Bloodeye Lynch
private constant integer ITEM2_UPGRADE5 = 'I01S' //Item Havocrave Dissever
private constant integer ITEM3_UPGRADE = 'sbch' //Item Moonstalker
private constant real UPGRADE1_RADIUS = 100.0 //Upgrade 1 effect
private constant integer UPGRADE2_ARCANE1 = 2 //Upgrade 2 arcane 1
private constant integer UPGRADE2_ARCANE2 = 3 //Upgrade 2 arcane 2
private constant integer UPGRADE2_ARCANE3 = 4 //Upgrade 2 arcane 3
private constant integer UPGRADE2_ARCANE4 = 5 //Upgrade 2 arcane 4
private constant integer UPGRADE2_ARCANE5 = 6 //Upgrade 2 arcane 5
private constant integer UPGRADE2_FALL4 = 1 //Upgrade 2 fall 4
private constant integer UPGRADE2_FALL5 = 2 //Upgrade 2 fall 5
private constant real UPGRADE3_RADIUS_MULTIPLY = 2.0 //Upgrade 3 effect
private constant integer ESOTERIC_FORM_ITEM_UPGRADE1 = 'I00J' //Item Astrallian Robe
private constant integer ESOTERIC_FORM_ITEM_UPGRADE2 = 'I01L' //Item Windsage
private constant integer ESOTERIC_FORM_UNIT_ID = 'H000' //Unit Esoteric Form rawcode
private constant real ESOTERIC_FORM_UPGRADE_EXTRA_TIME2 = 2.0 //Upgrade 1 effect 2
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_NORMAL //Spell attack type
private constant string SPELL_EFFECT = "Abilities\\Spells\\NightElf\\Starfall\\StarfallTarget.mdl" //Effect to area
endglobals
//Damage multiple
private function Damage takes integer level returns real
if(level == 1) then
return 60.0
elseif(level == 2) then
return 70.0
elseif(level == 3) then
return 90.0
elseif(level == 4) then
return 120.0
else
return 0.0
endif
endfunction
//Radius of effect
private function Radius takes integer level returns real
return 350.0 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct ArcaneFall_Data
unit u //Unit caster
player o //Owner of caster
group g //Group of target
boolean c //Channel
real m //Timer
integer f //Falling arcane
real x //Target x
real y //Target y
real r //Radius
real ar //Actual radius
real i //Interval
integer e //Extra arcanes
unit t //Target
real d //Damage
fogmodifier fm //Fog modifier
endstruct
//----------------------------------------------------------------
struct Arcane_Data
unit u //Unit caster
unit t //Unit target
real i //Interval
real d //Damage
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private ArcaneFall_Data array Ar[10]
private timer Tim2
private integer Total2
private Arcane_Data array Ar2[100]
private group all
private boolexpr bexpr
private location loc
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute2 takes nothing returns nothing
local Arcane_Data ad
local integer i = 0
loop
exitwhen(i >= Total2)
set ad = Ar2[i]
if(ad.i > 0.0) then
set ad.i = ad.i - Interval()
else
if(ad.t != null) then
if(IsUnitType(ad.t, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(ad.u, ad.t, ad.d, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(ad.u, ad.t, ad.d, true, false, A_TYPE, D_TYPE, null)
endif
endif
set ad.u = null
set ad.t = null
set Ar2[i] = Ar2[Total2 - 1]
set Total2 = Total2 - 1
call ad.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total2 == 0 then
call PauseTimer(Tim2)
endif
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local ArcaneFall_Data sd
local Arcane_Data ad
local integer i = 0
local integer j = 0
local unit f = null
local boolean check = false
local real randomAngle = 0.0
local real randomDistance = 0.0
local real x = 0.0
local real y = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.c) then
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = INTERVAL
set check = false
set j = 0
call GroupEnumUnitsInRange(all, sd.x, sd.y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(not check) then
if(IsUnitEnemy(f, sd.o) and (not IsUnitInGroup(f, sd.g))) then
if(j < sd.f) then
set j = j + 1
call GroupAddUnit(sd.g, f)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, f, "origin"))
set ad = Arcane_Data.create()
set ad.u = sd.u
set ad.t = f
set ad.i = IMPACT_DELAY
set ad.d = sd.d
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = ad
else
set check = true
endif
endif
endif
endloop
if(not check) then
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
call GroupEnumUnitsInRange(all, sd.x, sd.y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(not check) then
if(IsUnitEnemy(f, sd.o) and (not IsUnitInGroup(f, sd.g))) then
if(j < sd.f) then
set j = j + 1
call GroupAddUnit(sd.g, f)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, f, "origin"))
set ad = Arcane_Data.create()
set ad.u = sd.u
set ad.t = f
set ad.i = 0.8
set ad.d = sd.d
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = ad
else
set check = true
endif
endif
endif
endloop
if(not check) then
loop
exitwhen(j >= sd.f)
set randomDistance = GetRandomReal(0.0, sd.r)
set randomAngle = GetRandomReal(0.0, 360.0) * bj_DEGTORAD
set x = sd.x + randomDistance * Cos(randomAngle)
set y = sd.y + randomDistance * Sin(randomAngle)
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, x, y))
set ad = Arcane_Data.create()
set ad.u = sd.u
set ad.t = null
set ad.i = 0.8
set ad.d = sd.d
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = ad
set j = j + 1
endloop
set sd.r = sd.ar
endif
endif
endif
if(sd.m > 0.0) then
set sd.m = sd.m - Interval()
else
set sd.c = false
endif
elseif(sd.m > 0.0) then
set sd.m = sd.m - Interval()
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = INTERVAL
set check = false
set j = 0
call GroupEnumUnitsInRange(all, sd.x, sd.y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(not check) then
if(IsUnitEnemy(f, sd.o) and (not IsUnitInGroup(f, sd.g))) then
if(j < sd.f) then
set j = j + 1
call GroupAddUnit(sd.g, f)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, f, "origin"))
set ad = Arcane_Data.create()
set ad.u = sd.u
set ad.t = f
set ad.i = IMPACT_DELAY
set ad.d = sd.d
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = ad
else
set check = true
endif
endif
endif
endloop
if(not check) then
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
call GroupEnumUnitsInRange(all, sd.x, sd.y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(not check) then
if(IsUnitEnemy(f, sd.o) and (not IsUnitInGroup(f, sd.g))) then
if(j < sd.f) then
set j = j + 1
call GroupAddUnit(sd.g, f)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, f, "origin"))
set ad = Arcane_Data.create()
set ad.u = sd.u
set ad.t = f
set ad.i = 0.8
set ad.d = sd.d
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = ad
else
set check = true
endif
endif
endif
endloop
if(not check) then
loop
exitwhen(j >= sd.f)
set randomDistance = GetRandomReal(0.0, sd.r)
set randomAngle = GetRandomReal(0.0, 360.0) * bj_DEGTORAD
set x = sd.x + randomDistance * Cos(randomAngle)
set y = sd.y + randomDistance * Sin(randomAngle)
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, x, y))
set ad = Arcane_Data.create()
set ad.u = sd.u
set ad.t = null
set ad.i = 0.8
set ad.d = sd.d
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = ad
set j = j + 1
endloop
set sd.r = sd.ar
endif
endif
endif
elseif(sd.e > 0) then
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = INTERVAL
set check = false
set j = 0
call GroupEnumUnitsInRange(all, sd.x, sd.y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(not check) then
if(IsUnitEnemy(f, sd.o) and (not IsUnitInGroup(f, sd.g))) then
if(j < sd.f) then
set j = j + 1
set sd.e = sd.e - 1
call GroupAddUnit(sd.g, f)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, f, "origin"))
set ad = Arcane_Data.create()
set ad.u = sd.u
set ad.t = f
set ad.i = IMPACT_DELAY
set ad.d = sd.d
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = ad
else
set check = true
endif
endif
endif
endloop
if(not check) then
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
call GroupEnumUnitsInRange(all, sd.x, sd.y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(not check) then
if(IsUnitEnemy(f, sd.o) and (not IsUnitInGroup(f, sd.g))) then
if(j < sd.f) then
set j = j + 1
set sd.e = sd.e - 1
call GroupAddUnit(sd.g, f)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, f, "origin"))
set ad = Arcane_Data.create()
set ad.u = sd.u
set ad.t = f
set ad.i = 0.8
set ad.d = sd.d
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = ad
else
set check = true
endif
endif
endif
endloop
if(not check) then
loop
exitwhen(j >= sd.f)
set sd.e = sd.e - 1
set randomDistance = GetRandomReal(0.0, sd.r)
set randomAngle = GetRandomReal(0.0, 360.0) * bj_DEGTORAD
set x = sd.x + randomDistance * Cos(randomAngle)
set y = sd.y + randomDistance * Sin(randomAngle)
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, x, y))
set ad = Arcane_Data.create()
set ad.u = sd.u
set ad.t = null
set ad.i = 0.8
set ad.d = sd.d
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = ad
set j = j + 1
endloop
set sd.r = sd.ar
endif
endif
endif
else
call FogModifierStop(sd.fm)
call DestroyFogModifier(sd.fm)
set sd.fm = null
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
set sd.u = null
set sd.o = null
set sd.t = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local ArcaneFall_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local real targetX = 0.0
local real targetY = 0.0
local boolean isNull = (Ar[Total] == null)
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
local integer item2 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item3 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE3)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE4)
local integer item6 = IsUnitHasItemType(caster, ITEM2_UPGRADE5)
local integer item7 = IsUnitHasItemType(caster, ITEM3_UPGRADE)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_AW_ArcaneFall
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
if(isNull) then
set sd = ArcaneFall_Data.create()
set sd.g = CreateGroup()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.o = owner
set sd.c = true
set sd.m = CHANNELING_DURATION
set sd.f = 1
set sd.x = targetX
set sd.y = targetY
set sd.r = Radius(level)
set sd.ar = Radius(level)
set sd.i = 0.0
set sd.e = 0
set sd.t = null
set sd.d = Damage(level)
set sd.d = sd.d + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.fm = CreateFogModifierRadius(owner, FOG_OF_WAR_VISIBLE, sd.x, sd.y, sd.r, true, false)
call FogModifierStart(sd.fm)
if(item1 > 0) then
set sd.r = UPGRADE1_RADIUS
set sd.ar = Radius(level)
endif
if(item2 > 0) then
set sd.e = sd.e + (UPGRADE2_ARCANE1 * item2)
endif
if(item3 > 0) then
set sd.e = sd.e + (UPGRADE2_ARCANE2 * item3)
endif
if(item4 > 0) then
set sd.e = sd.e + (UPGRADE2_ARCANE3 * item4)
endif
if(item5 > 0) then
set sd.e = sd.e + (UPGRADE2_ARCANE4 * item5)
set sd.f = sd.f + UPGRADE2_FALL4
endif
if(item6 > 0) then
set sd.e = sd.e + (UPGRADE2_ARCANE5 * item6)
set sd.f = sd.f + UPGRADE2_FALL5
endif
if(item7 > 0) then
set sd.ar = sd.ar * (UPGRADE3_RADIUS_MULTIPLY * item7)
endif
if(IsUnitHasItemType(caster, ESOTERIC_FORM_ITEM_UPGRADE2) > 0) then
set sd.m = sd.m + ESOTERIC_FORM_UPGRADE_EXTRA_TIME2
endif
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set owner = null
set s = null
endfunction
//----------------------------------------------------------------
private function Stop_Actions takes nothing returns nothing
local ArcaneFall_Data sd
local unit caster = GetTriggerUnit()
local integer i = 0
local integer item1 = IsUnitHasItemType(caster, ESOTERIC_FORM_ITEM_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ESOTERIC_FORM_ITEM_UPGRADE2)
if((item1 > 0 or item2 > 0) and GetUnitTypeId(caster) == ESOTERIC_FORM_UNIT_ID) then
else
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set sd.c = false
set sd.m = 0.0
set i = Total
endif
set i = i + 1
endloop
endif
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(ArcaneFallTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(ArcaneFallTrg, Condition(function Conditions))
call TriggerAddAction(ArcaneFallTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(ArcaneFallStopTrg, EVENT_PLAYER_UNIT_SPELL_ENDCAST)
call TriggerAddCondition(ArcaneFallStopTrg, Condition(function Conditions))
call TriggerAddAction(ArcaneFallStopTrg, function Stop_Actions)
//setting globals
set all = CreateGroup()
set bexpr = Condition(function Pick)
set Tim = CreateTimer()
set Total = 0
set Tim2 = CreateTimer()
set Total2 = 0
set loc = Location(0, 0)
//preload
call Preload(SPELL_EFFECT)
call AbilityPreload(SPELL_ID)
endfunction
endscope
//TESH.scrollpos=277
//TESH.alwaysfold=0
scope EnergyReflux initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'AHab' //Spell Energy Reflux rawcode
private constant real RADIUS = 500.0 //Radius area of effect
private constant integer ITEM1_UPGRADE1 = 'penr' //Item Gratify Rosary
private constant integer ITEM1_UPGRADE2 = 'pmna' //Item Pendant of Innerforce
private constant integer ITEM1_UPGRADE3 = 'I01V' //Item Power Fragment
private constant integer ITEM2_UPGRADE1 = 'prvt' //Item Periapt of Vitality
private constant integer ITEM2_UPGRADE2 = 'rhth' //Item Zemi of Eternal
private constant integer ITEM2_UPGRADE3 = 'I015' //Item Orb of Descent
private constant real UPGRADE1_TIME1 = 1.0 //Upgrade 1 effect 1
private constant real UPGRADE1_TIME2 = 2.0 //Upgrade 1 effect 2
private constant real UPGRADE1_TIME3 = 3.0 //Upgrade 1 effect 3
private constant real UPGRADE1_MANA3 = 10.0 //Upgrade 1 effect 3
private constant real UPGRADE2_RADIUS1 = 100.0 //Upgrade 2 effect 1
private constant real UPGRADE2_RADIUS2 = 200.0 //Upgrade 2 effect 2
private constant real UPGRADE2_RADIUS3 = 300.0 //Upgrade 2 effect 3
private constant real UPGRADE2_LIFE3 = 10.0 //Upgrade 2 effect 3
private constant string SPELL_EFFECT = "Abilities\\Spells\\Items\\AIma\\AImaTarget.mdl" //Replenish effect
private constant string UPGRADE2_EFFECT = "Abilities\\Spells\\Undead\\VampiricAura\\VampiricAuraTarget.mdl" //Replenish effect
endglobals
//Mana restore
private function Mana_Restore takes integer level returns real
if(level == 1) then
return 15.0
elseif(level == 2) then
return 25.0
elseif(level == 3) then
return 40.0
else
return 0.0
endif
endfunction
//Time last restoration
private function Time takes integer level returns real
if(level == 1) then
return 5.0
elseif(level == 2) then
return 5.0
elseif(level == 3) then
return 5.0
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.5
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Reflux_Data
unit u //Unit caster
real t //Time
real i //Interval
real im //Interval max
real m //Mana
real l //Life
endstruct
//----------------------------------------------------------------
globals
private group Group
private group copy
private boolexpr bexpr
private timer Tim
private integer Total
private Reflux_Data array Ar[100]
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Reflux_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t > 0.0) then
set sd.t = sd.t - Interval()
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
if(IsUnitType(sd.u, UNIT_TYPE_ETHEREAL)) then
call SetUnitState(sd.u, UNIT_STATE_MANA, GetUnitState(sd.u, UNIT_STATE_MANA) + sd.m * ETHEREAL_BONUS)
call SetUnitState(sd.u, UNIT_STATE_LIFE, GetUnitState(sd.u, UNIT_STATE_LIFE) + sd.l * ETHEREAL_BONUS)
else
call SetUnitState(sd.u, UNIT_STATE_MANA, GetUnitState(sd.u, UNIT_STATE_MANA) + sd.m)
call SetUnitState(sd.u, UNIT_STATE_LIFE, GetUnitState(sd.u, UNIT_STATE_LIFE) + sd.l)
endif
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.u, "origin"))
if(sd.l > 0.0) then
call DestroyEffect(AddSpecialEffectTarget(UPGRADE2_EFFECT, sd.u, "origin"))
endif
endif
else
set sd.u = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
local unit f = null
local boolean check = false
local unit target = null
local real targetX = 0.0
local real targetY = 0.0
local integer targetID = 0
local integer item1 = 0
local integer item2 = 0
local integer item3 = 0
local integer item4 = 0
local integer item5 = 0
local integer item6 = 0
local integer level = 0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local real radius = 0.0
local Reflux_Data sd
set copy = CopyGroup(Group)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not check) then
if(((IsUnitAlly(f, owner) and (GetOwningPlayer(f) != Player(PLAYER_NEUTRAL_PASSIVE)) and IsUnitType(f, UNIT_TYPE_HERO))) or GetOwningPlayer(f) == owner) then
set check = true
set target = f
endif
endif
endloop
if(check) then
set targetX = GetUnitX(target)
set targetY = GetUnitY(target)
set level = GetUnitAbilityLevel(target, SPELL_ID)
set targetID = GetUnitUserData(target)
set item1 = IsUnitHasItemType(target, ITEM1_UPGRADE1)
set item2 = IsUnitHasItemType(target, ITEM1_UPGRADE2)
set item3 = IsUnitHasItemType(target, ITEM1_UPGRADE3)
set item4 = IsUnitHasItemType(target, ITEM2_UPGRADE1)
set item5 = IsUnitHasItemType(target, ITEM2_UPGRADE2)
set item6 = IsUnitHasItemType(target, ITEM2_UPGRADE3)
set dx = targetX - casterX
set dy = targetY - casterY
set distance = SquareRoot(dx * dx + dy * dy)
set radius = RADIUS
if(item4 > 0) then
set radius = radius + (UPGRADE2_RADIUS1 * item4)
endif
if(item5 > 0) then
set radius = radius + (UPGRADE2_RADIUS2 * item5)
endif
if(item6 > 0) then
set radius = radius + (UPGRADE2_RADIUS3 * item6)
endif
if(distance <= radius) then
//call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, caster, "origin"))
set sd = Reflux_Data.create()
set sd.u = caster
set sd.t = Time(level)
set sd.i = 0.0
set sd.im = 1.0
set sd.m = Mana_Restore(level) + (Mana_Restore(level) * LoadInteger(MagicDamage_Ht, targetID, 0) * 0.01)
set sd.l = 0.0
if(item1 > 0) then
set sd.t = sd.t + (UPGRADE1_TIME1 * item1)
endif
if(item2 > 0) then
set sd.t = sd.t + (UPGRADE1_TIME2 * item2)
endif
if(item3 > 0) then
set sd.t = sd.t + (UPGRADE1_TIME3 * item3)
set sd.m = sd.m + (UPGRADE1_MANA3 * item3)
endif
if(item6 > 0) then
set sd.l = sd.l + (UPGRADE2_LIFE3 * item6)
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
//call SetUnitState(caster, UNIT_STATE_MANA, GetUnitState(caster, UNIT_STATE_MANA) + GetUnitState(caster, UNIT_STATE_MANA) * Mana_Restore(level))
endif
endif
set caster = null
set owner = null
set target = null
set f = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit caster = GetTriggerUnit()
local player owner = GetOwningPlayer(caster)
local unit f = null
local integer level = 0
local boolean check = false
local boolean check2 = Targets(caster)
set copy = CopyGroup(Group)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not check) then
set level = GetUnitAbilityLevel(f, SPELL_ID)
if(level > 0) then
if(IsUnitAlly(f, owner) or GetOwningPlayer(f) == owner) then
set check = true
endif
endif
endif
endloop
set caster = null
set owner = null
set f = null
return check and check2
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local unit learner = GetLearningUnit()
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
if(GetUnitAbilityLevel(learner, SPELL_ID) <= 1 and (not IsUnitInGroup(learner, Group))) then
call GroupAddUnit(Group, learner)
endif
set learner = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
local unit learner = GetTriggerUnit()
local boolean okey = GetLearnedSkill() == SPELL_ID and (not IsUnitIllusion(learner))
set learner = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(EnergyRefluxLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(EnergyRefluxLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(EnergyRefluxLearnTrg, function Learn_Actions)
call TriggerRegisterAnyUnitEventBJ(EnergyRefluxTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(EnergyRefluxTrg, Condition(function Conditions))
call TriggerAddAction(EnergyRefluxTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set Group = CreateGroup()
set copy = CreateGroup()
//Preload
call Preload(SPELL_EFFECT)
call AbilityPreload(SPELL_ID)
endfunction
endscope
//TESH.scrollpos=43
//TESH.alwaysfold=0
scope Impotent initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A04C' //Spell Impotent rawcode
private constant integer CAST_ID = 'A04D' //Cast Impotent (Dummy) rawcode
private constant integer BUFF_ID = 'B01K' //Buff Impotent (Dummy) rawcode
private constant integer ABILITY_ID = 'A0A1' //Ability Impotent (Stacking) rawcode
private constant integer ITEM1_UPGRADE1 = 'I01N' //Item Staff of Flamecurse
private constant integer ITEM1_UPGRADE2 = 'ssil' //Item Sunstalker
private constant integer ITEM2_UPGRADE1 = 'I00X' //Item Laksamana Keris
private constant integer ITEM2_UPGRADE2 = 'hval' //Item Nine Curves
private constant integer ITEM3_UPGRADE1 = 'I00Q' //Item Edge of Blaze
private constant integer ITEM3_UPGRADE2 = 'frgd' //Item Heaven Rapier
private constant integer UPGRADE1_SLOW1 = 1 //Upgrade 1 effect 1
private constant integer UPGRADE1_SLOW2 = 2 //Upgrade 1 effect 2
private constant integer UPGRADE2_MANA1 = 5 //Upgrade 2 effect 1
private constant integer UPGRADE2_MANA2 = 10 //Upgrade 2 effect 2
private constant integer UPGRADE2_LEVEL2 = 3 //Upgrade 2 effect 2
private constant integer UPGRADE3_STARTING_SLOW1 = 5 //Upgrade 3 effect 1
private constant integer UPGRADE3_STARTING_SLOW2 = 10 //Upgrade 3 effect 2
private constant string SPELL_EFFECT = "Abilities\\Spells\\Human\\DispelMagic\\DispelMagicTarget.mdl" //Effect to area
endglobals
//Movement base decrease
private function Movement_Base takes integer level returns integer
if(level == 1) then
return 10
elseif(level == 2) then
return 15
elseif(level == 3) then
return 20
else
return 0
endif
endfunction
//Movement decrease
private function Movement takes integer level returns integer
if(level == 1) then
return 1
elseif(level == 2) then
return 2
elseif(level == 3) then
return 3
else
return 0
endif
endfunction
//Interval
private function Interval takes nothing returns real
return 0.5
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Impotent_Data
unit u //Unit caster
player o //Owner of caster
unit t //Unit target
integer c //Current move speed
integer m //Movement speed slow
integer n //Mana decrease
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Impotent_Data array Ar[10]
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Impotent_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(GetUnitAbilityLevel(sd.t, BUFF_ID) > 0 and (not IsUnitType(sd.t, UNIT_TYPE_MAGIC_IMMUNE))) then
else
call UnitRemoveAbility(sd.t, ABILITY_ID)
set sd.u = null
set sd.o = null
set sd.t = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Impotent_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local unit target = GetSpellTargetUnit()
local integer i = 0
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item5 = IsUnitHasItemType(caster, ITEM3_UPGRADE1)
local integer item6 = IsUnitHasItemType(caster, ITEM3_UPGRADE2)
if(GetUnitAbilityLevel(target, BUFF_ID) <= 0) then
set sd = Impotent_Data.create()
set sd.u = caster
set sd.o = owner
set sd.t = target
set sd.c = Movement_Base(level)
set sd.m = Movement(level)
set sd.n = 0
if(item1 > 0) then
set sd.m = sd.m + (UPGRADE1_SLOW1 * item1)
endif
if(item2 > 0) then
set sd.m = sd.m + (UPGRADE1_SLOW2 * item2)
endif
if(item3 > 0) then
set sd.n = sd.n + (UPGRADE2_MANA1 * item3)
endif
if(item5 > 0) then
set sd.c = sd.c + (UPGRADE3_STARTING_SLOW1 * item5)
endif
if(item6 > 0) then
set sd.c = sd.c + (UPGRADE3_STARTING_SLOW2 * item6)
endif
call UnitAddAbility(target, ABILITY_ID)
call SetUnitAbilityLevel(target, ABILITY_ID, sd.c)
if(item4 > 0) then
set sd.n = sd.n + UPGRADE2_MANA2
call TargetCast(owner, GetUnitX(target), GetUnitY(target), 1.0, CAST_ID, level + UPGRADE2_LEVEL2, "slow", 0, target)
else
call TargetCast(owner, GetUnitX(target), GetUnitY(target), 1.0, CAST_ID, level, "slow", 0, target)
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t == target) then
if(sd.c + Movement_Base(level) <= 100) then
set sd.c = sd.c + Movement_Base(level)
else
set sd.c = 100
endif
call UnitAddAbility(target, ABILITY_ID)
call SetUnitAbilityLevel(target, ABILITY_ID, sd.c)
set sd.m = Movement(level)
if(item1 > 0) then
set sd.m = sd.m + UPGRADE1_SLOW1
endif
if(item2 > 0) then
set sd.m = sd.m + UPGRADE1_SLOW2
endif
if(item3 > 0) then
set sd.n = sd.n + UPGRADE2_MANA1
endif
if(item4 > 0) then
set sd.n = sd.n + UPGRADE2_MANA2
call TargetCast(owner, GetUnitX(target), GetUnitY(target), 1.0, CAST_ID, level + UPGRADE2_LEVEL2, "slow", 0, target)
else
call TargetCast(owner, GetUnitX(target), GetUnitY(target), 1.0, CAST_ID, level, "slow", 0, target)
endif
if(item5 > 0) then
set sd.c = sd.c + UPGRADE3_STARTING_SLOW1
endif
if(item6 > 0) then
set sd.c = sd.c + UPGRADE3_STARTING_SLOW2
endif
set i = Total
endif
set i = i + 1
endloop
endif
set caster = null
set owner = null
set target = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
function Impotent_onDamage takes unit attacker, unit attacked, real amount returns nothing
local Impotent_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t == attacked) then
if(sd.c + sd.m <= 100) then
set sd.c = sd.c + sd.m
else
set sd.c = 100
endif
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, attacked, "origin"))
call SetUnitAbilityLevel(attacked, ABILITY_ID, sd.c)
if(sd.n > 0) then
call SetUnitState(attacked, UNIT_STATE_MANA, GetUnitState(attacked, UNIT_STATE_MANA) - sd.n)
endif
endif
set i = i + 1
endloop
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(ImpotentTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(ImpotentTrg, Condition(function Conditions))
call TriggerAddAction(ImpotentTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
//Preload
call Preload(SPELL_EFFECT)
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY_ID)
call AbilityPreload(CAST_ID)
endfunction
endscope
//TESH.scrollpos=321
//TESH.alwaysfold=0
scope ForceNova initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A04G' //Spell Force Nova rawcode
private constant real DISTANCE_MOVE = 40.0 //Distance dummy move
private constant real DEGREE = 30.0 //Degree offpoint
private constant integer DUMMY_ID = 'n00O' //Dummy rawcode
private constant real DISTANCE_OFFSET = 100.0 //Distance offset
private constant real TIME_CAST = 2.0 //Time casting
private constant integer ITEM1_UPGRADE1 = 'I00I' //Item Acolyte Mantle
private constant integer ITEM1_UPGRADE2 = 'I027' //Item Mindseer of Ultimate
private constant integer ITEM2_UPGRADE1 = 'spsh' //Item Dream Sphere
private constant integer ITEM2_UPGRADE2 = 'I009' //Item Prime Lucent
private constant integer ITEM3_UPGRADE1 = 'I00H' //Item Warmarcher
private constant integer ITEM3_UPGRADE2 = 'I018' //Item Porthole Jumper
private constant real UPGRADE1_RADIUS1 = 50.0 //Upgrade item 1 Radius increase 1
private constant real UPGRADE1_RADIUS2 = 100.0 //Upgrade item 1 Radius increase 2
private constant integer UPGRADE2_ARC1 = 2 //Upgrade item 2 Arc Count increase 1
private constant integer UPGRADE2_ARC2 = 4 //Upgrade item 2 Arc Count increase 2
private constant real UPGRADE3_DISTANCE1 = 200.0 //Upgrade 3 item 1 distance increase
private constant real UPGRADE3_DISTANCE2 = 300.0 //Upgrade 3 item 2 distance increase
private constant real UPGRADE3_DISTANCE_MOVE2 = 20.0 //Upgrade 3 item 2 distance move increase
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_MAGIC //Spell attack type
private constant string UPGRADE_EFFECT = "Abilities\\Weapons\\DragonHawkMissile\\DragonHawkMissile.mdl" //Upgrade effects
endglobals
//Arc count
private function Arc_Count takes integer level returns integer
if(level == 1) then
return 8
elseif(level == 2) then
return 12
else
return 0
endif
endfunction
//Distance
private function Distance takes integer level returns real
return 1200.0 + (0.0 * level)
endfunction
//Radius damage
private function Radius takes integer level returns real
return 200.0 + (0.0 * level)
endfunction
//Damage deal
private function Damage takes integer level returns real
if(level == 1) then
return 80.0
elseif(level == 2) then
return 160.0
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct ForceNova_Data
unit u //Unit caster
player o //Owner of caster
real x //Caster x
real y //Caster y
boolean c //Check channel
integer a //Arc count
real f //Facing
real dt //Distance
real dtm //Distance move
real dd //Degree difference
real i //Interval
real im //Interval max
real r //Radius
real d //Damage deal
boolean up //Upgrade
real sc //Scale
endstruct
//----------------------------------------------------------------
struct Force_Data
unit u //Unit caster
player o //Owner of caster
unit dum //Unit dummy
group g //Group target
real dt //Distance
real dtm //Distance move
real cos //Cos of moving angle
real sin //Sin of moving angle
real r //Radius
real d //Damage deal
boolean up //Upgraded
real upi //Upgrade interval
real upim //Upgrade interval max
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private ForceNova_Data array Ar[10]
private timer Tim2
private integer Total2
private ForceNova_Data array Ar2[100]
private group all
private location loc
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute2 takes nothing returns nothing
local Force_Data fd
local integer i = 0
local unit f = null
local real tX = 0.0
local real tY = 0.0
local real x = 0.0
local real y = 0.0
loop
exitwhen(i >= Total2)
set fd = Ar2[i]
if(fd.dt > 0.0) then
set fd.dt = fd.dt - fd.dtm
set x = GetUnitX(fd.dum)
set y = GetUnitY(fd.dum)
set tX = x + fd.dtm * fd.cos
set tY = y + fd.dtm * fd.sin
if(tX > WorldBounds.minX + 300.0 and /*
*/tX < WorldBounds.maxX - 300.0 and /*
*/tY > WorldBounds.minY + 300.0 and /*
*/tY < WorldBounds.maxY - 300.0) then
call SetUnitX(fd.dum, tX)
call SetUnitY(fd.dum, tY)
endif
if(fd.up) then
if(fd.upi > 0.0) then
set fd.upi = fd.upi - Interval()
else
set fd.upi = fd.upim
call DestroyEffect(AddSpecialEffect(UPGRADE_EFFECT, x, y))
endif
endif
call GroupEnumUnitsInRange(all, tX, tY, fd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, fd.o) and (not IsUnitInGroup(f, fd.g))) then
call GroupAddUnit(fd.g, f)
call UnitDamageTarget(fd.u, f, fd.d, true, false, A_TYPE, D_TYPE, null)
endif
endloop
//call UnitDamageTarget(fd.u, fd.t, fd.d, true, true, A_TYPE, D_TYPE, null)
else
call UnitApplyTimedLife(fd.dum, 'BTLF', 3.0)
loop
set f = FirstOfGroup(fd.g)
exitwhen(f == null)
call GroupRemoveUnit(fd.g, f)
endloop
set fd.u = null
set fd.o = null
set fd.dum = null
set Ar2[i] = Ar2[Total2 - 1]
set Ar2[Total2 - 1] = fd
set Total2 = Total2 - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total2 == 0 then
call PauseTimer(Tim2)
endif
set f = null
endfunction
//----------------------------------------------------------------
function Make_Force_Nova takes unit attacker, unit attacked, real radian returns nothing
local Force_Data fd
local integer attackerID = GetUnitUserData(attacker)
local integer level = GetUnitAbilityLevel(attacker, SPELL_ID)
local real attackerX = GetUnitX(attacker)
local real attackerY = GetUnitY(attacker)
local real facing = radian * bj_RADTODEG
local boolean isNull = (Ar2[Total2] == null)
local integer item1 = IsUnitHasItemType(attacker, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(attacker, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(attacker, ITEM2_UPGRADE1)
local integer item4 = IsUnitHasItemType(attacker, ITEM2_UPGRADE2)
local integer item5 = IsUnitHasItemType(attacker, ITEM3_UPGRADE1)
local integer item6 = IsUnitHasItemType(attacker, ITEM3_UPGRADE2)
local real extraRadius = 0.0
if(level > 0) then
if(isNull) then
set fd = Force_Data.create()
set fd.g = CreateGroup()
else
set fd = Ar2[Total2]
endif
set fd.u = attacker
set fd.o = GetOwningPlayer(attacker)
set fd.dum = CreateUnit(fd.o, DUMMY_ID, attackerX, attackerY, facing)
if(item1 > 0) then
call SetUnitScale(fd.dum, 1.25, 1.25, 1.25)
endif
if(item2 > 0) then
call SetUnitScale(fd.dum, 1.5, 1.5, 1.5)
endif
set fd.dt = Distance(level)
set fd.dtm = DISTANCE_MOVE
set fd.cos = Cos(radian)
set fd.sin = Sin(radian)
set fd.r = Radius(level)
set fd.d = Damage(level)
set fd.d = fd.d + (Damage(level) * LoadInteger(MagicDamage_Ht, attackerID, 0) * 0.01)
set fd.up = false
set fd.upi = 0.0
set fd.upim = 0.0
if(item3 > 0 or item4 > 0 or item5 > 0 or item6 > 0) then
set fd.up = true
set fd.upi = 0.0
set fd.upim = 0.08
endif
if(item1 > 0) then
set extraRadius = UPGRADE1_RADIUS1
endif
if(item2 > 0) then
set extraRadius = UPGRADE1_RADIUS2
endif
set fd.r = fd.r + extraRadius
if(item5 > 0) then
set fd.dt = fd.dt + (UPGRADE3_DISTANCE1 * item5)
endif
if(item6 > 0) then
set fd.dt = fd.dt + (UPGRADE3_DISTANCE2 * item6)
set fd.dtm = fd.dtm + UPGRADE3_DISTANCE_MOVE2
endif
if(isNull) then
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = fd
else
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
endif
endif
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local ForceNova_Data sd
local integer i = 0
local Force_Data fd
local real rad = 0.0
local real tX = 0.0
local real tY = 0.0
local real facing = 0.0
local real radian = 0.0
local boolean isNull = false
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.c) then
if(sd.a > 0) then
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
set sd.a = sd.a - 1
set rad = sd.f * bj_DEGTORAD
set tX = sd.x + DISTANCE_OFFSET * Cos(rad)
set tY = sd.y + DISTANCE_OFFSET * Sin(rad)
set radian = Atan2(tY - sd.y, tX - sd.x)
set facing = radian * bj_RADTODEG
set isNull = (Ar2[Total2] == null)
if(isNull) then
set fd = Force_Data.create()
set fd.g = CreateGroup()
else
set fd = Ar2[Total2]
endif
set fd.u = sd.u
set fd.o = sd.o
set fd.dum = CreateUnit(sd.o, DUMMY_ID, tX, tY, facing)
if(sd.up) then
call SetUnitScale(fd.dum, sd.sc, sd.sc, sd.sc)
endif
set fd.dt = sd.dt
set fd.dtm = sd.dtm
set fd.cos = Cos(radian)
set fd.sin = Sin(radian)
set fd.r = sd.r
set fd.d = sd.d
set fd.up = false
set fd.upi = 0.0
set fd.upim = 0.0
if(sd.up) then
set fd.up = true
set fd.upi = 0.0
set fd.upim = 0.08
endif
if(isNull) then
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = fd
else
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
endif
set sd.f = sd.f - sd.dd
endif
else
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
else
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local ForceNova_Data sd = ForceNova_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
local unit target = GetSpellTargetUnit()
local real targetX = 0.0
local real targetY = 0.0
local real angle = 0.0
local integer i = 0
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item5 = IsUnitHasItemType(caster, ITEM3_UPGRADE1)
local integer item6 = IsUnitHasItemType(caster, ITEM3_UPGRADE2)
local real extraRadius = 0.0
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_AW_ForceNova
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
if(target == null) then
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
else
set targetX = GetUnitX(target)
set targetY = GetUnitY(target)
endif
set angle = Atan2(targetY - casterY, targetX - casterX) * bj_RADTODEG
set sd.u = caster
set sd.o = owner
set sd.x = casterX
set sd.y = casterY
set sd.c = true
set sd.a = Arc_Count(level)
if(item3 > 0) then
set sd.a = sd.a + (UPGRADE2_ARC1 * item3)
endif
if(item4 > 0) then
set sd.a = sd.a + (UPGRADE2_ARC2 * item4)
endif
set sd.f = angle + DEGREE
set sd.dt = Distance(level)
set sd.dtm = DISTANCE_MOVE
set sd.dd = (DEGREE * 2) / (sd.a - 1)
set sd.i = 0.0
set sd.im = (TIME_CAST / sd.a) - Interval()
set sd.r = Radius(level)
set sd.d = Damage(level)
set sd.d = sd.d + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.up = false
set sd.sc = 1
if(item1 > 0) then
set extraRadius = UPGRADE1_RADIUS1
set sd.up = true
set sd.sc = 1.25
endif
if(item2 > 0) then
set extraRadius = UPGRADE1_RADIUS1
set sd.up = true
set sd.sc = 1.5
endif
set sd.r = sd.r + extraRadius
if(item5 > 0) then
set sd.dt = sd.dt + (UPGRADE3_DISTANCE1 * item5)
set sd.up = true
endif
if(item6 > 0) then
set sd.dt = sd.dt + (UPGRADE3_DISTANCE2 * item6)
set sd.dtm = sd.dtm + UPGRADE3_DISTANCE_MOVE2
set sd.up = true
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
set target = null
set s = null
endfunction
//----------------------------------------------------------------
private function Stop_Actions takes nothing returns nothing
local ForceNova_Data sd
local unit caster = GetTriggerUnit()
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set sd.c = false
endif
set i = i + 1
endloop
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(ForceNovaTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(ForceNovaTrg, Condition(function Conditions))
call TriggerAddAction(ForceNovaTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(ForceNovaStopTrg, EVENT_PLAYER_UNIT_SPELL_ENDCAST)
call TriggerAddCondition(ForceNovaStopTrg, Condition(function Conditions))
call TriggerAddAction(ForceNovaStopTrg, function Stop_Actions)
//Setting globals
set loc = Location(0, 0)
set Tim = CreateTimer()
set Total = 0
set Tim2 = CreateTimer()
set Total2 = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call Preload(UPGRADE_EFFECT)
call AbilityPreload(SPELL_ID)
endfunction
endscope
//TESH.scrollpos=98
//TESH.alwaysfold=0
globals
group EsotericFormUnit = CreateGroup()
group EsotericFormAttackUnit = CreateGroup()
group EsotericFormAttackedUnit = CreateGroup()
endglobals
scope EsotericForm initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A04E' //Spell Esoteric Form rawcode
private constant integer UNIT_ID = 'H000' //Unit Esoteric Form rawcode
private constant integer CAST_ID = 'ACls' //Cast Force Nova (Dummy) rawcode
private constant integer BUFF_ID = 'B03G' //Buff Force Nova (Dummy) rawcode
private constant real COOLDOWN = 0.5 //Cooldown
private constant integer ITEM1_UPGRADE1 = 'I001' //Item Coral Spire
private constant integer ITEM1_UPGRADE2 = 'I00V' //Item Retiarius of Torrent
private constant integer ITEM1_UPGRADE3 = 'I00W' //Item Atlantic Darktrident
private constant integer ITEM2_UPGRADE = 'I024' //Item Death Shard
private constant real UPGRADE1_ATTACKER_DURATION1 = 3.0 //Upgrade 1 effect 1
private constant real UPGRADE1_ATTACKER_DURATION2 = 6.0 //Upgrade 1 effect 2
private constant real UPGRADE1_ATTACKER_DURATION3 = 9.0 //Upgrade 1 effect 3
private constant real UPGRADE2_MANA_BURN = 0.2 //Upgrade 2 effect 1
private constant string UPGRADE1_EFFECT = "Abilities\\Weapons\\DragonHawkMissile\\DragonHawkMissile.mdl" //Effect to attacker
private constant string UPGRADE2_EFFECT = "Abilities\\Spells\\Human\\DispelMagic\\DispelMagicTarget.mdl" //Effect to attacker
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private group Cooldown
endglobals
//----------------------------------------------------------------
function EsotericForm_onDamage takes unit attacker, unit attacked, real amount returns nothing
local real burn = amount
local integer item1 = IsUnitHasItemType(attacked, ITEM2_UPGRADE)
set burn = burn * UPGRADE2_MANA_BURN * item1
call DestroyEffect(AddSpecialEffectTarget(UPGRADE2_EFFECT, attacker, "origin"))
call SetUnitState(attacker, UNIT_STATE_MANA, GetUnitState(attacker, UNIT_STATE_MANA) - burn)
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetSpellAbilityUnit()
local integer casterType = GetUnitTypeId(caster)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE)
local real duration = 0.0
local effect sfx = null
if(casterType == UNIT_ID) then
call GroupRemoveUnit(EsotericFormUnit, caster)
call GroupRemoveUnit(EsotericFormAttackedUnit, caster)
if(item1 > 0) then
set duration = duration + UPGRADE1_ATTACKER_DURATION1
endif
if(item2 > 0) then
set duration = duration + UPGRADE1_ATTACKER_DURATION2
endif
if(item3 > 0) then
set duration = duration + UPGRADE1_ATTACKER_DURATION3
endif
if(duration > 0.0) then
call GroupAddUnit(EsotericFormAttackUnit, caster)
set sfx = AddSpecialEffectTarget(UPGRADE1_EFFECT, caster, "weapon")
call TriggerSleepAction(duration)
call GroupRemoveUnit(EsotericFormAttackUnit, caster)
call DestroyEffect(sfx)
set sfx = null
endif
else
call GroupAddUnit(EsotericFormUnit, caster)
if(item4 > 0) then
call GroupAddUnit(EsotericFormAttackedUnit, caster)
endif
endif
set caster = null
set sfx = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit caster = GetSpellAbilityUnit()
local boolean okey = GetSpellAbilityId() == SPELL_ID
set caster = null
return okey
endfunction
//----------------------------------------------------------------
private function Attack_Actions takes nothing returns nothing
local unit attacker = GetAttacker()
local real attackerX = GetUnitX(attacker)
local real attackerY = GetUnitY(attacker)
local player owner = GetOwningPlayer(attacker)
local unit attacked = GetTriggerUnit()
local real attackedX = GetUnitX(attacked)
local real attackedY = GetUnitY(attacked)
local real rad = Atan2(attackedY - attackerY, attackedX - attackerX)
call Make_Force_Nova(attacker, attacked, rad)
call GroupAddUnit(Cooldown, attacker)
call TriggerSleepAction(COOLDOWN)
call GroupRemoveUnit(Cooldown, attacker)
set attacker = null
set owner = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Attack_Conditions takes nothing returns boolean
local unit attacker = GetAttacker()
local boolean okey = GetUnitAbilityLevel(attacker, SPELL_ID) > 0 and /*
*/IsUnitInGroup(attacker, EsotericFormAttackUnit) and /*
*/(not IsUnitInGroup(attacker, Cooldown))
set attacker = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(EsotericFormTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(EsotericFormTrg, Condition(function Conditions))
call TriggerAddAction(EsotericFormTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(EsotericFormAttackTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(EsotericFormAttackTrg, Condition(function Attack_Conditions))
call TriggerAddAction(EsotericFormAttackTrg, function Attack_Actions)
//Settings
set Cooldown = CreateGroup()
//Preload
call AbilityPreload(SPELL_ID)
endfunction
endscope
//TESH.scrollpos=194
//TESH.alwaysfold=0
scope StormHammer initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A04J' //Spell Storm Hammer rawcode
private constant integer ABILITY1_ID = 'A00Q' //Ability Tempest Smack (Slow) rawcode
private constant integer CAST_ID = 'A04K' //Cast Stun rawcode
private constant integer UNIT1_ID = 'H002' //Unit King of Tempest (Overlord Level 1) rawcode
private constant integer UNIT2_ID = 'H001' //Unit King of Tempest (Overlord Level 2) rawcode
private constant integer DUMMY1_ID = 'n00P' //Unit Storm Hammer dummy
private constant integer DUMMY2_ID = 'n00Q' //Unit Storm Hammer (Charged) dummy
private constant integer BUFF_ID = 'B01P' //Buff Lightning Charge rawcode
private constant string SPELL_EFFECT = "Abilities\\Weapons\\Bolt\\BoltImpact.mdl" //Effect hit of Storm Hammer (Charged)
private constant string KNOCKBACK_EFFECT = "Abilities\\Weapons\\Bolt\\BoltImpact.mdl" //Knockback effect
private constant real KNOCKBACK_DISTANCE = 60.0 //Knockback distance
private constant real KNOCKBACK_DURATION = 0.5 //Knockback duration
private constant real AVATAR_MULTIPLY1 = 1.5 //Avatar of Wrath multiply damage level 1
private constant real AVATAR_MULTIPLY2 = 2.0 //Avatar of Wrath multiply damage level 2
private constant integer ITEM1_UPGRADE1 = 'I01J' //Item Lightning Gripper
private constant integer ITEM1_UPGRADE2 = 'I028' //Item Stormanifer
private constant integer ITEM3_UPGRADE1 = 'rat9' //Item Stoneforge Hammer
private constant integer ITEM3_UPGRADE2 = 'I00T' //Item Hardspike Beetle
private constant integer ITEM3_UPGRADE3 = 'I00U' //Item Skull Crusher
private constant integer ITEM4_UPGRADE1 = 'I01O' //Item Bloodeye Lynch
private constant integer ITEM4_UPGRADE2 = 'I01S' //Item Havocrave Dissever
private constant integer ITEM5_UPGRADE = 'I018' //Item Porthole Jumper
private constant integer UPGRADE1_TARGET1 = 1 //Upgraade 1 target increase 1
private constant integer UPGRADE1_TARGET2 = 2 //Upgraade 1 target increase 2
private constant real UPGRADE3_DAMAGE1 = 20.0 //Upgrade 3 increase damage 1
private constant real UPGRADE3_DAMAGE2 = 40.0 //Upgrade 3 increase damage 2
private constant real UPGRADE3_DAMAGE3 = 60.0 //Upgrade 3 increase damage 3
private constant real UPGRADE3_RADIUS2 = 50.0 //Upgrade 3 increase radius 2
private constant real UPGRADE3_RADIUS3 = 100.0 //Upgrade 3 increase radius 3
private constant real UPGRADE4_DISTANCE1 = 200.0 //Upgrade 4 increase damage 1
private constant real UPGRADE4_DISTANCE2 = 400.0 //Upgrade 4 increase damage 2
private constant integer UPGRADE5_ABILITY = 'A0A2' //Upgrade 5 ability rawcode
private constant attacktype A_TYPE = ATTACK_TYPE_SIEGE //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_LIGHTNING //Spell damage type
endglobals
//Hammer speed
private function Speed takes integer level returns real
return 70.0 + (0.0 * level)
endfunction
//Distance Storm Hammer travel
private function Distance takes integer level returns real
return 1500.0 + (0 * level)
endfunction
//Damage deal
private function Damage takes integer level returns real
if(level == 1) then
return 100.0
elseif(level == 2) then
return 125.0
elseif(level == 3) then
return 175.0
elseif(level == 4) then
return 250.0
else
return 0.0
endif
endfunction
//Radius of damage deal
private function Radius takes integer level returns real
return 150.0 + (0 * level)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct StormHammer_Data
unit u //Unit caster
unit b //Unit dummy
player o //Owner of caster
integer l //Level of spell
group g //Group target
integer tt //Total target
real t //Distance travel
real tM //Maximum distance
real m //Distance travel per interval
real x //X of Hammer
real y //Y of Hammer
real cos //Cos facing of Hammer
real sin //Sin facing of Hammer
boolean c //Check Hammer move away (true) or return (false) after hit
boolean rf //Refresh hit target
real d //Damage deal
real r //Radius of damage
boolean h //Hit done
boolean p //Powerup
string sfx //Special effect when hit
boolean k //Knockback
integer kl //Knockback level
integer it2 //Item 1 upgrade 2
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private StormHammer_Data array Ar[10]
private group all
private boolexpr bexpr
private location target
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local StormHammer_Data sd
local integer i = 0
local real cx = 0.0
local real cy = 0.0
local real dx = 0.0
local real dy = 0.0
local real x = 0.0
local real y = 0.0
local real distance = 0.0
local real angle = 0.0
local real face = 0.0
local unit f = null
local real fX = 0.0
local real fY = 0.0
local real fAngle = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
call GroupEnumUnitsInRange(all, sd.x, sd.y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o) and (not IsUnitInGroup(f, sd.g))) then
call GroupAddUnit(sd.g, f)
if(IsUnitType(f, UNIT_TYPE_HERO)) then
if(not sd.h) then
if(sd.tt <= 0) then
set sd.h = true
set sd.c = false
else
set sd.tt = sd.tt - 1
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set fAngle = Atan2(fY - sd.y, fX - sd.x) * bj_RADTODEG
call DestroyEffect(AddSpecialEffectTarget(sd.sfx, f, "origin"))
if(sd.it2 > 0) then
call TargetCast(sd.o, fX, fY, 0.5, CAST_ID, sd.l + 4, "thunderbolt", 0, f)
else
call TargetCast(sd.o, fX, fY, 0.5, CAST_ID, sd.l, "thunderbolt", 0, f)
endif
call UnitDamageTarget(sd.u, f, sd.d, true, false, A_TYPE, D_TYPE, null)
if(sd.k) then
call KnockbackEx(f, KNOCKBACK_DISTANCE * sd.kl, fAngle, KNOCKBACK_DURATION, 0, KNOCKBACK_EFFECT, true)
endif
endif
endif
else
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set fAngle = Atan2(fY - sd.y, fX - sd.x) * bj_RADTODEG
call DestroyEffect(AddSpecialEffectTarget(sd.sfx, f, "origin"))
if(sd.it2 > 0) then
call TargetCast(sd.o, fX, fY, 0.5, CAST_ID, sd.l + 4, "thunderbolt", 0, f)
else
call TargetCast(sd.o, fX, fY, 0.5, CAST_ID, sd.l, "thunderbolt", 0, f)
endif
call UnitDamageTarget(sd.u, f, sd.d, true, false, A_TYPE, D_TYPE, null)
if(sd.k) then
call KnockbackEx(f, KNOCKBACK_DISTANCE * sd.kl, fAngle, KNOCKBACK_DURATION, 0, KNOCKBACK_EFFECT, true)
endif
endif
endif
endloop
call HitTree(sd.x, sd.y, sd.r, 5.0, 0.0)
if(sd.t > 0 and sd.c) then
set x = sd.x + sd.m * sd.cos
set y = sd.y + sd.m * sd.sin
//if(IsWall(sd.x, sd.y, 70.0)) then
//set sd.t = 0
//else
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
//call SetUnitPosition(sd.b, sd.x, sd.y)
call SetUnitX(sd.b, sd.x)
call SetUnitY(sd.b, sd.y)
set sd.x = x
set sd.y = y
endif
//endif
set sd.t = sd.t - sd.m
elseif(not sd.rf) then
set sd.rf = true
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
else
set cx = GetUnitX(sd.u)
set cy = GetUnitY(sd.u)
set dx = sd.x - cx
set dy = sd.y - cy
set distance = SquareRoot(dx * dx + dy * dy)
if(distance > 150.0) then
set angle = Atan2(cy - sd.y, cx - sd.x)
set sd.cos = Cos(angle)
set sd.sin = Sin(angle)
set face = Atan2(sd.y - cy, sd.x - cx)
set sd.x = sd.x + sd.m * sd.cos
set sd.y = sd.y + sd.m * sd.sin
//call SetUnitPosition(sd.b, sd.x, sd.y)
call SetUnitX(sd.b, sd.x)
call SetUnitY(sd.b, sd.y)
call SetUnitFacing(sd.b, face * bj_RADTODEG)
else
call RemoveUnit(sd.b)
set sd.b = null
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
call UnitRemoveAbility(sd.u, UPGRADE5_ABILITY)
set sd.u = null
set sd.b = null
set sd.sfx = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local StormHammer_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer casterType = GetUnitTypeId(caster)
local player owner = GetOwningPlayer(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local real targetX = 0.0
local real targetY = 0.0
local real angle = 0.0
local boolean isNull = (Ar[Total] == null)
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM3_UPGRADE1)
local integer item4 = IsUnitHasItemType(caster, ITEM3_UPGRADE2)
local integer item5 = IsUnitHasItemType(caster, ITEM3_UPGRADE3)
local integer item6 = IsUnitHasItemType(caster, ITEM4_UPGRADE1)
local integer item7 = IsUnitHasItemType(caster, ITEM4_UPGRADE2)
local integer item8 = IsUnitHasItemType(caster, ITEM5_UPGRADE)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_KT_StormHammer
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
if(isNull) then
set sd = StormHammer_Data.create()
set sd.g = CreateGroup()
else
set sd = Ar[Total]
endif
set target = GetSpellTargetLoc()
set targetX = GetLocationX(target)
set targetY = GetLocationY(target)
set angle = Atan2(targetY - casterY, targetX - casterX)
set sd.u = caster
set sd.l = level
set sd.o = owner
set sd.tt = 1
set sd.t = Distance(level)
set sd.tM = sd.t
set sd.m = Speed(level)
set sd.x = casterX
set sd.y = casterY
set sd.cos = Cos(angle)
set sd.sin = Sin(angle)
set sd.c = true
set sd.rf = false
set sd.r = Radius(level)
set sd.h = false
set sd.p = false
set sd.d = Damage(level)
set sd.d = sd.d + (sd.d * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.sfx = SPELL_EFFECT
set sd.k = GetUnitAbilityLevel(caster, BUFF_ID) > 0
set sd.kl = 0
set sd.it2 = 0
if(item3 > 0) then
set sd.d = sd.d + (UPGRADE3_DAMAGE1 * item3)
endif
if(item4 > 0) then
set sd.d = sd.d + (UPGRADE3_DAMAGE2 * item4)
set sd.r = sd.r + UPGRADE3_RADIUS2
endif
if(item5 > 0) then
set sd.d = sd.d + (UPGRADE3_DAMAGE3 * item5)
set sd.r = sd.r + UPGRADE3_RADIUS3
endif
if(item6 > 0) then
set sd.t = sd.t + (UPGRADE4_DISTANCE1 * item6)
endif
if(item7 > 0) then
set sd.t = sd.t + (UPGRADE4_DISTANCE2 * item7)
endif
if(item8 > 0) then
call UnitAddAbility(caster, UPGRADE5_ABILITY)
endif
if(casterType == UNIT1_ID) then
set sd.b = CreateUnit(owner, DUMMY2_ID, casterX, casterY, angle * bj_RADTODEG)
call SetUnitScale(sd.b, 2.0, 2.0, 2.0)
if(item1 > 0) then
set sd.tt = sd.tt + UPGRADE1_TARGET1
endif
if(item2 > 0) then
set sd.tt = sd.tt + UPGRADE1_TARGET2
set sd.it2 = item2
endif
//set sd.m = sd.m * AVATAR_MULTIPLY1
set sd.d = sd.d * AVATAR_MULTIPLY1
set sd.r = sd.r * AVATAR_MULTIPLY1
elseif(casterType == UNIT2_ID) then
set sd.b = CreateUnit(owner, DUMMY2_ID, casterX, casterY, angle * bj_RADTODEG)
call SetUnitScale(sd.b, 3.0, 3.0, 3.0)
if(item1 > 0) then
set sd.tt = sd.tt + UPGRADE1_TARGET1
endif
if(item2 > 0) then
set sd.tt = sd.tt + UPGRADE1_TARGET2
set sd.it2 = item2
endif
//set sd.m = sd.m * AVATAR_MULTIPLY2
set sd.d = sd.d * AVATAR_MULTIPLY2
set sd.r = sd.r * AVATAR_MULTIPLY2
else
set sd.b = CreateUnit(owner, DUMMY1_ID, casterX, casterY, angle * bj_RADTODEG)
endif
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, caster, "weapon"))
if(sd.k) then
set sd.kl = LoadInteger(LightningCharge_ht, casterID, LIGHTNING_CHARGE_LEVEL_KEY)
endif
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set owner = null
set s = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Jump_Actions takes nothing returns nothing
local StormHammer_Data sd
local unit caster = GetSpellAbilityUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local integer i = 0
local real x = 0.0
local real y = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set x = GetUnitX(sd.b)
set y = GetUnitY(sd.b)
call SetUnitX(caster, x)
call SetUnitY(caster, y)
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, x, y))
call UnitRemoveAbility(caster, UPGRADE5_ABILITY)
set i = Total
endif
set i = i + 1
endloop
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Jump_Conditions takes nothing returns boolean
return GetSpellAbilityId() == UPGRADE5_ABILITY
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(StormHammerTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(StormHammerTrg, Condition(function Conditions))
call TriggerAddAction(StormHammerTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(StormHammerJumpTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(StormHammerJumpTrg, Condition(function Jump_Conditions))
call TriggerAddAction(StormHammerJumpTrg, function Jump_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
set target = Location(0, 0)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY1_ID)
call AbilityPreload(CAST_ID)
call Preload(SPELL_EFFECT)
call Preload(KNOCKBACK_EFFECT)
endfunction
endscope
//TESH.scrollpos=100
//TESH.alwaysfold=0
scope ThunderSmack initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A04L' //Spell Thunder Smack rawcode
private constant integer CAST_ID = 'AHtc' //Cast Thunder Smack (Dummy) rawcode
private constant integer BUFF_ID = 'B01P' //Buff Lightning Charge rawcode
private constant integer UNIT1_ID = 'H002' //Unit King of Tempest (Overlord Level 1) rawcode
private constant integer UNIT2_ID = 'H001' //Unit King of Tempest (Overlord Level 2) rawcode
private constant real DAMAGE_TO_TREES = 5.0 //Damage to trees
private constant integer ANIMATE1 = 10 //Animation
private constant integer ANIMATE2 = 23 //Animation
private constant real TIME_ANIMATE = 0.4 //Time for Mountain King animate smack
private constant string SPELL_EFFECT = "Abilities\\Spells\\Human\\Thunderclap\\ThunderClapCaster.mdl" //Spell effect
private constant string TARGET_EFFECT = "Abilities\\Weapons\\Bolt\\BoltImpact.mdl" //Effect hit of target (Charged)
private constant string KNOCKBACK_EFFECT = "Abilities\\Weapons\\Bolt\\BoltImpact.mdl" //Knockback effect
private constant real KNOCKBACK_DISTANCE = 60.0 //Knockback distance
private constant real KNOCKBACK_DURATION = 0.5 //Knockback duration
private constant real AVATAR_MULTIPLY1 = 1.5 //Avatar of Wrath multiply damage level 1
private constant real AVATAR_MULTIPLY2 = 2.0 //Avatar of Wrath multiply damage level 2
private constant integer ITEM1_UPGRADE1 = 'I01F' //Item Ataraxia Sparta
private constant integer ITEM1_UPGRADE2 = 'I01G' //Item Throne of Emperor
private constant integer ITEM3_UPGRADE1 = 'I00N' //Item Mortise Timbercutter
private constant integer ITEM3_UPGRADE2 = 'mlst' //Item Vehemence
private constant integer ITEM3_UPGRADE3 = 'I00O' //Item Arcanite Reaver
private constant integer ITEM4_UPGRADE = 'crdt' //Item Armlet of Insanity
private constant real UPGRADE1_RADIUS = 300.0 //Upgrade radius close enemy
private constant real UPGRADE3_DAMAGE1 = 25.0 //Upgrade 2 damage 1
private constant real UPGRADE3_DAMAGE2 = 50.0 //Upgrade 2 damage 2
private constant real UPGRADE3_DAMAGE3 = 75.0 //Upgrade 2 damage 3
private constant real UPGRADE4_ANIMATE = 0.1 //Upgrade animate speed
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_LIGHTNING //Spell damage type
endglobals
//Damage to target
private function Damage takes integer level returns real
if(level == 1) then
return 100.0
elseif(level == 2) then
return 150.0
elseif(level == 3) then
return 250.0
else
return 0.0
endif
endfunction
//Radius of area
private function Radius takes integer level returns real
return 400.0 + (00.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_FLYING) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct ThunderSmack_Data
unit u //Unit caster
integer id //Caster id
integer l //Level of spell
player o //Owner of caster
real cos //Cos of angle
real sin //Sin of angle
real tX //Target x
real tY //Target y
real dm //Distance move
real x //X of graph
real y //Y of graph
real t //Distance
boolean f //Finish cast
real d //Damage dealt
real r //Radius
boolean k //Knockback
integer it1 //Item 1 upgrade
integer it2 //Item 2 upgrade
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private ThunderSmack_Data array Ar[10]
private group all
private group copy
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local ThunderSmack_Data sd
local integer i = 0
local real x = 0.0
local real y = 0.0
local unit f = null
local real fX = 0.0
local real fY = 0.0
local real fAngle = 0.0
local real fDistance = 0.0
local integer lightningChargeLevel = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(not sd.f) then
if(sd.x < sd.t and (not IsUnitDead(sd.u))) then
set sd.x = sd.x + sd.dm
set sd.y = (-1 / ((3 * sd.t) / 4)) * sd.x * (sd.x - sd.t)
set x = GetUnitX(sd.u) + sd.dm * sd.cos
set y = GetUnitY(sd.u) + sd.dm * sd.sin
//if(IsWall(x, y, 100.0)) then
//set sd.x = sd.t
//else
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0)) and (not IsBarrel(sd.u, x, y, 100.0))) then
call SetUnitX(sd.u, x)
call SetUnitY(sd.u, y)
endif
//endif
call SetUnitFlyHeight(sd.u, sd.y, 0.0)
else
set sd.f = true
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
if(sd.k) then
set lightningChargeLevel = LoadInteger(LightningCharge_ht, sd.id, LIGHTNING_CHARGE_LEVEL_KEY)
endif
call SetUnitPosition(sd.u, x, y)
//call PauseUnit(sd.u, false)
call SetUnitPathing(sd.u, true)
call SetUnitFlyHeight(sd.u, GetUnitDefaultFlyHeight(sd.u), 0.0)
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, x, y))
call Pather(sd.u, 1.0)
if(sd.it1 > 0 or sd.it2 > 0) then
call ImmediateCast(sd.o, x, y, 0.5, CAST_ID, sd.l + 3, "thunderclap", 0)
else
call ImmediateCast(sd.o, x, y, 0.5, CAST_ID, sd.l, "thunderclap", 0)
endif
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (IsUnitEnemy(f, sd.o)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set fAngle = Atan2(y - fY, x - fX) * bj_RADTODEG
set fDistance = SquareRoot(((fX - x) * (fX - x)) + ((fY - y) * (fY - y)))
if(sd.it2 > 0) then
if(fDistance <= UPGRADE1_RADIUS) then
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.d, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.d, true, false, A_TYPE, D_TYPE, null)
endif
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, fX, fY))
endif
endif
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.d, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.d, true, false, A_TYPE, D_TYPE, null)
endif
call DestroyEffect(AddSpecialEffectTarget(TARGET_EFFECT, f, "origin"))
if(sd.k) then
call KnockbackEx(f, RMinBJ(KNOCKBACK_DISTANCE * lightningChargeLevel, fDistance - 60.0), fAngle, KNOCKBACK_DURATION, 0, KNOCKBACK_EFFECT, false)
endif
endif
endloop
call HitTree(x, y, sd.r, DAMAGE_TO_TREES, 10.0)
endif
else
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local ThunderSmack_Data sd = ThunderSmack_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer casterType = GetUnitTypeId(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real rad = GetUnitFacing(caster) * bj_DEGTORAD
local real targetX = GetSpellTargetX()
local real targetY = GetSpellTargetY()
local real dx = casterX - targetX
local real dy = casterY - targetY
local real distance = SquareRoot(dx * dx + dy * dy)
local real animate = TIME_ANIMATE
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM3_UPGRADE1)
local integer item4 = IsUnitHasItemType(caster, ITEM3_UPGRADE2)
local integer item5 = IsUnitHasItemType(caster, ITEM3_UPGRADE3)
local integer item6 = IsUnitHasItemType(caster, ITEM4_UPGRADE)
if(item6 > 0) then
set animate = animate - UPGRADE4_ANIMATE
endif
set sd.u = caster
set sd.id = casterID
set sd.l = level
set sd.o = owner
set sd.cos = Cos(rad)
set sd.sin = Sin(rad)
set sd.tX = targetX
set sd.tY = targetY
set sd.dm = distance / (animate / Interval())
set sd.x = 0
set sd.y = 0
set sd.t = distance
set sd.f = false
set sd.r = Radius(level)
set sd.d = Damage(level)
set sd.d = sd.d + sd.d * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01
set sd.k = GetUnitAbilityLevel(caster, BUFF_ID) > 0
set sd.it1 = 0
set sd.it2 = 0
if(item3 > 0) then
set sd.d = sd.d + (UPGRADE3_DAMAGE1 * item3)
endif
if(item4 > 0) then
set sd.d = sd.d + (UPGRADE3_DAMAGE2 * item4)
endif
if(item5 > 0) then
set sd.d = sd.d + (UPGRADE3_DAMAGE3 * item5)
endif
call PauseUnit(caster, true)
call UnitAddAbility(caster, 'Arav')
call UnitRemoveAbility(caster, 'Arav')
call SetUnitPathing(caster, false)
if(casterType == UNIT1_ID) then
call SetUnitAnimationByIndex(caster, ANIMATE2)
set sd.it1 = item1
set sd.it2 = item2
set sd.d = sd.d * AVATAR_MULTIPLY1
set sd.r = sd.r * AVATAR_MULTIPLY1
elseif(casterType == UNIT2_ID) then
call SetUnitAnimationByIndex(caster, ANIMATE2)
set sd.it1 = item1
set sd.it2 = item2
set sd.d = sd.d * AVATAR_MULTIPLY2
set sd.r = sd.r * AVATAR_MULTIPLY2
else
call SetUnitAnimationByIndex(caster, ANIMATE1)
endif
call PauseUnit(caster, false)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(ThunderSmackTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(ThunderSmackTrg, Condition(function Conditions))
call TriggerAddAction(ThunderSmackTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set copy = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call Preload(SPELL_EFFECT)
call Preload(TARGET_EFFECT)
call Preload(KNOCKBACK_EFFECT)
endfunction
endscope
//TESH.scrollpos=103
//TESH.alwaysfold=0
scope Bash initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A04M' //Spell Forked Bash rawcode
private constant integer CAST_ID = 'A04N' //Cast Forked Bash (Attack) rawcode
private constant integer CAST1_ID = 'A04O' //Cast Forked Bash (Dummy) rawcode
private constant integer BUFF_ID = 'B01M' //Buff Forked Bash (Attack) rawcode
private constant integer BUFF1_ID = 'B00M' //Buff Avatar rawcode
private constant integer BUFF2_ID = 'B01P' //Buff Lightning Charge rawcode
private constant integer UNIT1_ID = 'H002' //Unit King of Tempest (Overlord Level 1) rawcode
private constant integer UNIT2_ID = 'H001' //Unit King of Tempest (Overlord Level 2) rawcode
private constant string BASH_EFFECT = "Abilities\\Weapons\\FarseerMissile\\FarseerMissile.mdl" //Bash caster target effect
//private constant integer ANIME1_CAST = 4
//private constant integer ANIME2_CAST = 17
private constant integer ANIMATE1_ATTACK = 12
private constant integer ANIMATE2_ATTACK = 25
private constant string KNOCKBACK_EFFECT = "Abilities\\Weapons\\Bolt\\BoltImpact.mdl" //Knockback effect
private constant real KNOCKBACK_DISTANCE = 60.0 //Knockback distance
private constant real KNOCKBACK_DURATION = 0.5 //Knockback duration
private constant real AVATAR_MULTIPLY1 = 2.0 //Avatar of Wrath multiply damage level 1
private constant real AVATAR_MULTIPLY2 = 3.0 //Avatar of Wrath multiply damage level 2
private constant integer ITEM1_UPGRADE1 = 'I00Y' //Item Blight River
private constant integer ITEM1_UPGRADE2 = 'rugt' //Item Aphotical Scythe
private constant integer ITEM3_UPGRADE1 = 'I00R' //Item Aztez Spear
private constant integer ITEM3_UPGRADE2 = 'I00S' //Item Truepierce Lance
private constant integer ITEM3_UPGRADE3 = 'I002' //Item Amazon Meld
private constant integer ITEM4_UPGRADE1 = 'modt' //Item Scourge Visor
private constant integer ITEM4_UPGRADE2 = 'I01D' //Item Larynxrage
private constant real UPGRADE1_DURATION1 = 0.5 //Upgrade 1 duration decrease
private constant real UPGRADE1_DURATION2 = 1.0 //Upgrade 1 duration decrease
private constant real UPGRADE3_DAMAGE1 = 5.0 //Upgrade item 3 damage 1
private constant real UPGRADE3_DAMAGE2 = 10.0 //Upgrade item 3 damage 2
private constant real UPGRADE3_DAMAGE3 = 20.0 //Upgrade item 3 damage 3
private constant real UPGRADE4_LIFE_STEAL1 = 0.15 //Upgrade item 4 life steal 1
private constant real UPGRADE4_LIFE_STEAL2 = 0.25 //Upgrade item 4 life steal 2
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_LIGHTNING //Spell damage type
endglobals
//Damage to target
private function Damage takes integer level returns real
if(level == 1) then
return 20.0
elseif(level == 2) then
return 40.0
elseif(level == 3) then
return 80.0
else
return 0.0
endif
endfunction
//Radius
private function Overlord_Radius takes integer level returns real
return 200.0 + (0.0 * level)
endfunction
//Interval to get bash
private function Duration takes integer level returns real
if(level == 1) then
return 10.0
elseif(level == 2) then
return 8.0
elseif(level == 3) then
return 6.0
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_FLYING) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.5
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Bash_Data
unit u //Unit caster
player o //Owner of caster
real i //Interval
real im //Interval max
effect e //Effect ready
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Bash_Data array Ar[10]
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(GetFilterUnit())
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Bash_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
if(sd.e == null) then
set sd.e = AddSpecialEffectTarget(BASH_EFFECT, sd.u, "weapon")
endif
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Attack_Actions takes nothing returns nothing
local unit attacker = GetAttacker()
local integer attackerID = GetUnitUserData(attacker)
local integer attackerType = GetUnitTypeId(attacker)
local player owner = GetOwningPlayer(attacker)
local real attackerX = GetUnitX(attacker)
local real attackerY = GetUnitY(attacker)
local unit attacked = GetTriggerUnit()
local real attackedX = GetUnitX(attacked)
local real attackedY = GetUnitY(attacked)
local integer level = GetUnitAbilityLevel(attacker, SPELL_ID)
local Bash_Data sd
local integer i = 0
local boolean exist = false
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == attacker and (not exist)) then
if(sd.i <= 0.0) then
set sd.im = Duration(level)
set exist = true
set i = Total
endif
endif
set i = i + 1
endloop
if(exist) then
if(attackerType == UNIT1_ID or attackerType == UNIT2_ID) then
call SetUnitAnimationByIndex(attacker, ANIMATE2_ATTACK)
else
call SetUnitAnimationByIndex(attacker, ANIMATE1_ATTACK)
endif
call TargetCast(owner, attackedX, attackedY, 0.5, CAST_ID, 1, "curse", 0, attacked)
endif
set attacker = null
set owner = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Attack_Conditions takes nothing returns boolean
return GetUnitAbilityLevel(GetAttacker(), SPELL_ID) > 0
endfunction
//----------------------------------------------------------------
function Bash_onDamage takes unit attacker, unit attacked, real amount returns nothing
local integer attackerID = GetUnitUserData(attacker)
local integer attackerType = GetUnitTypeId(attacker)
local real attackerX = GetUnitX(attacker)
local real attackerY = GetUnitY(attacker)
local player owner = GetOwningPlayer(attacker)
local integer level = GetUnitAbilityLevel(attacker, SPELL_ID)
local real damage = Damage(level)
local real attackedX = GetUnitX(attacked)
local real attackedY = GetUnitY(attacked)
local boolean charge = GetUnitAbilityLevel(attacker, BUFF2_ID) > 0
local integer lightningChargeLevel = LoadInteger(LightningCharge_ht, attackerID, LIGHTNING_CHARGE_LEVEL_KEY)
local Bash_Data sd
local integer i = 0
local unit f = null
local real fX = 0.0
local real fY = 0.0
local real fAngle = 0.0
local integer item1 = IsUnitHasItemType(attacker, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(attacker, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(attacker, ITEM3_UPGRADE1)
local integer item4 = IsUnitHasItemType(attacker, ITEM3_UPGRADE2)
local integer item5 = IsUnitHasItemType(attacker, ITEM3_UPGRADE3)
local integer item6 = IsUnitHasItemType(attacker, ITEM4_UPGRADE1)
local integer item7 = IsUnitHasItemType(attacker, ITEM4_UPGRADE2)
local boolean avatar = true
local real lifeSteal = 0.0
local real life = 0.0
call UnitRemoveAbility(attacked, BUFF_ID)
if(item6 > 0) then
set lifeSteal = lifeSteal + (UPGRADE4_LIFE_STEAL1 * item6)
endif
if(item7 > 0) then
set lifeSteal = lifeSteal + (UPGRADE4_LIFE_STEAL2 * item7)
endif
if(attackerType == UNIT1_ID) then
set damage = damage + AVATAR_MULTIPLY1
set damage = damage + (damage * LoadInteger(MagicDamage_Ht, attackerID, 0) * 0.01)
if(item3 > 0) then
set damage = damage + (UPGRADE3_DAMAGE1 * item3)
endif
if(item4 > 0) then
set damage = damage + (UPGRADE3_DAMAGE2 * item4)
endif
if(item5 > 0) then
set damage = damage + (UPGRADE3_DAMAGE3 * item5)
endif
set life = damage * lifeSteal
call SetUnitState(attacker, UNIT_STATE_LIFE, GetUnitState(attacker, UNIT_STATE_LIFE) + life)
call GroupEnumUnitsInRange(all, attackerX, attackerY, Overlord_Radius(level), bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (IsUnitEnemy(f, owner)) then
call UnitDamageTarget(attacker, f, damage, true, false, A_TYPE, D_TYPE, null)
call DestroyEffect(AddSpecialEffectTarget(BASH_EFFECT, f, "origin"))
if(item2 > 0) then
if(f == attacked) then
call TargetCast(owner, GetUnitX(f), GetUnitY(f), 0.5, CAST1_ID, level + 3, "thunderbolt", 0, f)
endif
else
call TargetCast(owner, GetUnitX(f), GetUnitY(f), 0.5, CAST1_ID, level, "thunderbolt", 0, f)
endif
if(charge) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set fAngle = Atan2(fY - attackerY, fX - attackerX) * bj_RADTODEG
call KnockbackEx(f, KNOCKBACK_DISTANCE * lightningChargeLevel, fAngle, KNOCKBACK_DURATION, 0, KNOCKBACK_EFFECT, true)
endif
endif
endloop
elseif(attackerType == UNIT2_ID) then
set damage = damage + AVATAR_MULTIPLY2
set damage = damage + (damage * LoadInteger(MagicDamage_Ht, attackerID, 0) * 0.01)
if(item3 > 0) then
set damage = damage + (UPGRADE3_DAMAGE1 * item3)
endif
if(item4 > 0) then
set damage = damage + (UPGRADE3_DAMAGE2 * item4)
endif
if(item5 > 0) then
set damage = damage + (UPGRADE3_DAMAGE3 * item5)
endif
set life = damage * lifeSteal
call SetUnitState(attacker, UNIT_STATE_LIFE, GetUnitState(attacker, UNIT_STATE_LIFE) + life)
call GroupEnumUnitsInRange(all, attackerX, attackerY, Overlord_Radius(level) * 2, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (IsUnitEnemy(f, owner)) then
call UnitDamageTarget(attacker, f, damage, true, false, A_TYPE, D_TYPE, null)
call DestroyEffect(AddSpecialEffectTarget(BASH_EFFECT, f, "origin"))
if(item2 > 0) then
if(f == attacked) then
call TargetCast(owner, GetUnitX(f), GetUnitY(f), 0.5, CAST1_ID, level + 3, "thunderbolt", 0, f)
endif
else
call TargetCast(owner, GetUnitX(f), GetUnitY(f), 0.5, CAST1_ID, level, "thunderbolt", 0, f)
endif
if(charge) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set fAngle = Atan2(fY - attackerY, fX - attackerX) * bj_RADTODEG
call KnockbackEx(f, KNOCKBACK_DISTANCE * lightningChargeLevel, fAngle, KNOCKBACK_DURATION, 0, KNOCKBACK_EFFECT, true)
endif
endif
endloop
else
set avatar = false
set damage = damage + AVATAR_MULTIPLY2
set damage = damage + (damage * LoadInteger(MagicDamage_Ht, attackerID, 0) * 0.01)
if(item3 > 0) then
set damage = damage + (UPGRADE3_DAMAGE1 * item3)
endif
if(item4 > 0) then
set damage = damage + (UPGRADE3_DAMAGE2 * item4)
endif
if(item5 > 0) then
set damage = damage + (UPGRADE3_DAMAGE3 * item5)
endif
set life = damage * lifeSteal
call SetUnitState(attacker, UNIT_STATE_LIFE, GetUnitState(attacker, UNIT_STATE_LIFE) + life)
call UnitDamageTarget(attacker, attacked, damage, true, false, A_TYPE, D_TYPE, null)
call DestroyEffect(AddSpecialEffectTarget(BASH_EFFECT, attacked, "origin"))
call TargetCast(owner, GetUnitX(attacked), GetUnitY(attacked), 0.5, CAST1_ID, level, "thunderbolt", 0, attacked)
if(charge) then
set fX = GetUnitX(attacked)
set fY = GetUnitY(attacked)
set fAngle = Atan2(fY - attackerY, fX - attackerX) * bj_RADTODEG
call KnockbackEx(attacked, KNOCKBACK_DISTANCE * lightningChargeLevel, fAngle, KNOCKBACK_DURATION, 0, KNOCKBACK_EFFECT, true)
endif
endif
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == attacker) then
call DestroyEffect(sd.e)
set sd.e = null
set sd.i = sd.im
if(avatar) then
if(item2 > 0) then
set sd.i = sd.i - UPGRADE1_DURATION2
elseif(item1 > 0) then
set sd.i = sd.i - UPGRADE1_DURATION1
endif
endif
set i = Total
endif
set i = i + 1
endloop
set attacker = null
set attacked = null
set owner = null
set f = null
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local unit learner = GetLearningUnit()
local integer learnerType = GetUnitTypeId( learner)
local player owner = GetOwningPlayer(learner)
local integer ownerNum = GetPlayerId(owner)
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
local Bash_Data sd
local integer i = 0
local boolean exist = false
if(level <= 1) then
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set exist = true
set sd.im = Duration(level)
endif
set i = i + 1
endloop
if(not exist) then
set sd = Bash_Data.create()
set sd.u = learner
set sd.o = owner
set sd.i = 0.0
set sd.im = Duration(level)
set sd.e = null
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
else
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set sd.im = Duration(level)
endif
set i = i + 1
endloop
endif
set learner = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
local unit learner = GetTriggerUnit()
local boolean okey = (GetLearnedSkill() == SPELL_ID) and (not IsUnitIllusion(learner))
set learner = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(BashAttackTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(BashAttackTrg, Condition(function Attack_Conditions))
call TriggerAddAction(BashAttackTrg, function Attack_Actions)
call TriggerRegisterAnyUnitEventBJ(BashLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(BashLearnTrg, Condition( function Learn_Conditions))
call TriggerAddAction(BashLearnTrg, function Learn_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call AbilityPreload(CAST1_ID)
call Preload(BASH_EFFECT)
call Preload(KNOCKBACK_EFFECT)
endfunction
endscope
//TESH.scrollpos=34
//TESH.alwaysfold=0
globals
hashtable LightningCharge_ht = InitHashtable()
integer LIGHTNING_CHARGE_LEVEL_KEY = 0
integer LIGHTNING_CHARGE_LIGHTNING_KEY = 0
endglobals
scope LightningCharge initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A04Q' //Spell Lightning Charge rawcode
private constant integer CAST_ID = 'A04R' //Spell Lightning Charge (Dummy) rawcode
private constant integer BUFF_ID = 'B01P' //Buff Lightning Charge rawcode
private constant string LIGHTNING_CODE = "CLPB" //Lightning code
private constant integer ITEM1_UPGRADE1 = 'I00K' //Item Expidition Footgear
private constant integer ITEM1_UPGRADE2 = 'bspd' //Item Boots of Speed
private constant integer ITEM1_UPGRADE3 = 'I01T' //Item Sneaker of Exzel
private constant integer ITEM2_UPGRADE1 = 'I008' //Item Mania Cestus
private constant integer ITEM2_UPGRADE2 = 'I011' //Item Fist of Firebringer
private constant integer ITEM3_UPGRADE1 = 'I00Q' //Item Edge of Blaze
private constant integer ITEM3_UPGRADE2 = 'frgd' //Item Heaven Rapier
private constant real UPGRADE1_MOVE1 = 100.0 //Upgrade 1 move distance 1
private constant real UPGRADE1_MOVE2 = 200.0 //Upgrade 1 move distance 2
private constant real UPGRADE1_MOVE3 = 300.0 //Upgrade 1 move distance 3
private constant real UPGRADE1_RADIUS3 = 300.0 //Upgrade 1 radius 3
private constant real UPGRADE2_DAMAGE1 = 30.0 //Upgrade 2 damage 1
private constant real UPGRADE2_DAMAGE2 = 60.0 //Upgrade 2 damage 2
private constant real UPGRADE2_RADIUS1 = 1000.0 //Upgrade 2 radius 1
private constant real UPGRADE2_RADIUS2 = 1000.0 //Upgrade 2 radius 2
private constant real UPGRADE3_DAMAGE1 = 10.0 //Upgrade 2 damage 1
private constant real UPGRADE3_DAMAGE2 = 20.0 //Upgrade 2 damage 2
private constant real UPGRADE3_RADIUS1 = 200.0 //Upgrade 2 radius 1
private constant real UPGRADE3_RADIUS2 = 200.0 //Upgrade 2 radius 2
private constant real DURATION_LIGHTNING = 0.5 //Lightning duration
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_LIGHTNING //Spell damage type
private constant string UPGRADE_EFFECT = "Abilities\\Weapons\\Bolt\\BoltImpact.mdl" //Upgrade effect
endglobals
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.5
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct LightningCharge_Data
unit u //Unit caster
player o //Owner of caster
real i //Interval
real im //Max interval
real d //Damage
real r //Radius damage
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private LightningCharge_Data array Ar[10]
private group all
private boolexpr bexpr
private location loc1
private location loc2
private group lighter
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local LightningCharge_Data sd
local integer i = 0
local unit f = null
local real x = 0.0
local real y = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(GetUnitAbilityLevel(sd.u, BUFF_ID) > 0) then
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
if(sd.d > 0.0) then
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.d, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.d, true, false, A_TYPE, D_TYPE, null)
endif
call DestroyEffect(AddSpecialEffectTarget(UPGRADE_EFFECT, f, "origin"))
endif
endloop
endif
endif
else
call FlushChildHashtable(LightningCharge_ht, GetUnitUserData(sd.u))
set sd.u = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local LightningCharge_Data sd = LightningCharge_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item6 = IsUnitHasItemType(caster, ITEM3_UPGRADE1)
local integer item7 = IsUnitHasItemType(caster, ITEM3_UPGRADE2)
local real x = 0.0
local real y = 0.0
local real rad = GetUnitFacing(caster) * bj_DEGTORAD
local lightning lg = null
local boolean move = false
local real distance = 0.0
local boolean moveArea = false
local real radius = 0.0
local unit f = null
local integer fId = 0
local real fX = 0.0
local real fY = 0.0
local boolean damageArea = false
local real damage = 0.0
local real damageRadius = 0.0
set sd.u = caster
set sd.o = owner
set sd.i = 0.0
set sd.im = 0.0
set sd.d = 0.0
set sd.r = 0.0
if(item1 > 0) then
set move = true
set distance = UPGRADE1_MOVE1
endif
if(item2 > 0) then
set move = true
set distance = UPGRADE1_MOVE2
endif
if(item3 > 0) then
set move = true
set moveArea = true
set radius = UPGRADE1_RADIUS3
set distance = UPGRADE1_MOVE3
endif
if(item4 > 0) then
set damageArea = true
set damageRadius = damageRadius + (UPGRADE2_RADIUS1 * item4)
set damage = damage + (UPGRADE2_DAMAGE1 * item4)
endif
if(item5 > 0) then
set damageArea = true
set damageRadius = damageRadius + (UPGRADE2_RADIUS2 * item5)
set damage = damage + (UPGRADE2_DAMAGE2 * item5)
call TargetCast(owner, casterX, casterY, 0.5, CAST_ID, level + 3, "slow", 0, caster)
else
call TargetCast(owner, casterX, casterY, 0.5, CAST_ID, level, "slow", 0, caster)
endif
if(item6 > 0) then
set sd.d = sd.d + (UPGRADE3_DAMAGE1 * item6)
set sd.d = sd.d + (sd.d * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.r = UPGRADE3_RADIUS1
endif
if(item7 > 0) then
set sd.d = sd.d + (UPGRADE3_DAMAGE2 * item7)
set sd.d = sd.d + (sd.d * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.r = UPGRADE3_RADIUS2
endif
call SaveInteger(LightningCharge_ht, casterID, LIGHTNING_CHARGE_LEVEL_KEY, level)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
if(move) then
if(not IsUnitInGroup(caster, lighter)) then
set loc1 = Location(casterX, casterY)
set x = casterX + distance * Cos(rad)
set y = casterY + distance * Sin(rad)
set loc2 = Location(x, y)
call SetUnitX(caster, x)
call SetUnitY(caster, y)
call Pather(caster, 1.0)
call DestroyEffect(AddSpecialEffect(UPGRADE_EFFECT, casterX, casterY))
call DestroyEffect(AddSpecialEffect(UPGRADE_EFFECT, x, y))
set lg = AddLightningEx(LIGHTNING_CODE, true, casterX, casterY, GetLocationZ(loc1), x, y, GetLocationZ(loc2))
call SaveLightningHandle(LightningCharge_ht, casterID, LIGHTNING_CHARGE_LIGHTNING_KEY, lg)
set lg = null
call GroupAddUnit(lighter, caster)
endif
endif
if(moveArea) then
call GroupEnumUnitsInRange(all, casterX, casterY, radius, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitAlly(f, owner) and (not IsUnitInGroup(f, lighter)) and (f != caster)) then
set fId = GetUnitUserData(f)
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set loc1 = Location(fX, fY)
set x = fX + distance * Cos(rad)
set y = fY + distance * Sin(rad)
set loc2 = Location(x, y)
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0)) and (not IsBarrel(sd.u, x, y, 100.0))) then
call SetUnitX(f, x)
call SetUnitY(f, y)
call Pather(f, 1.0)
call DestroyEffect(AddSpecialEffect(UPGRADE_EFFECT, fX, fY))
call DestroyEffect(AddSpecialEffect(UPGRADE_EFFECT, x, y))
set lg = AddLightningEx(LIGHTNING_CODE, true, fX, fY, GetLocationZ(loc1), x, y, GetLocationZ(loc2))
call SaveLightningHandle(LightningCharge_ht, fId, LIGHTNING_CHARGE_LIGHTNING_KEY, lg)
set lg = null
call GroupAddUnit(lighter, f)
endif
endif
endloop
endif
if(damageArea) then
set damage = damage + (damage * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
call GroupEnumUnitsInRange(all, casterX, casterY, damageRadius, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, owner)) then
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(caster, f, damage, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(caster, f, damage, true, false, A_TYPE, D_TYPE, null)
endif
call DestroyEffect(AddSpecialEffectTarget(UPGRADE_EFFECT, f, "origin"))
endif
endloop
endif
call TriggerSleepAction(DURATION_LIGHTNING)
if(move or moveArea) then
loop
set f = FirstOfGroup(lighter)
exitwhen(f == null)
call GroupRemoveUnit(lighter, f)
set fId = GetUnitUserData(f)
set lg = LoadLightningHandle(LightningCharge_ht, fId, LIGHTNING_CHARGE_LIGHTNING_KEY)
call DestroyLightning(lg)
set lg = null
endloop
endif
set caster = null
set owner = null
set lg = null
set f = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(LightningChargeTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(LightningChargeTrg, Condition(function Conditions))
call TriggerAddAction(LightningChargeTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
set loc1 = Location(0, 0)
set loc2 = Location(0, 0)
set lighter = CreateGroup()
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope AvatarWrath initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A04P' //Spell Tempest Smack rawcode
private constant integer UNIT_ID = 'Hmkg' //Unit King of Tempest rawcode
private constant string SPELL_EFFECT = "Abilities\\Spells\\Human\\Avatar\\AvatarCaster.mdl" //Special effect
endglobals
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer casterType = GetUnitTypeId(caster)
if(casterType == UNIT_ID) then
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, caster, "origin"))
endif
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(AvatarWrathTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(AvatarWrathTrg, Condition(function Conditions))
call TriggerAddAction(AvatarWrathTrg, function Actions)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=112
//TESH.alwaysfold=0
scope FireBlast initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A04Z' //Spell Fire Blast rawcode
private constant integer ABILITY_ID = 'A051' //Spell Fire Blast (Launch) rawcode
private constant integer ABILITY1_ID = 'Asph' //Ability Burning Orbs (3 Spheres) rawcode
private constant integer ABILITY2_ID = 'A04X' //Ability Burning Orbs (2 Spheres) rawcode
private constant integer ABILITY3_ID = 'A04Y' //Ability Burning Orbs (1 Sphere) rawcode
private constant integer ABILITY4_ID = 'A04V' //Ability Burning Orbs rawcode
private constant integer CAST_ID = 'A050' //Cast Fire Blast rawcode
private constant integer CAST1_ID = 'AHfs' //Cast Burning Land rawcode
private constant integer ITEM1_UPGRADE1 = 'rin1' //Item Circlet of Intelligence
private constant integer ITEM1_UPGRADE2 = 'ciri' //Item Firstmind Necklace
private constant integer ITEM1_UPGRADE3 = 'I00I' //Item Circlet of Intelligence
private constant integer ITEM1_UPGRADE4 = 'I027' //Item Mindseer of Ultimate
private constant integer ITEM2_UPGRADE1 = 'I012' //Item Arcane Heaver
private constant integer ITEM2_UPGRADE2 = 'lgdh' //Item Vangage Expulsion
private constant integer ITEM3_UPGRADE1 = 'I01N' //Item Staff of Flamecurse
private constant integer ITEM3_UPGRADE2 = 'ssil' //Item Sunstalker
private constant real UPGRADE1_RADIUS1 = 200.0 //Upgrade 1 effect 1
private constant real UPGRADE1_RADIUS2 = 300.0 //Upgrade 1 effect 2
private constant real UPGRADE1_RADIUS3 = 400.0 //Upgrade 1 effect 3
private constant real UPGRADE1_RADIUS4 = 500.0 //Upgrade 1 effect 4
private constant real UPGRADE2_DURATION1 = 5.0 //Upgrade 2 effect 1
private constant real UPGRADE2_DURATION2 = 10.0 //Upgrade 2 effect 2
private constant real UPGRADE3_HEAL1 = 10.0 //Upgrade 3 effect 1
private constant real UPGRADE3_HEAL2 = 20.0 //Upgrade 3 effect 2
private constant real UPGRADE3_DAMAGE1 = 10.0 //Upgrade 3 effect 1
private constant real UPGRADE3_DAMAGE2 = 20.0 //Upgrade 3 effect 2
private constant string SPECIAL_EFFECT = "Abilities\\Weapons\\FireBallMissile\\FireBallMissile.mdl" //Special effect
private constant string SPELL_EFFECT = "Objects\\Spawnmodels\\Human\\SmallFlameSpawn\\SmallFlameSpawn.mdl" //"Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl" //Spell blast effect
private constant integer EFFECT_COUNT = 30 //Number of effects at land minus number of targets
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_FIRE //Spell damage type
endglobals
//Duration of blast
private function Duration takes integer level returns real
return 10.0 + (0.0 * level)
endfunction
//Damage to targets
private function Damage takes integer level returns real
if(level == 1) then
return 60.0
elseif(level == 2) then
return 90.0
elseif(level == 3) then
return 150.0
elseif(level == 4) then
return 240.0
else
return 0.0
endif
endfunction
//Radius of blast
private function Radius takes integer level returns real
return 500.0 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct FireBlast_Data
unit u //Unit caster
player o //Owner of caster
unit t //Target
integer l //Spell level
real i //Interval
real d //Damage to target
real r //Radius of blast
boolean f //Burning
boolean fnt //Burning no target
integer fl //Level of Burning Orbs
effect e //Effect
integer it1 //Upgrade item 1
integer it3 //Upgrade item 3
real ith //Item heal
real itd //Item damage
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private FireBlast_Data array Ar[10]
private integer Total
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local FireBlast_Data sd
local integer i = 0
local real x = 0.0
local real y = 0.0
local unit f = null
local real fX = 0.0
local real fY = 0.0
local integer t = 0
local real tX = 0.0
local real tY = 0.0
local real randomDistance = 0.0
local real randomAngle = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(IsUnitDead(sd.t) or IsUnitType(sd.t, UNIT_TYPE_MAGIC_IMMUNE)) then
set sd.i = 0.0
endif
if(sd.i > 0) then
set sd.i = sd.i - Interval()
if(sd.it3 > 0) then
if(IsUnitEnemy(sd.t, sd.o)) then
if(IsUnitType(sd.t, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, sd.t, sd.itd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, sd.t, sd.itd, true, false, A_TYPE, D_TYPE, null)
endif
else
if(IsUnitType(sd.t, UNIT_TYPE_ETHEREAL)) then
call SetUnitState(sd.t, UNIT_STATE_LIFE, GetUnitState(sd.t, UNIT_STATE_LIFE) + sd.ith * ETHEREAL_BONUS)
else
call SetUnitState(sd.t, UNIT_STATE_LIFE, GetUnitState(sd.t, UNIT_STATE_LIFE) + sd.ith)
endif
endif
endif
else
set x = GetUnitX(sd.t)
set y = GetUnitY(sd.t)
set t = EFFECT_COUNT
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (IsUnitEnemy(f, sd.o)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.d, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.d, true, false, A_TYPE, D_TYPE, null)
endif
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, f, "overhead"))
call Timed_AddSpecialEffect(SPELL_EFFECT, fX, fY, 3.0)
if(sd.it1 > 0) then
call TargetCast(sd.o, fX, fY, 0.5, CAST_ID, sd.l + 4, "thunderbolt", 0, f)
else
call TargetCast(sd.o, fX, fY, 0.5, CAST_ID, sd.l, "thunderbolt", 0, f)
endif
if(sd.f) then
call PointCast(sd.o, fX, fY, 3.0, CAST1_ID, sd.fl, "flamestrike", 0, fX, fY)
endif
set t = t - 1
endif
endloop
if(t > 0) then
loop
exitwhen(t <= 0)
set randomDistance = GetRandomReal(0, sd.r)
set randomAngle = I2R(GetRandomInt(0, 360))
set tX = x + randomDistance * Cos(randomAngle * bj_DEGTORAD)
set tY = y + randomDistance * Sin(randomAngle * bj_DEGTORAD)
call Timed_AddSpecialEffect(SPELL_EFFECT, tX, tY, 3.0)
call DestroyEffect(AddSpecialEffect(SPECIAL_EFFECT, tX, tY))
if(sd.fnt) then
call PointCast(sd.o, tX, tY, 3.0, CAST1_ID, sd.fl + 3, "flamestrike", 0, tX, tY)
endif
set t = t - 1
endloop
endif
call DestroyEffect(sd.e)
set sd.e = null
call SetPlayerAbilityAvailable(sd.o, SPELL_ID, true)
call UnitRemoveAbility(sd.u, ABILITY_ID)
call UnitShareVision(sd.t, sd.o, false)
set sd.u = null
set sd.o = null
set sd.t = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local FireBlast_Data sd = FireBlast_Data.create()
local unit caster = GetTriggerUnit()
local player owner = GetOwningPlayer(caster)
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local unit target = GetSpellTargetUnit()
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM1_UPGRADE4)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item6 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item7 = IsUnitHasItemType(caster, ITEM3_UPGRADE1)
local integer item8 = IsUnitHasItemType(caster, ITEM3_UPGRADE2)
set sd.u = caster
set sd.o = owner
set sd.t = target
set sd.l = level
set sd.i = Duration(level)
set sd.d = Damage(level) + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.r = Radius(level)
set sd.f = false
set sd.fnt = false
set sd.fl = GetUnitAbilityLevel(caster, ABILITY4_ID)
set sd.e = AddSpecialEffectTarget(SPECIAL_EFFECT, target, "head")
set sd.it1 = 0
set sd.it3 = 0
set sd.ith = 0.0
set sd.itd = 0.0
if(item1 > 0) then
set sd.r = sd.r + (UPGRADE1_RADIUS1 * item1)
endif
if(item2 > 0) then
set sd.r = sd.r + (UPGRADE1_RADIUS2 * item2)
endif
if(item3 > 0) then
set sd.r = sd.r + (UPGRADE1_RADIUS3 * item3)
endif
if(item4 > 0) then
set sd.r = sd.r + (UPGRADE1_RADIUS4 * item4)
set sd.it1 = item4
endif
if(item5 > 0) then
set sd.i = sd.i + (UPGRADE2_DURATION1 * item5)
endif
if(item6 > 0) then
set sd.i = sd.i + (UPGRADE2_DURATION2 * item6)
call UnitShareVision(target, owner, true)
endif
if(item7 > 0) then
set sd.it3 = item7
set sd.ith = sd.ith + (UPGRADE3_HEAL1 * item7)
set sd.ith = sd.ith + (sd.ith * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.itd = sd.itd + (UPGRADE3_DAMAGE1 * item7)
set sd.itd = sd.itd + (sd.itd * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
endif
if(item8 > 0) then
set sd.it3 = item8
set sd.ith = sd.ith + (UPGRADE3_HEAL2 * item8)
set sd.ith = sd.ith + (sd.ith * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.itd = sd.itd + (UPGRADE3_DAMAGE2 * item8)
set sd.itd = sd.itd + (sd.itd * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.fnt = true
endif
if(GetUnitAbilityLevel(caster, ABILITY1_ID) > 0) then
set sd.f = true
call UnitRemoveAbility(caster, ABILITY1_ID)
call UnitAddAbility(caster, ABILITY2_ID)
elseif(GetUnitAbilityLevel(caster, ABILITY2_ID) > 0) then
set sd.f = true
call UnitRemoveAbility(caster, ABILITY2_ID)
call UnitAddAbility(caster, ABILITY3_ID)
elseif(GetUnitAbilityLevel(caster, ABILITY3_ID) > 0) then
set sd.f = true
call UnitRemoveAbility(caster, ABILITY3_ID)
endif
call SetPlayerAbilityAvailable(owner, SPELL_ID, false)
call UnitAddAbility(caster, ABILITY_ID)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
set target = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Launch_Actions takes nothing returns nothing
local FireBlast_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set sd.i = 0.0
endif
set i = i + 1
endloop
set caster = null
endfunction
//----------------------------------------------------------------
private function Launch_Conditions takes nothing returns boolean
return GetSpellAbilityId() == ABILITY_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(FireBlastTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(FireBlastTrg, Condition(function Conditions))
call TriggerAddAction(FireBlastTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(FireBlastLaunchTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(FireBlastLaunchTrg, Condition(function Launch_Conditions))
call TriggerAddAction(FireBlastLaunchTrg, function Launch_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPECIAL_EFFECT)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=134
//TESH.alwaysfold=0
scope BloodSiphon initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A04W' //Spell Blood Siphon rawcode
private constant integer CAST1_ID = 'AHfs' //Cast Burning Land rawcode
private constant integer ABILITY_ID = 'A04V' //Spell Burning Orbs rawcode
private constant integer ABILITY1_ID = 'Asph' //Ability Burning Orbs (3 Spheres) rawcode
private constant integer ABILITY2_ID = 'A04X' //Ability Burning Orbs (2 Spheres) rawcode
private constant integer ABILITY3_ID = 'A04Y' //Ability Burning Orbs (1 Sphere) rawcode
private constant integer ITEM1_UPGRADE1 = 'mlst' //Item Vehemence
private constant integer ITEM1_UPGRADE2 = 'I00O' //Item Arcanite Reaver
private constant integer ITEM2_UPGRADE1 = 'I00B' //Item Moth's Mouth
private constant integer ITEM2_UPGRADE2 = 'I01U' //Item Royaltouch
private constant integer ITEM2_UPGRADE3 = 'rnsp' //Item Ivory Halo
private constant integer ITEM3_UPGRADE1 = 'I00Q' //Item Edge of Blaze
private constant integer ITEM3_UPGRADE2 = 'frgd' //Item Heaven Rapier
private constant real UPGRADE1_LIFE1 = 0.04 //Upgrade 1 effect 1
private constant real UPGRADE1_LIFE2 = 0.09 //Upgrade 1 effect 2
private constant real UPGRADE2_BASE_MANA1 = 20.0 //Upgrade 2 effect 1
private constant real UPGRADE2_BASE_LIFE2 = 20.0 //Upgrade 2 effect 2
private constant real UPGRADE2_BASE_LIFE_MANA3 = 40.0 //Upgrade 2 effect 2
private constant real UPGRADE3_RADIUS1 = 200.0 //Upgrade 3 radius 1
private constant real UPGRADE3_RADIUS2 = 200.0 //Upgrade 3 radius 2
private constant real UPGRADE3_DAMAGE1 = 15.0 //Upgrade 3 damage 1
private constant real UPGRADE3_DAMAGE2 = 30.0 //Upgrade 3 damage 2
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_FIRE //Spell damage type
private constant string EXPLODE_EFFECT = "Objects\\Spawnmodels\\Human\\SmallFlameSpawn\\SmallFlameSpawn.mdl" //Spell blast effect
private constant string SPELL_EFFECT = "Abilities\\Spells\\Items\\AIfb\\AIfbSpecialArt.mdl" //Kill effect
endglobals
//Replenish percentage
private function Replenish takes integer level returns real
if(level == 1) then
return 0.09
elseif(level == 2) then
return 0.16
elseif(level == 3) then
return 0.25
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit killer = GetKillingUnit()
local player owner = GetOwningPlayer(killer)
local unit hero = GetHero(owner)
local integer heroID = GetUnitUserData(hero)
local integer level = GetUnitAbilityLevel(hero, SPELL_ID)
local unit dying = GetTriggerUnit()
local real dyingX = GetUnitX(dying)
local real dyingY = GetUnitY(dying)
local real dyingMaxLife = GetUnitState(dying, UNIT_STATE_MAX_LIFE)
local real replenish = Replenish(level) * dyingMaxLife
local real replenishMana = 0.0
local real item1 = IsUnitHasItemType(killer, ITEM1_UPGRADE1)
local real item2 = IsUnitHasItemType(killer, ITEM1_UPGRADE2)
local real item3 = IsUnitHasItemType(killer, ITEM2_UPGRADE1)
local real item4 = IsUnitHasItemType(killer, ITEM2_UPGRADE2)
local real item5 = IsUnitHasItemType(killer, ITEM2_UPGRADE3)
local real item6 = IsUnitHasItemType(killer, ITEM3_UPGRADE1)
local real item7 = IsUnitHasItemType(killer, ITEM3_UPGRADE2)
local boolean explode = false
local real radius = 0.0
local real damage = 0.0
local integer levelIncinerate = 0
local unit f = null
if(item1 > 0) then
set replenish = replenish + (dyingMaxLife * UPGRADE1_LIFE1 * item1)
endif
if(item2 > 0) then
set replenish = replenish + (dyingMaxLife * UPGRADE1_LIFE2 * item2)
endif
if(item3 > 0) then
set replenishMana = replenishMana + (UPGRADE2_BASE_MANA1 * item3)
endif
if(item4 > 0) then
set replenish = replenish + (UPGRADE2_BASE_LIFE2 * item4)
endif
if(item5 > 0) then
set replenish = replenish + (UPGRADE2_BASE_LIFE_MANA3 * item5)
set replenishMana = replenishMana + (UPGRADE2_BASE_LIFE_MANA3 * item5)
endif
if(item6 > 0) then
set explode = true
set radius = UPGRADE3_RADIUS1
set damage = UPGRADE3_DAMAGE1
endif
if(item7 > 0) then
set explode = true
set radius = UPGRADE3_RADIUS2
set damage = UPGRADE3_DAMAGE2
endif
if(IsUnitType(killer, UNIT_TYPE_ETHEREAL)) then
call SetUnitState(hero, UNIT_STATE_LIFE, GetUnitState(hero, UNIT_STATE_LIFE) + replenish * ETHEREAL_BONUS)
call SetUnitState(hero, UNIT_STATE_MANA, GetUnitState(hero, UNIT_STATE_MANA) + replenishMana * ETHEREAL_BONUS)
else
call SetUnitState(hero, UNIT_STATE_LIFE, GetUnitState(hero, UNIT_STATE_LIFE) + replenish)
call SetUnitState(hero, UNIT_STATE_MANA, GetUnitState(hero, UNIT_STATE_MANA) + replenishMana)
endif
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, hero, "overhead"))
if(explode) then
set damage = damage + (damage * LoadInteger(MagicDamage_Ht, heroID, 0) * 0.01)
call GroupEnumUnitsInRange(all, dyingX, dyingY, radius, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, owner)) then
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(hero, f, damage, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(hero, f, damage, true, false, A_TYPE, D_TYPE, null)
endif
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, f, "origin"))
endif
endloop
call Timed_AddSpecialEffect(EXPLODE_EFFECT, dyingX, dyingY, 3.0)
if(GetUnitAbilityLevel(hero, ABILITY1_ID) > 0) then
set levelIncinerate = GetUnitAbilityLevel(hero, ABILITY_ID)
elseif(GetUnitAbilityLevel(hero, ABILITY2_ID) > 0) then
set levelIncinerate = GetUnitAbilityLevel(hero, ABILITY_ID)
elseif(GetUnitAbilityLevel(hero, ABILITY3_ID) > 0) then
set levelIncinerate = GetUnitAbilityLevel(hero, ABILITY_ID)
else
set levelIncinerate = 0
endif
if(levelIncinerate > 0) then
call PointCast(owner, dyingX, dyingY, 3.0, CAST1_ID, levelIncinerate + 3, "flamestrike", 0, dyingX, dyingY)
endif
endif
set killer = null
set owner = null
set dying = null
set hero = null
set f = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit killer = GetKillingUnit()
local player owner = GetOwningPlayer(killer)
local unit hero = GetHero(owner)
local boolean ok = false
if(hero != null) then
if(GetUnitAbilityLevel(hero, SPELL_ID) > 0) then
set ok = true
endif
endif
set killer = null
set owner = null
set hero = null
return ok
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(BloodSiphonTrg, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(BloodSiphonTrg, Condition(function Conditions))
call TriggerAddAction(BloodSiphonTrg, function Actions)
//Settings
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=323
//TESH.alwaysfold=0
scope Incinerate initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A04T' //Spell Incinerate rawcode
private constant integer DUMMY_ID = 'hphx' //Spell Pheonix rawcode
private constant integer DUMMY1_ID = 'n02N' //Spell Pheonix Up rawcode
private constant integer DUMMY2_ID = 'n02O' //Spell Pheonix Down rawcode
private constant integer ABILITY_ID = 'A04U' //Spell Blood Eruption (Dummy) rawcode
private constant integer ABILITY1_ID = 'Asph' //Ability Burning Orbs (3 Spheres) rawcode
private constant integer ABILITY2_ID = 'A04X' //Ability Burning Orbs (2 Spheres) rawcode
private constant integer ABILITY3_ID = 'A04Y' //Ability Burning Orbs (1 Sphere) rawcode
private constant integer ABILITY4_ID = 'A04V' //Ability Burning Orbs rawcode
private constant integer CAST_ID = 'AHfs' //Cast Burning Land rawcode
private constant real EFFECT_INTERVAL = 3.0 //Effect interval
private constant real MAX_HEIGHT = 1000.0 //Height
private constant real HEIGHT_MOVE = 100.0 //Height change
private constant real MAX_TIME = 10.0 //Max time incinerate
private constant integer ITEM1_UPGRADE1 = 'I00J' //Item Astallian Robe
private constant integer ITEM1_UPGRADE2 = 'I01L' //Item Windsage
private constant integer ITEM2_UPGRADE1 = 'modt' //Item Scourge Visor
private constant integer ITEM2_UPGRADE2 = 'I01E' //Item Devourer Maw
private constant integer ITEM2_UPGRADE3 = 'anfg' //Item Brutalic
private constant integer ITEM3_UPGRADE1 = 'I008' //Item Mania Cestus
private constant integer ITEM3_UPGRADE2 = 'I011' //Item Fist of Firebringer
private constant real UPGRADE1_EXPLODE_RADIUS1 = 200.0 //Upgrade 1 effect 1
private constant real UPGRADE1_EXPLODE_RADIUS2 = 400.0 //Upgrade 1 effect 2
private constant real UPGRADE2_LIFE1 = 0.1 //Upgrade 2 effect 1
private constant real UPGRADE2_LIFE2 = 0.2 //Upgrade 2 effect 2
private constant real UPGRADE2_LIFE3 = 0.3 //Upgrade 2 effect 3
private constant integer UPGRADE3_ABILITY = 'A0BC' //Upgrade 3 ability
private constant real UPGRADE3_EXPLODE_DAMAGE1 = 40.0 //Upgrade 3 effect 1
private constant real UPGRADE3_EXPLODE_DAMAGE2 = 80.0 //Upgrade 3 effect 2
private constant string SPELL_EFFECT = "Abilities\\Weapons\\FireBallMissile\\FireBallMissile.mdl" //Effect on target
private constant string EXPLODE_EFFECT = "Abilities\\Spells\\Human\\FlameStrike\\FlameStrike.mdl" // Explode effect
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_FIRE //Spell damage type
endglobals
//Life taken for travel factor
private function Life_Factor takes integer level returns real
return 1.2 - (0.3 * level)
endfunction
//Distance move per interval
private function Distance_Move takes integer level returns real
return 40.0 + (00.0 * level)
endfunction
//Life taken for damage factor
private function Damage_Factor takes integer level returns real
return 2.5 - (0.5 * level)
endfunction
//Damage
private function Damage takes integer level returns real
if(level == 1) then
return 8.0
elseif(level == 2) then
return 12.0
elseif(level == 3) then
return 20.0
else
return 0.0
endif
endfunction
//Radius
private function Radius takes integer level returns real
return 200.0 + (0.0 * level)
endfunction
//Explode damage
private function Explode_Damage takes integer level returns real
if(level == 1) then
return 80.0
elseif(level == 2) then
return 120.0
elseif(level == 3) then
return 180.0
else
return 0.0
endif
endfunction
//Explode radius
private function Explode_Radius takes integer level returns real
return 400.0 + (0.0 * level)
endfunction
//Interval for burn
private function Burning_Interval takes integer level returns real
return 0.12 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Incinerate_Data
unit u //Unit caster
unit dum //Unit dummy
player o //Owner of caster
integer lv //Level
real x //Target x
real y //Target y
real f //Fly height
real t //Max time
boolean c //Boolean cast
integer m //Mode
real dm //Distance move per interval
real lf //Amount factor for travel
real ld //Amount factor for damage
real i //Life interval reduction
real im //Interval
real dd //Damage dealt
real dr //Damage radius
real ed //Explode damage
real er //Explode radius
effect e //Explode effect
real ei //Effect interval
boolean d //Done
boolean b //Burning Orbs
integer bl //Level of Burning Orbs
endstruct
//----------------------------------------------------------------
globals
private location loc
private group all
private boolexpr bexpr
private boolexpr bexpr2
private timer Tim
private integer Total
private Incinerate_Data array Ar[10]
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Incinerate_Data sd
local integer i = 0
local real x = 0.0
local real y = 0.0
local real life = 0.0
local real rad = 0.0
local unit f = null
local real fMana = 0.0
local real total = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.c) then
if(sd.m == 0) then
if(not IsUnitDead(sd.dum) and (IsUnitType(sd.dum, UNIT_TYPE_DEAD) == false)) then
if(sd.t > 0.0) then
set sd.t = sd.t - Interval()
else
set sd.c = false
endif
else
set sd.c = false
endif
set life = GetUnitState(sd.dum, UNIT_STATE_LIFE)
set rad = GetUnitFacing(sd.dum) * bj_DEGTORAD
set x = GetUnitX(sd.dum) + sd.dm * Cos(rad)
set y = GetUnitY(sd.dum) + sd.dm * Sin(rad)
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0)) and (not IsBarrel(sd.u, x, y, 100.0))) then
//call SetUnitPosition(sd.dum, x, y)
call SetUnitX(sd.dum, x)
call SetUnitY(sd.dum, y)
call SetUnitX(sd.u, x)
call SetUnitY(sd.u, y)
endif
set total = 0
call HitTree(x, y, sd.dr, 1.0, 3.0)
call GroupEnumUnitsInRange(all, x, y, sd.dr, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
/*set fMana = GetUnitState(f, UNIT_STATE_MANA)
if(fMana <= 0) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
else
call SetUnitState(f, UNIT_STATE_MANA, fMana - sd.dd)
if(sd.dd - fMana > 0) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
endif*/
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, f, "origin"))
set total = total + sd.dd * sd.ld
endif
endloop
call SetUnitState(sd.dum, UNIT_STATE_LIFE, life - total)
set life = GetUnitState(sd.dum, UNIT_STATE_LIFE)
call SetUnitState(sd.dum, UNIT_STATE_LIFE, life - sd.dd * sd.lf)
if(sd.b) then
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
call PointCast(sd.o, x, y, 3.0, CAST_ID, sd.lv, "flamestrike", 0, x, y)
endif
endif
else
if(sd.m == 1) then
set x = GetUnitX(sd.dum)
set y = GetUnitY(sd.dum)
set sd.f = sd.f + (HEIGHT_MOVE / 2)
call SetUnitX(sd.u, x)
call SetUnitY(sd.u, y)
call SetUnitFlyHeight(sd.dum, sd.f, 0.0)
if(sd.f >= 1000.0) then
set sd.m = 2
endif
elseif(sd.m == 2) then
call RemoveUnit(sd.dum)
set x = sd.x
set y = sd.y
set sd.dum = CreateUnit(sd.o, DUMMY2_ID, x, y, GetUnitFacing(sd.dum))
set sd.m = 3
elseif(sd.m == 3) then
set x = GetUnitX(sd.dum)
set y = GetUnitY(sd.dum)
set sd.f = sd.f - HEIGHT_MOVE
call SetUnitX(sd.u, x)
call SetUnitY(sd.u, y)
call SetUnitFlyHeight(sd.dum, sd.f, 0.0)
if(sd.f <= 0.0) then
call KillUnit(sd.dum)
set sd.c = false
endif
endif
endif
elseif(not sd.d) then
set sd.d = true
set x = GetUnitX(sd.dum)
set y = GetUnitY(sd.dum)
set sd.e = AddSpecialEffect(EXPLODE_EFFECT, x, y)
call SetUnitInvulnerable(sd.u, false)
call HitTree(x, y, sd.dr, 5.0, 3.0)
//call ImmediateEffect(sd.o, x, y, 0.5, CAST_ID, sd.lv, "thunderclap", 0)
call GroupEnumUnitsInRange(all, x, y, sd.er, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
/*set fMana = GetUnitState(f, UNIT_STATE_MANA)
if(fMana <= 0) then
call UnitDamageTarget(sd.u, f, sd.ed, true, false, A_TYPE, D_TYPE, null)
else
call SetUnitState(f, UNIT_STATE_MANA, fMana - sd.ed)
if(sd.dd - fMana > 0) then
call UnitDamageTarget(sd.u, f, sd.ed, true, false, A_TYPE, D_TYPE, null)
endif
endif*/
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.ed, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.ed, true, false, A_TYPE, D_TYPE, null)
endif
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, f, "origin"))
endif
endloop
//call ShowUnit(sd.u, true)
call PauseUnit(sd.u, false)
call SetUnitVertexColor(sd.u, 255, 255, 255, 255)
call SetUnitPosition(sd.u, x, y)
if(GetLocalPlayer() == sd.o) then
call SelectUnit(sd.u, true)
endif
call Pather(sd.u, 1.0)
if(not IsUnitDead(sd.dum)) then
call ShowUnit(sd.dum, false)
/*if(IsUnitSelected(sd.dum, sd.o)) then
if(GetLocalPlayer() == sd.o) then
call SelectUnit(sd.dum, false)
endif
endif*/
endif
if(sd.b) then
call PointCast(sd.o, x, y, 3.0, CAST_ID, sd.lv, "flamestrike", 0, x, y)
endif
elseif(sd.ei > 0) then
set sd.ei = sd.ei - Interval()
else
call DestroyEffect(sd.e)
set sd.e = null
if(not IsUnitDead(sd.dum)) then
call KillUnit(sd.dum)
endif
set sd.u = null
set sd.dum = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Incinerate_Data sd = Incinerate_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local location target = GetSpellTargetLoc()
local real targetX = GetLocationX(target)
local real targetY = GetLocationY(target)
local real rad = Atan2(targetY - casterY, targetX - casterX)
local real face = bj_RADTODEG * rad
local real item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local real item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local real item3 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local real item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local real item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE3)
local real item6 = IsUnitHasItemType(caster, ITEM3_UPGRADE1)
local real item7 = IsUnitHasItemType(caster, ITEM3_UPGRADE2)
set sd.u = caster
set sd.dum = CreateUnit(owner, DUMMY_ID, casterX + 50 * Cos(rad), casterY + 50 * Sin(rad), face)
set sd.o = GetOwningPlayer(caster)
set sd.lv = level
set sd.x = 0.0
set sd.y = 0.0
set sd.f = 0.0
set sd.t = MAX_TIME
set sd.c = true
set sd.m = 0
set sd.dm = Distance_Move(level)
set sd.lf = Life_Factor(level)
set sd.ld = Damage_Factor(level)
set sd.i = 0.0
set sd.im = Burning_Interval(level)
set sd.dd = Damage(level)
set sd.dd = sd.dd + (sd.dd * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.dr = Radius(level)
set sd.ed = Explode_Damage(level)
set sd.er = Explode_Radius(level)
set sd.ei = EFFECT_INTERVAL
set sd.e = null
set sd.d = false
set sd.b = false
set sd.bl = GetUnitAbilityLevel(caster, ABILITY4_ID)
if(GetLocalPlayer() == owner) then
call SelectUnit(sd.dum, true)
call SelectUnit(caster, false)
endif
//call ShowUnit(caster, false)
call SetUnitVertexColor(caster, 255, 255, 255, 0)
call PauseUnit(caster, true)
call SetUnitInvulnerable(caster, true)
if(GetUnitAbilityLevel(caster, ABILITY1_ID) > 0) then
set sd.b = true
call UnitRemoveAbility(caster, ABILITY1_ID)
call UnitAddAbility(caster, ABILITY3_ID)
elseif(GetUnitAbilityLevel(caster, ABILITY2_ID) > 0) then
set sd.b = true
call UnitRemoveAbility(caster, ABILITY2_ID)
endif
if(item1 > 0) then
set sd.er = sd.er + UPGRADE1_EXPLODE_RADIUS1
endif
if(item2 > 0) then
set sd.er = sd.er + UPGRADE1_EXPLODE_RADIUS2
endif
if(item3 > 0) then
set sd.ld = sd.ld - (UPGRADE2_LIFE1 * item3)
set sd.lf = sd.lf - (UPGRADE2_LIFE1 * item3)
endif
if(item4 > 0) then
set sd.ld = sd.ld - (UPGRADE2_LIFE2 * item4)
set sd.lf = sd.lf - (UPGRADE2_LIFE2 * item4)
endif
if(item5 > 0) then
set sd.ld = sd.ld - (UPGRADE2_LIFE3 * item5)
set sd.lf = sd.lf - (UPGRADE2_LIFE3 * item5)
endif
if(item6 > 0) then
set sd.ed = sd.ed + (UPGRADE3_EXPLODE_DAMAGE1 * item6)
endif
if(item7 > 0) then
set sd.ed = sd.ed + (UPGRADE3_EXPLODE_DAMAGE1 * item7)
call UnitAddAbility(sd.dum, UPGRADE3_ABILITY)
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
call RemoveLocation(target)
set target = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Blood_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local Incinerate_Data sd
local integer i = 0
local real life = GetUnitState(caster, UNIT_STATE_LIFE)
local integer spell = GetSpellAbilityId()
local real x = 0.0
local real y = 0.0
local real face = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.dum == caster) then
set sd.ed = sd.ed + life
set sd.c = false
set i = Total
endif
set i = i + 1
endloop
call KillUnit(caster)
set caster = null
endfunction
//----------------------------------------------------------------
private function Blood_Conditions takes nothing returns boolean
return GetSpellAbilityId() == ABILITY_ID
endfunction
//----------------------------------------------------------------
private function Blood_Meteor_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local Incinerate_Data sd
local integer i = 0
local real life = GetUnitState(caster, UNIT_STATE_LIFE)
local integer spell = GetSpellAbilityId()
local real x = 0.0
local real y = 0.0
local real face = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.dum == caster) then
set sd.m = 1
set sd.ed = sd.ed + life
set sd.f = 0.0
set loc = GetSpellTargetLoc()
set sd.x = GetLocationX(loc)
set sd.y = GetLocationY(loc)
set x = GetUnitX(sd.dum)
set y = GetUnitY(sd.dum)
set face = GetUnitFacing(sd.dum)
call RemoveUnit(sd.dum)
set sd.dum = null
set sd.dum = CreateUnit(sd.o, DUMMY1_ID, x, y, face)
set i = Total
endif
set i = i + 1
endloop
set caster = null
endfunction
//----------------------------------------------------------------
private function Blood_Meteor_Conditions takes nothing returns boolean
return GetSpellAbilityId() == UPGRADE3_ABILITY
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(IncinerateTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(IncinerateTrg, Condition(function Conditions))
call TriggerAddAction(IncinerateTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(BloodEruptionTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(BloodEruptionTrg, Condition(function Blood_Conditions))
call TriggerAddAction(BloodEruptionTrg, function Blood_Actions)
call TriggerRegisterAnyUnitEventBJ(BloodMeteorTrg, EVENT_PLAYER_UNIT_SPELL_CAST)
call TriggerAddCondition(BloodMeteorTrg, Condition(function Blood_Meteor_Conditions))
call TriggerAddAction(BloodMeteorTrg, function Blood_Meteor_Actions)
//Setting globals
set loc = Location(0, 0)
set all = CreateGroup()
set bexpr = Condition(function Pick)
set Total = 0
set Tim = CreateTimer()
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call Preload(SPELL_EFFECT)
call Preload(EXPLODE_EFFECT)
endfunction
endscope
//TESH.scrollpos=97
//TESH.alwaysfold=0
globals
group IncinerateAttackUnit = CreateGroup()
endglobals
scope BurningOrbs initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A04V' //Spell Burning Orbs rawcode
private constant integer CAST_ID = 'Alsh' //Cast Burning Land rawcode
private constant integer CAST1_ID = 'AHfs' //Cast Burning Land rawcode
private constant integer BUFF_ID = 'Blsh' //Buff Burning Land rawcode
private constant integer ABILITY1_ID = 'Asph' //Ability Burning Orbs (3 Spheres) rawcode
private constant integer ABILITY2_ID = 'A04X' //Ability Burning Orbs (2 Spheres) rawcode
private constant integer ABILITY3_ID = 'A04Y' //Ability Burning Orbs (1 Sphere) rawcode
private constant real COOLDOWN = 0.5 //Cooldown to attack fire
private constant integer ITEM1_UPGRADE1 = 'prvt' //Item Periapt of Vitality
private constant integer ITEM1_UPGRADE2 = 'rhth' //Item Zemi of Eternal
private constant integer ITEM1_UPGRADE3 = 'I015' //Item Orb of Descent
private constant integer ITEM2_UPGRADE1 = 'penr' //Item Gratify Rosary
private constant integer ITEM2_UPGRADE2 = 'pmna' //Item Pendant of Innerforce
private constant integer ITEM2_UPGRADE3 = 'I01V' //Item Power Fragment
private constant real UPGRADE1_LIFE1 = 0.02 //Upgrade 1 effect 1
private constant real UPGRADE1_LIFE2 = 0.04 //Upgrade 1 effect 2
private constant real UPGRADE1_LIFE3 = 0.06 //Upgrade 1 effect 3
private constant real UPGRADE2_MANA1 = 0.03 //Upgrade 2 effect 1
private constant real UPGRADE2_MANA2 = 0.06 //Upgrade 2 effect 2
private constant real UPGRADE2_MANA3 = 0.09 //Upgrade 2 effect 3
private constant real UPGRADE2_FIRE_INTERVAL3 = 3.0 //Upgrade 2 effect 3
private constant integer UPGRADE1_ABILITY = 'Abof' //Upgrade 1 ability
private constant string SPELL_EFFECT = "Abilities\\Weapons\\FireBallMissile\\FireBallMissile.mdl" //Effect on target
endglobals
//Life use in percent
private function Life_Use takes integer level returns real
return 0.1 + (0.0 * level)
endfunction
//Duration replenish
private function Duration takes integer level returns real
return 0.5
endfunction
//Mana replenish
private function Mana takes integer level returns real
if(level == 1) then
return 0.1
elseif(level == 2) then
return 0.2
elseif(level == 3) then
return 0.3
else
return 0.0
endif
endfunction
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct BurningOrbs_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of spell
real i //Interval
real im //Interval max
real m //Mana increase
boolean f //Upgrade
real fi //Fire interval
real fim //Fire max interval
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Bash_Data array Ar[10]
endglobals
//----------------------------------------------------------------
function BurningOrbs_onDamage takes unit attacker, unit attacked, real amount returns nothing
local integer level = GetUnitAbilityLevel(attacker, SPELL_ID)
local player owner = GetOwningPlayer(attacker)
local real attackedX = GetUnitX(attacked)
local real attackedY = GetUnitY(attacked)
call UnitRemoveAbility(attacked, BUFF_ID)
call PointCast(owner, attackedX, attackedY, 3.0, CAST1_ID, level + 3, "flamestrike", 0, attackedX, attackedY)
set attacker = null
set attacked = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local BurningOrbs_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(GetUnitAbilityLevel(sd.u, ABILITY1_ID) > 0 or /*
*/GetUnitAbilityLevel(sd.u, ABILITY2_ID) > 0 or /*
*/GetUnitAbilityLevel(sd.u, ABILITY3_ID) > 0) then
if(GetUnitAbilityLevel(sd.u, ABILITY1_ID) > 0) then
call SetUnitState(sd.u, UNIT_STATE_MANA, GetUnitState(sd.u, UNIT_STATE_MANA) + sd.m * 3)
endif
if(GetUnitAbilityLevel(sd.u, ABILITY2_ID) > 0) then
call SetUnitState(sd.u, UNIT_STATE_MANA, GetUnitState(sd.u, UNIT_STATE_MANA) + sd.m * 2)
endif
if(GetUnitAbilityLevel(sd.u, ABILITY3_ID) > 0) then
call SetUnitState(sd.u, UNIT_STATE_MANA, GetUnitState(sd.u, UNIT_STATE_MANA) + sd.m)
endif
if(sd.f) then
if(sd.fi > 0.0) then
set sd.fi = sd.fi - Interval()
else
if(GetUnitState(sd.u, UNIT_STATE_MANA) >= GetUnitState(sd.u, UNIT_STATE_MAX_MANA)) then
set sd.fi = 1.0
else
set sd.fi = sd.fim
endif
call PointCast(sd.o, GetUnitX(sd.u), GetUnitY(sd.u), 3.0, CAST1_ID, sd.l, "flamestrike", 0, GetUnitX(sd.u), GetUnitY(sd.u))
endif
endif
else
call GroupRemoveUnit(IncinerateAttackUnit, sd.u)
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local BurningOrbs_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real life = GetUnitState(caster, UNIT_STATE_LIFE)
local real maxLife = GetUnitState(caster, UNIT_STATE_MAX_LIFE)
local player owner = GetOwningPlayer(caster)
local integer i = 0
local boolean exist = false
local real item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local real item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local real item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local real item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local real item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local real item6 = IsUnitHasItemType(caster, ITEM2_UPGRADE3)
local real use = Life_Use(level)
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set sd.l = level
set sd.i = Duration(level)
set sd.m = Mana(level) + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
if(item4 > 0) then
set sd.m = sd.m + (UPGRADE2_MANA1 * item4)
endif
if(item5 > 0) then
set sd.m = sd.m + (UPGRADE2_MANA2 * item5)
endif
if(item6 > 0) then
set sd.m = sd.m + (UPGRADE2_MANA2 * item6)
set sd.f = true
set sd.fi = 0.0
set sd.fim = UPGRADE2_FIRE_INTERVAL3
endif
set i = Total
set exist = true
endif
set i = i + 1
endloop
call UnitRemoveAbility(caster, ABILITY1_ID)
call UnitRemoveAbility(caster, ABILITY2_ID)
call UnitRemoveAbility(caster, ABILITY3_ID)
call UnitAddAbility(caster, ABILITY1_ID)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, caster, "head"))
if(item1 > 0) then
set use = use - (UPGRADE1_LIFE1 * item1)
endif
if(item2 > 0) then
set use = use - (UPGRADE1_LIFE2 * item2)
endif
if(item3 > 0) then
set use = use - (UPGRADE1_LIFE3 * item3)
call GroupAddUnit(IncinerateAttackUnit, caster)
endif
if(life > maxLife * use or use <= 0) then
call SetUnitState(caster, UNIT_STATE_LIFE, life - (maxLife * use))
endif
if(not exist) then
set sd = BurningOrbs_Data.create()
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.i = 0.0
set sd.i = Duration(level)
set sd.m = Mana(level) + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
if(item4 > 0) then
set sd.m = sd.m + (UPGRADE2_MANA1 * item4)
endif
if(item5 > 0) then
set sd.m = sd.m + (UPGRADE2_MANA2 * item5)
endif
if(item6 > 0) then
set sd.m = sd.m + (UPGRADE2_MANA2 * item6)
set sd.f = true
set sd.fi = 0.0
set sd.fim = UPGRADE2_FIRE_INTERVAL3
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Attack_Actions takes nothing returns nothing
local unit attacker = GetAttacker()
local player owner = GetOwningPlayer(attacker)
local unit attacked = GetTriggerUnit()
local real attackedX = GetUnitX(attacked)
local real attackedY = GetUnitY(attacked)
call TargetCast(owner, attackedX, attackedY, 1.0, CAST_ID, 1, "lightningshield", 0, attacked)
set attacker = null
set owner = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Attack_Conditions takes nothing returns boolean
local unit attacker = GetAttacker()
local boolean okey = GetUnitAbilityLevel(attacker, SPELL_ID) > 0 and /*
*/IsUnitInGroup(attacker, IncinerateAttackUnit)
set attacker = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(BurningOrbsTrg, EVENT_PLAYER_UNIT_SPELL_FINISH)
call TriggerAddCondition(BurningOrbsTrg, Condition(function Conditions))
call TriggerAddAction(BurningOrbsTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(BurningOrbsAttackTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(BurningOrbsAttackTrg, Condition(function Attack_Conditions))
call TriggerAddAction(BurningOrbsAttackTrg, function Attack_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY1_ID)
call AbilityPreload(ABILITY2_ID)
call AbilityPreload(ABILITY3_ID)
endfunction
endscope
//TESH.scrollpos=265
//TESH.alwaysfold=0
scope Apocalypse initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A04S' //Spell Apocalypse rawcode
private constant integer DUMMY_ID = 'n00R' //Dummy area effect
private constant integer DUMMY1_ID = 'n02L' //Dummy area effect
private constant real DELAY = 2.0 //Delay Apocalypse
private constant real SIZE = 1.5 //Size of warning
private constant real INITIAL_HEIGHT = 1000.0 //Initial height
private constant real HEIGHT_MOVE = 100.0 //Height move
private constant integer ABILITY1_ID = 'Asph' //Ability Burning Orbs (3 Spheres) rawcode
private constant integer ABILITY2_ID = 'A04X' //Ability Burning Orbs (2 Spheres) rawcode
private constant integer ABILITY3_ID = 'A04Y' //Ability Burning Orbs (1 Sphere) rawcode
private constant integer ABILITY4_ID = 'A04V' //Ability Burning Orbs rawcode
private constant integer CAST_ID = 'AHfs' //Cast Burning Land rawcode
private constant string SPELL_EFFECT = "Objects\\Spawnmodels\\Human\\SmallFlameSpawn\\SmallFlameSpawn.mdl" //Spell flame effect
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Other\\Incinerate\\FireLordDeathExplode.mdl" //Spell rain effect
private constant string DAMAGE_EFFECT = "Abilities\\Weapons\\RedDragonBreath\\RedDragonMissile.mdl" //Effect to target
private constant integer ITEM1_UPGRADE = 'gvsm' //Item Chronos the Forbidden
private constant integer ITEM2_UPGRADE1 = 'I01O' //Item Bloodeye Lynch
private constant integer ITEM2_UPGRADE2 = 'I01S' //Item Havocrave Dissever
private constant integer ITEM3_UPGRADE1 = 'bspd' //Item Boots of Speed
private constant integer ITEM3_UPGRADE2 = 'I01T' //Item Sneaker of Exzel
private constant real UPGRADE1_RADIUS = 6000.0 //Upgrade 1 radius area
private constant integer UPGRADE2_FLAME1 = 1 //Upgrade 2 flame count 1
private constant integer UPGRADE2_FLAME2 = 2 //Upgrade 2 flame count 2
private constant real UPGRADE2_FLAME_RADIUS1 = 50.0 //Upgrade 2 radius
private constant real UPGRADE2_FLAME_RADIUS2 = 100.0 //Upgrade 2 radius
private constant real UPGRADE3_DURATION1 = 3.0 //Upgrade 3 duration 1
private constant real UPGRADE3_DURATION2 = 6.0 //Upgrade 3 duration 2
private constant real UPGRADE3_MOVE_DISTANCE2 = 60.0 //Upgrade 3 move distance 2
private constant string UPGRADE_EFFECT = "Abilities\\Spells\\Human\\FlameStrike\\FlameStrike1.mdl" //Upgrade spell flame effect
private constant attacktype A_TYPE = ATTACK_TYPE_CHAOS //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_FIRE //Spell damage type
endglobals
//Damage deal
private function Damage takes integer level returns real
return 20.0 + (20.0 * level)
endfunction
//Radius damage
private function Damage_Radius takes integer level returns real
return 200.0 + (0.0 * level)
endfunction
//Number of flame spawn
private function Number_Flame takes integer level returns integer
return 2 + (3 * level)
endfunction
//Radius of target spell
private function Radius takes integer level returns real
return 600.0 + (0 * level)
endfunction
//Move distance of dummies
private function Move_Distance takes integer level returns real
return 60.0 + (0.0 * level)
endfunction
//Frequency flame
private function Frequency takes integer level returns real
return 0.5 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Apocalypse_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of spell
group gp //Group dummmy
hashtable ht //Hashtable
unit dum //Dummy
boolean b //Spell check channel
integer c //Flame count
real et //Extra time
real w //Time wait to damage
real x //Spell x
real y //Spell y
real m //Distance move
effect array sfx[100] //Effect flame
real array sfxT[100] //Time remain of effect
integer sfxC //Total number of effect
boolean flw //Follow unit
boolean init //Init
real d //Delay for each damage
real r //Spell radius
real dd //Damage dealt
real dr //Damage radius
boolean f //Burning orbs
integer fl //Level of Burning Orbs
boolean up //Spell upgrade
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private Apocalypse_Data array Ar[10]
private integer Total
private group all
private group copy
private boolexpr bexpr
private location target
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Apocalypse_Data sd
local integer i = 0
local integer j = 0
local unit dummy = null
local integer dummyID = 0
local unit f = null
local integer fID = 0
local real fX = 0.0
local real fY = 0.0
local real x = 0.0
local real y = 0.0
local real dx = 0.0
local real dy = 0.0
local real randomAngle = 0.0
local real randomDistance = 0.0
local real height = 0.0
local unit g = null
local boolean once = false
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.b or sd.et > 0.0) then
if(not sd.b) then
set sd.et = sd.et - Interval()
endif
if(sd.d > 0) then
set sd.d = sd.d - Interval()
elseif(not sd.init) then
set sd.init = true
set j = 0
loop
exitwhen(j >= sd.c)
set dummy = CreateUnit(sd.o, DUMMY1_ID, sd.x, sd.y, bj_UNIT_FACING)
set dummyID = GetUnitUserData(dummy)
call GroupAddUnit(sd.gp, dummy)
//call SetUnitAnimation(dummy, "birth")
call SaveBoolean(sd.ht, dummyID, 0, false)
call SaveInteger(sd.ht, dummyID, 1, j + 1)
call SaveInteger(sd.ht, dummyID, 2, j + 1)
call SaveReal(sd.ht, dummyID, 3, INITIAL_HEIGHT)
call UnitAddAbility(dummy, 'Arav')
call UnitRemoveAbility(dummy, 'Arav')
call SetUnitPathing(dummy, false)
call SetUnitFlyHeight(dummy, INITIAL_HEIGHT, 0.0)
//call SetUnitPathing(dummy, false)
//call UnitAddAbility(dummy, 'Arav')
//call UnitRemoveAbility(dummy, 'Arav')
set dummy = null
set j = j + 1
endloop
elseif(sd.w > 0) then
set sd.w = sd.w - Interval()
set copy = CopyGroup(sd.gp)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set fID = GetUnitUserData(f)
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set randomAngle = I2R(GetRandomInt(0, 360)) * bj_DEGTORAD
set randomDistance = I2R(GetRandomInt(0, 150))
set height = LoadReal(sd.ht, fID, 3)
set x = fX + sd.m * Cos(randomAngle)
set y = fY + sd.m * Sin(randomAngle)
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
call SetUnitPosition(f, x, y)
endif
call SetUnitFlyHeight(f, height - HEIGHT_MOVE, 0.0)
call SaveReal(sd.ht, fID, 3, height - HEIGHT_MOVE)
if(sd.flw) then
call GroupEnumUnitsInRange(all, fX, fY, sd.dr, bexpr)
set once = true
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
if(once and g != sd.u and (not IsUnitDead(g))) then
call SetUnitPosition(f, GetUnitX(g) + randomDistance * Cos(randomAngle), GetUnitY(g) + randomDistance * Sin(randomAngle))
//call SetUnitX(f, GetUnitX(g) + randomDistance * Cos(randomAngle))
//call SetUnitY(f, GetUnitY(g) + randomDistance * Sin(randomAngle))
set once = false
endif
endloop
endif
set dx = GetUnitX(f) - sd.x
set dy = GetUnitY(f) - sd.y
if(SquareRoot(dx * dx + dy * dy) > sd.r) then
//call SetUnitX(f, fX)
//call SetUnitY(f, fY)
call SetUnitPosition(f, sd.x, sd.y)
endif
set x = GetUnitX(f)
set y = GetUnitY(f)
if(not LoadBoolean(sd.ht, fID, 0)) then
//call ImmediateEffect(sd.o, x, y, 0.5, CAST_ID, sd.l, "fanofknives", 0)
if(sd.up) then
set sd.sfx[sd.sfxC] = AddSpecialEffect(UPGRADE_EFFECT, x, y)
else
set sd.sfx[sd.sfxC] = AddSpecialEffect(SPELL_EFFECT, x, y)
endif
set sd.sfxT[sd.sfxC] = 3.0
set sd.sfxC = sd.sfxC + 1
call DestroyEffect(AddSpecialEffect(SPECIAL_EFFECT, x, y))
call HitTree(x, y, sd.dr, 5.0, 3.0)
call GroupEnumUnitsInRange(all, x, y, sd.dr, bexpr)
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
if (IsUnitEnemy(g, sd.o)) then
call DestroyEffect(AddSpecialEffectTarget(DAMAGE_EFFECT, g, "origin"))
call UnitDamageTarget(sd.u, g, sd.dd, true, true, A_TYPE, D_TYPE, null)
endif
endloop
call SaveBoolean(sd.ht, fID, 0, true)
endif
endloop
else
set sd.w = Frequency(sd.l)
set copy = CopyGroup(sd.gp)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set fID = GetUnitUserData(f)
set x = GetUnitX(f)
set y = GetUnitY(f)
call SetUnitFlyHeight(dummy, INITIAL_HEIGHT, 0.0)
if(sd.f and LoadInteger(sd.ht, fID, 1) == 0) then
call PointCast(sd.o, x, y, 3.0, CAST_ID, sd.fl, "flamestrike", 0, x, y)
call SaveInteger(sd.ht, fID, 1, LoadInteger(sd.ht, fID, 2))
endif
call SaveBoolean(sd.ht, fID, 0, false)
call SaveReal(sd.ht, fID, 3, INITIAL_HEIGHT)
if(sd.f) then
call SaveInteger(sd.ht, fID, 1, LoadInteger(sd.ht, fID, 1) - 1)
endif
endloop
endif
set j = 0
loop
exitwhen(j >= sd.sfxC)
if(sd.sfxT[j] > 0) then
set sd.sfxT[j] = sd.sfxT[j] - Interval()
else
call DestroyEffect(sd.sfx[j])
set sd.sfx[j] = null
set sd.sfx[j] = sd.sfx[sd.sfxC - 1]
set sd.sfxT[j] = sd.sfxT[sd.sfxC - 1]
set sd.sfxC = sd.sfxC - 1
set j = j - 1
endif
set j = j + 1
endloop
else
call RemoveUnit(sd.dum)
loop
set f = FirstOfGroup(sd.gp)
exitwhen(f == null)
call GroupRemoveUnit(sd.gp, f)
call FlushChildHashtable(sd.ht, GetUnitUserData(f))
call RemoveUnit(f)
endloop
set j = 0
loop
exitwhen(j >= sd.sfxC)
call DestroyEffect(sd.sfx[j])
set sd.sfx[j] = null
set j = j + 1
endloop
set sd.u = null
set sd.o = null
set sd.dum = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set dummy = null
set f = null
set g = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Apocalypse_Data sd
local unit caster = GetTriggerUnit()
local player owner = GetOwningPlayer(caster)
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
//local integer charge = GetPlayerState(owner, PLAYER_STATE_RESOURCE_FOOD_USED)
//local integer chargeLevel = LoadInteger(Heroes_Ht, casterID, HEROES_SPECIALTY_KEY)
local boolean isNull = Ar[Total] == null
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
local integer item2 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item3 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item4 = IsUnitHasItemType(caster, ITEM3_UPGRADE1)
local integer item5 = IsUnitHasItemType(caster, ITEM3_UPGRADE2)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_PM_Apocalypse
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
set target = GetSpellTargetLoc()
//call SaveInteger(Pyroht, casterID, 1, 1)
if(isNull) then
set sd = Apocalypse_Data.create()
set sd.gp = CreateGroup()
set sd.ht = InitHashtable()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.b = true
set sd.et = 0.0
set sd.c = Number_Flame(level)
set sd.w = 0.0
set sd.x = GetLocationX(target)
set sd.y = GetLocationY(target)
set sd.m = Move_Distance(level)
set sd.sfxC = 0
set sd.flw = true
set sd.init = false
set sd.d = DELAY
set sd.r = Radius(level)
set sd.dr = Damage_Radius(level)
set sd.dd = Damage(level)
set sd.dd = sd.dd + (sd.dd * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.f = false
set sd.fl = GetUnitAbilityLevel(caster, ABILITY4_ID)
set sd.up = false
set sd.dum = CreateUnit(owner, DUMMY_ID, sd.x, sd.y, GetUnitFacing(caster))
call SetUnitScale(sd.dum, SIZE, SIZE, 0.0)
call SetUnitAnimation(sd.dum, "birth")
call UnitAddAbility(sd.dum, 'Arav')
call UnitRemoveAbility(sd.dum, 'Arav')
call SetUnitPathing(sd.dum, false)
call SetUnitX(sd.dum, sd.x)
call SetUnitY(sd.dum, sd.y)
if(item1 > 0) then
set sd.r = sd.r + UPGRADE1_RADIUS
set sd.d = sd.d - 1.0
endif
if(item2 > 0) then
set sd.c = sd.c + (UPGRADE2_FLAME1 * item2)
set sd.dr = sd.dr + UPGRADE2_FLAME_RADIUS1
endif
if(item3 > 0) then
set sd.c = sd.c + (UPGRADE2_FLAME2 * item3)
set sd.dr = sd.dr + UPGRADE2_FLAME_RADIUS2
set sd.up = true
endif
if(item4 > 0) then
set sd.et = sd.et + (UPGRADE3_DURATION1 * item4)
endif
if(item5 > 0) then
set sd.et = sd.et + (UPGRADE3_DURATION2 * item5)
set sd.m = sd.m + (UPGRADE3_MOVE_DISTANCE2)
set sd.up = true
endif
//if(charge > 2) then
//call UnitRemoveAbility(caster, SPHERE3_ID)
//set charge = charge - 3
//call SetPlayerState(owner, PLAYER_STATE_RESOURCE_FOOD_USED, charge)
//set sd.f = true
//set sd.fl = chargeLevel
//endif
if(GetUnitAbilityLevel(caster, ABILITY1_ID) > 0) then
set sd.f = true
call UnitRemoveAbility(caster, ABILITY1_ID)
endif
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set owner = null
set s = null
endfunction
//----------------------------------------------------------------
private function Stop_Actions takes nothing returns nothing
local Apocalypse_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == GetTriggerUnit()) then
set sd.b = false
endif
set i = i + 1
endloop
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(ApocalypseTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(ApocalypseTrg, Condition(function Conditions))
call TriggerAddAction(ApocalypseTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(ApocalypseStopTrg, EVENT_PLAYER_UNIT_SPELL_ENDCAST)
call TriggerAddCondition(ApocalypseStopTrg, Condition(function Conditions))
call TriggerAddAction(ApocalypseStopTrg, function Stop_Actions)
//Setting globals
set all = CreateGroup()
set copy = CreateGroup()
set Tim = CreateTimer()
set Total = 0
set bexpr = Condition(function Pick)
set target = Location(0, 0)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY1_ID)
call AbilityPreload(ABILITY2_ID)
call AbilityPreload(ABILITY3_ID)
call AbilityPreload(ABILITY4_ID)
call AbilityPreload(CAST_ID)
call Preload(SPELL_EFFECT)
call Preload(DAMAGE_EFFECT)
call Preload(UPGRADE_EFFECT)
endfunction
endscope
//TESH.scrollpos=17
//TESH.alwaysfold=0
globals
group TorridStingCaster = CreateGroup()
endglobals
scope TorridSting initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A05A' //Spell Torrid Sting rawcode
private constant integer ABILITY_ID = 'AEim' //Spell Supreme rawcode
private constant integer BUFF_ID = 'BEim' //Buff Supreme rawcode
private constant integer DUMMY_ID = 'n02P' //Dummy Archslayer rawcode
private constant integer ANIME = 8 //Animation Attack Sting index
private constant real UPGRADE_DURATION_ANIMATE = 1.0 //Duration animation
private constant integer ITEM1_UPGRADE1 = 'ratc' //Item Ironcraft Sword
private constant integer ITEM1_UPGRADE2 = 'I00P' //Item Razorpoint Blade
private constant integer ITEM1_UPGRADE3 = 'I002' //Item Amazon Meld
private constant integer ITEM2_UPGRADE1 = 'lhst' //Item Shogun's Pride
private constant integer ITEM2_UPGRADE2 = 'I00W' //Item Atlantic Darktrident
private constant integer ITEM3_UPGRADE1 = 'spsh' //Item Dream Sphere
private constant integer ITEM3_UPGRADE2 = 'I009' //Item Prime Lucent
private constant integer SUPREME_ITEM1_UPGRADE1 = 'I00N' //Item Mortise Timbercutter
private constant integer SUPREME_ITEM1_UPGRADE2 = 'mlst' //Item Vehemence
private constant integer SUPREME_ITEM1_UPGRADE3 = 'I00O' //Item Arcanite Reaver
private constant real UPGRADE1_DISTANCE1 = 200.0 //Upgrade 1 effect
private constant real UPGRADE1_DISTANCE2 = 400.0 //Upgrade 1 effect
private constant real UPGRADE1_DISTANCE3 = 600.0 //Upgrade 1 effect
private constant real UPGRADE1_DAMAGE3 = 30.0 //Upgrade 1 effect
private constant real UPGRADE2_KNOCKBACK_DURATION1 = 1.0 //Upgrade 2 effect 1
private constant real UPGRADE2_KNOCKBACK_DURATION2 = 2.0 //Upgrade 2 effect 2
private constant real UPGRADE2_DAMAGE2 = 30.0 //Upgrade 1 effect
private constant real UPGRADE3_INTERVAL_MAX = 2.0 //Interval cast
private constant integer UPGRADE3_MULTIPLE1 = 1 //Upgrade 1 effect 1
private constant integer UPGRADE3_MULTIPLE2 = 2 //Upgrade 1 effect 2
private constant real SUPREME_UPGRADE1_DAMAGE_PERCENT1 = 0.01 //Supreme upgrade 1 effect 1
private constant real SUPREME_UPGRADE1_DAMAGE_PERCENT2 = 0.02 //Supreme upgrade 1 effect 1
private constant real SUPREME_UPGRADE1_DAMAGE_PERCENT3 = 0.04 //Supreme upgrade 1 effect 1
private constant string SPELL_EFFECT = "Abilities\\Spells\\Orc\\Shockwave\\ShockwaveMissile.mdl" //Spell effect
private constant attacktype A_TYPE = ATTACK_TYPE_PIERCE //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_ENHANCED //Spell damage type
endglobals
//Damage deal
private function Damage takes integer level returns real
if(level == 1) then
return 80.0
elseif(level == 2) then
return 150.0
elseif(level == 3) then
return 210.0
elseif(level == 4) then
return 300.0
else
return 0.0
endif
endfunction
//Radius of damage
private function Radius takes integer level returns real
return 300.0 + (0.0 * level)
endfunction
//Distance
private function Distance takes integer level returns real
return 900.0 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_FLYING) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct TorridSting_Data
unit u //Unit caster
integer uId //Caster id
player o //Owner of caster
group g //Group target
real i //Interval wait
real x //Position x
real y //Position y
boolean t //Init pause
real f //Facing rad
real cos //Cos of angle
real sin //Sin of angle
real d //Distance
real dm //Distance move per interval
real b //Backward
real kb //Knockback
real dd //Damage deal
real r //Radius damage
effect e //Effect blade
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private TorridSting_Data array Ar[100]
private group all
private boolexpr bexpr
private location loc
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local TorridSting_Data sd
local integer i = 0
local unit f = null
local real fAngle = 0.0
local real x = 0.0
local real y = 0.0
local sound s = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if((IsUnitDead(sd.u))) then
set sd.d = 0
set sd.i = 0
endif
if(sd.i > 0) then
set sd.i = sd.i - Interval()
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
set x = x - sd.b * sd.cos
set y = y - sd.b * sd.sin
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
call SetUnitX(sd.u, x)
call SetUnitY(sd.u, y)
else
set sd.i = 0
endif
elseif(not sd.t) then
call SetUnitTimeScale(sd.u, 0.0)
set sd.t = true
set s = LoadSoundHandle(Heroes_Ht, sd.uId, HERO_SOUND_KEY)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_AS_TorridSting
call AttachSoundToUnit(s, sd.u)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, sd.uId, HERO_SOUND_KEY, s)
elseif(sd.d > 0) then
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
set x = x + sd.dm * sd.cos
set y = y + sd.dm * sd.sin
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
if(sd.kb > 0.0) then
set fAngle = sd.f * bj_RADTODEG
call Knockback(f, sd.dm, fAngle, sd.kb)
endif
endif
endloop
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0)) and (not IsBarrel(sd.u, x, y, 100.0))) then
call SetUnitX(sd.u, x)
call SetUnitY(sd.u, y)
else
set sd.d = 0
endif
set sd.d = sd.d - sd.dm
else
call PauseUnit(sd.u, false)
call SetUnitTimeScale(sd.u, 1.0)
call SetUnitPathing(sd.u, true)
call Pather(sd.u, 1.0)
call GroupRemoveUnit(TorridStingCaster, sd.u)
//call DestroyEffect(sd.e)
//set sd.e = null
if((not IsUnitDead(sd.u))) then
call QueueUnitAnimation(sd.u, "stand")
endif
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
if(GetUnitTypeId(sd.u) == DUMMY_ID) then
call RemoveUnit(sd.u)
endif
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
set s = null
endfunction
//----------------------------------------------------------------
private function Register_TorridSting takes unit u, integer level, player o, real rad, real damage, real distance, real knockback returns nothing
local TorridSting_Data sd
local real uX = GetUnitX(u)
local real uY = GetUnitY(u)
local boolean isNull = (Ar[Total] == null)
if(isNull) then
set sd = TorridSting_Data.create()
set sd.g = CreateGroup()
else
set sd = Ar[Total]
endif
set sd.u = u
set sd.uId = GetUnitUserData(u)
set sd.o = o
set sd.i = 0.2
set sd.t = false
set sd.f = rad
set sd.cos = Cos(rad)
set sd.sin = Sin(rad)
set sd.d = distance
set sd.kb = knockback
set sd.dm = (sd.d * 2) / ((sd.i) / Interval())
set sd.b = 40.0//sd.d / 20
set sd.dd = damage
set sd.r = Radius(level)
set sd.e = null
call SetUnitTimeScale(u, 2.0)
call PauseUnit(u, true)
call SetUnitPathing(u, false)
call SetUnitAnimationByIndex(u, ANIME)
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set u = null
set o = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local TorridSting_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local real targetX = 0.0
local real targetY = 0.0
local real rad = 0.0
local player owner = GetOwningPlayer(caster)
local integer i = 0
local boolean isNull = (Ar[Total] == null)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item6 = IsUnitHasItemType(caster, ITEM3_UPGRADE1)
local integer item7 = IsUnitHasItemType(caster, ITEM3_UPGRADE2)
local boolean allowMultiple = false
local integer multiple = 0
local real interval = 0.0
local real damage = 0.0
local real distance = 0.0
local real knockback = 0.0
local unit dummy = null
local integer item8 = IsUnitHasItemType(caster, SUPREME_ITEM1_UPGRADE1)
local integer item9 = IsUnitHasItemType(caster, SUPREME_ITEM1_UPGRADE2)
local integer item10 = IsUnitHasItemType(caster, SUPREME_ITEM1_UPGRADE3)
local integer supremeLevel = GetUnitAbilityLevel(caster, ABILITY_ID)
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
set rad = Atan2(targetY - casterY, targetX - casterX)
if(isNull) then
set sd = TorridSting_Data.create()
set sd.g = CreateGroup()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.uId = casterID
set sd.o = owner
set sd.i = 0.2
set sd.t = false
set sd.f = rad
set sd.cos = Cos(rad)
set sd.sin = Sin(rad)
set sd.d = Distance(level)
set sd.kb = 0.0
if(item1 > 0) then
set sd.d = sd.d + UPGRADE1_DISTANCE1
endif
if(item2 > 0) then
set sd.d = sd.d + UPGRADE1_DISTANCE2
endif
if(item3 > 0) then
set sd.d = sd.d + UPGRADE1_DISTANCE3
endif
set sd.dm = (sd.d * 2) / ((sd.i) / Interval())
set sd.b = 40.0//sd.d / 20
set sd.dd = Damage(level)
set sd.dd = sd.dd //+ (sd.dd * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.r = Radius(level)
set sd.e = null
//set sd.e = AddSpecialEffectTarget(SPELL_EFFECT, caster, "weapon")
if(item3 > 0) then
set sd.dd = sd.dd + UPGRADE1_DAMAGE3
endif
if(item4 > 0) then
set sd.kb = UPGRADE2_KNOCKBACK_DURATION1
endif
if(item5 > 0) then
set sd.kb = UPGRADE2_KNOCKBACK_DURATION2
set sd.dd = sd.dd + UPGRADE2_DAMAGE2
endif
call SetUnitTimeScale(sd.u, 2.0)
call PauseUnit(caster, true)
call SetUnitPathing(caster, false)
call SetUnitAnimationByIndex(caster, ANIME)
call GroupAddUnit(TorridStingCaster, caster)
set damage = sd.dd
set distance = sd.d
set knockback = sd.kb
if(GetUnitAbilityLevel(caster, BUFF_ID) > 0) then
if(item8 > 0) then
set sd.dd = sd.dd + sd.dd * SUPREME_UPGRADE1_DAMAGE_PERCENT1 * supremeLevel * item8
endif
if(item9 > 0) then
set sd.dd = sd.dd + sd.dd * SUPREME_UPGRADE1_DAMAGE_PERCENT2 * supremeLevel * 3 * item9
endif
if(item10 > 0) then
set sd.dd = sd.dd + sd.dd * SUPREME_UPGRADE1_DAMAGE_PERCENT3 * supremeLevel * 4 * item10
endif
endif
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
if(item6 > 0) then
set allowMultiple = true
set multiple = multiple + (UPGRADE3_MULTIPLE1 * item6)
endif
if(item7 > 0) then
set allowMultiple = true
set multiple = multiple + (UPGRADE3_MULTIPLE2 * item7)
endif
if(allowMultiple) then
set interval = UPGRADE3_INTERVAL_MAX / multiple
set i = 0
loop
exitwhen(i > multiple)
call TriggerSleepAction(interval)
set dummy = CreateUnit(owner, DUMMY_ID, casterX, casterY, rad * bj_RADTODEG)
call SetUnitVertexColor(dummy, 255, 255, 255, 150)
call Register_TorridSting(dummy, level, owner, rad, damage/2, distance, knockback)
set i = i + 1
endloop
endif
set caster = null
set owner = null
set dummy = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return (GetSpellAbilityId() == SPELL_ID)
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(TorridStingTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(TorridStingTrg, Condition(function Conditions))
call TriggerAddAction(TorridStingTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
set loc = Location(0, 0)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=66
//TESH.alwaysfold=0
scope Supreme initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'AEim' //Spell Supreme rawcode
private constant integer BUFF_ID = 'BEim' //Buff Supreme rawcode
private constant integer ABILITY_ID = 'ACac' //Ability Supreme (Dummy) rawcode
private constant integer ABILITY1_ID = 'A05B' //Ability Supreme (Hide Icon) rawcode
private constant integer ITEM1_UPGRADE1 = 'I01Z' //Item Zestflux
private constant integer ITEM1_UPGRADE2 = 'rst1' //Item Veteran Smoke Pipe
private constant integer UPGRADE1_MANA1 = 1 //Upgrade 1 mana usage decrease 1
private constant integer UPGRADE1_MANA2 = 2 //Upgrade 1 mana usage decrease 2
private constant integer UPGRADE1_LEVEL = 3 //Upgrade 1 effect
endglobals
//Interval
private function Interval takes nothing returns real
return 0.5
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Supreme_Data
unit u //Unit caster
real i //Interval
real im //Interval max
integer m //Mana usage decrease
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Supreme_Data array Ar[10]
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Supreme_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(GetUnitAbilityLevel(sd.u, BUFF_ID) > 0) then
if(sd.m > 0) then
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
call SetUnitState(sd.u, UNIT_STATE_MANA, GetUnitState(sd.u, UNIT_STATE_MANA) + sd.m)
endif
endif
else
call UnitRemoveAbility(sd.u, ABILITY1_ID)
set sd.u = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Supreme_Data sd = Supreme_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
set sd.u = caster
set sd.i = 0.0
set sd.im = 1.0
set sd.m = 0
call UnitAddAbility(caster, ABILITY1_ID)
call SetPlayerAbilityAvailable(owner, ABILITY1_ID, false)
if(item1 > 0) then
set sd.m = sd.m + (UPGRADE1_MANA1 * item1)
endif
if(item2 > 0) then
set sd.m = sd.m + (UPGRADE1_MANA2 * item2)
call SetUnitAbilityLevel(caster, ABILITY_ID, level + 3)
else
call SetUnitAbilityLevel(caster, ABILITY_ID, level)
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(SupremeTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(SupremeTrg, Condition(function Conditions))
call TriggerAddAction(SupremeTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY_ID)
call AbilityPreload(ABILITY1_ID)
endfunction
endscope
//TESH.scrollpos=15
//TESH.alwaysfold=0
scope FatalStrike initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A056' //Spell Fatal Strike rawcode
private constant integer CAST_ID = 'A057' //Ability Fatal Strike (Attack) rawcode
private constant integer BUFF_ID = 'B01Q' //Buff Fatal Strike (Attack) rawcode
private constant integer BUFF1_ID = 'BEim' //Buff Supreme rawcode
private constant integer DUMMY_ID = 'n02P' //Dummy Archslayer rawcode
private constant integer ATTACK_ANIME = 3 //Attack anime
private constant integer ITEM1_UPGRADE1 = 'gcel' //Item Gauntlet of Brawler
private constant integer ITEM1_UPGRADE2 = 'I008' //Item Mania Cestus
private constant integer ITEM1_UPGRADE3 = 'I011' //Item Fist of Firebringer
private constant integer ITEM2_UPGRADE1 = 'I01A' //Item Fatal Cleaver
private constant integer ITEM2_UPGRADE2 = 'I01C' //Item Sagaris Carnage
private constant integer ITEM3_UPGRADE1 = 'I018' //Item Porthole Jumper
private constant real UPGRADE1_DAMAGE_MULTIPLY1 = 0.15 //Upgrade 1 effect 1
private constant real UPGRADE1_DAMAGE_MULTIPLY2 = 0.25 //Upgrade 1 effect 2
private constant real UPGRADE1_DAMAGE_MULTIPLY3 = 0.5 //Upgrade 1 effect 3
private constant real UPGRADE2_DISTANCE_MOVE1 = 12.5 //Upgrade 1 distance move 2
private constant real UPGRADE2_DISTANCE_MOVE2 = 25.0 //Upgrade 1 distance move 3
private constant real UPGRADE2_DISTANCE1 = 50.0 //Upgrade 2 distance 2
private constant real UPGRADE2_DISTANCE2 = 100.0 //Upgrade 2 distance 3
private constant real UPGRADE3_INTERVAL_MAX = 1.0 //Interval of restrike
private constant integer UPGRADE3_STRIKE1 = 1 //Upgrade 3 restrike 1
private constant attacktype A_TYPE = ATTACK_TYPE_HERO //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_ENHANCED //Spell damage type
endglobals
//Percentage to sting
private function Attack_Count takes integer level returns integer
return 5 - (1 * level)
endfunction
//Distance
private function Distance takes integer level returns real
return 200.0 + (0 * level)
endfunction
//Damage time
private function Damage_Multiply takes integer level returns real
return 1.25 + (0.25 * level)
endfunction
//Radius of damage
private function Radius takes integer level returns real
return 90.0 + (0 * level)
endfunction
//Targets affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_FLYING) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Fatal_Data
unit u //Unit attacker
integer c //Count
integer cm //Max count
endstruct
//----------------------------------------------------------------
struct FatalStrike_Data
unit u //Unit attacker
integer aID //Attacker ID
player o //Owner of attacker
group g //Group target
unit t //Unit target
real aX //Attacker x
real aY //Attacker y
real cos //Cos of angle
real sin //Sin of angle
real ds //Distance travel
real dm //Distance travel per interval
real md //Max distance
boolean e //End
real dd //Damage deal
real rd //Radius of damage
integer r //Repeat
integer m //Mode
unit dum //Dummy
real f //Face
real oX //Original x
real oY //Original y
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private integer Total2
private Fatal_Data array Ar[100]
private FatalStrike_Data array Ar2[100]
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local FatalStrike_Data sd
local integer i = 0
local unit f = null
loop
exitwhen(i >= Total2)
set sd = Ar2[i]
if((not sd.e) and sd.ds > 0 and (not IsUnitDead(sd.u))) then
set sd.ds = sd.ds - sd.dm
set sd.aX = GetUnitX(sd.u) + sd.dm * sd.cos
set sd.aY = GetUnitY(sd.u) + sd.dm * sd.sin
if(sd.aX > WorldBounds.minX + 300.0 and /*
*/sd.aX < WorldBounds.maxX - 300.0 and /*
*/sd.aY > WorldBounds.minY + 300.0 and /*
*/sd.aY < WorldBounds.maxY - 300.0 and (not IsWall(sd.aX, sd.aY, 100.0))) then
//call SetUnitPosition(sd.u, sd.aX, sd.aY)
call SetUnitX(sd.u, sd.aX)
call SetUnitY(sd.u, sd.aY)
endif
call GroupEnumUnitsInRange(all, sd.aX, sd.aY, sd.rd, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o) and (not IsUnitInGroup(f, sd.g))) then
call GroupAddUnit(sd.g, f)
call UnitDamageTarget(sd.u, f, sd.dd, false, false, A_TYPE, D_TYPE, null)
endif
endloop
elseif(not sd.e) then
call SetUnitTimeScale(sd.u, 1)
call SetUnitPathing(sd.u, true)
if(IsUnitInGroup(sd.u, ZealousCaster)) then
call IssueTargetOrder(sd.u, "attack", sd.t)
endif
call Pather(sd.u, 1.0)
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
set sd.e = true
elseif(sd.r > 0) then
if(sd.m == 0) then
set sd.dum = CreateUnit(sd.o, DUMMY_ID, sd.oX, sd.oY, sd.f)
call SetUnitVertexColor(sd.dum, 255, 255, 255, 150)
call SetUnitTimeScale(sd.dum, 3)
call SetUnitAnimationByIndex(sd.dum, ATTACK_ANIME)
call SetUnitPathing(sd.dum, false)
set sd.ds = sd.md
set sd.m = 1
elseif(sd.m == 1) then
if(sd.ds > 0.0) then
set sd.ds = sd.ds - sd.dm
set sd.aX = GetUnitX(sd.dum) + sd.dm * sd.cos
set sd.aY = GetUnitY(sd.dum) + sd.dm * sd.sin
if(sd.aX > WorldBounds.minX + 300.0 and /*
*/sd.aX < WorldBounds.maxX - 300.0 and /*
*/sd.aY > WorldBounds.minY + 300.0 and /*
*/sd.aY < WorldBounds.maxY - 300.0 and (not IsWall(sd.aX, sd.aY, 100.0))) then
//call SetUnitPosition(sd.u, sd.aX, sd.aY)
call SetUnitX(sd.dum, sd.aX)
call SetUnitY(sd.dum, sd.aY)
endif
call GroupEnumUnitsInRange(all, sd.aX, sd.aY, sd.rd, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o) and (not IsUnitInGroup(f, sd.g))) then
call GroupAddUnit(sd.g, f)
call UnitDamageTarget(sd.u, f, sd.dd/2, false, false, A_TYPE, D_TYPE, null)
endif
endloop
else
set sd.r = sd.r - 1
set sd.m = 0
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
call RemoveUnit(sd.dum)
set sd.dum = null
endif
endif
else
set sd.u = null
set sd.o = null
set sd.t = null
set sd.dum = null
set Ar2[i] = Ar2[Total2 - 1]
set Ar2[Total2 - 1] = sd
set Total2 = Total2 - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total2 == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Attack_Actions takes nothing returns nothing
local unit attacker = GetAttacker()
local integer attackerID = GetUnitUserData(attacker)
local integer attackerType = GetUnitTypeId(attacker)
local player owner = GetOwningPlayer(attacker)
local real attackerX = GetUnitX(attacker)
local real attackerY = GetUnitY(attacker)
local unit attacked = GetTriggerUnit()
local real attackedX = GetUnitX(attacked)
local real attackedY = GetUnitY(attacked)
local integer level = GetUnitAbilityLevel(attacker, SPELL_ID)
local FatalStrike_Data sd
local integer i = 0
local boolean exist = false
loop
exitwhen(i >= Total2)
set sd = Ar2[i]
if(sd.u == attacker and (not exist)) then
set exist = true
set i = Total2
endif
set i = i + 1
endloop
if(not exist) then
call TargetCast(owner, attackedX, attackedY, 0.5, CAST_ID, 1, "curse", 0, attacked)
endif
set attacker = null
set owner = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Attack_Conditions takes nothing returns boolean
local unit attacker = GetAttacker()
local boolean okey = GetUnitAbilityLevel(attacker, SPELL_ID) > 0
set attacker = null
return okey
endfunction
//----------------------------------------------------------------
function FatalStrike_onDamage takes unit attacker, unit attacked, real amount returns nothing
local FatalStrike_Data sd
local integer level = GetUnitAbilityLevel(attacker, SPELL_ID)
local integer attackerID = GetUnitUserData(attacker)
local real attackerX = GetUnitX(attacker)
local real attackerY = GetUnitY(attacker)
local player owner = GetOwningPlayer(attacker)
local real angle = 0.0
local boolean isNull = (Ar2[Total2] == null)
local boolean okey = false
local Fatal_Data fd
local integer i = 0
local real multiply = 0.0
local integer item1 = IsUnitHasItemType(attacker, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(attacker, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(attacker, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(attacker, ITEM2_UPGRADE1)
local integer item5 = IsUnitHasItemType(attacker, ITEM2_UPGRADE2)
local integer item6 = IsUnitHasItemType(attacker, ITEM3_UPGRADE1)
call UnitRemoveAbility(attacked, BUFF_ID)
if(GetUnitAbilityLevel(attacker, BUFF1_ID) > 0) then
set okey = true
endif
set i = 0
loop
exitwhen(i >= Total)
set fd = Ar[i]
if(fd.u == attacker) then
if(fd.c < fd.cm and (not okey)) then
set fd.c = fd.c + 1
else
set fd.c = 0
set okey = true
endif
endif
set i = i + 1
endloop
if(okey) then
if(isNull) then
set sd = FatalStrike_Data.create()
set sd.g = CreateGroup()
else
set sd = Ar2[Total2]
endif
set sd.u = attacker
set sd.aID = attackerID
set sd.o = owner
set sd.t = attacked
set sd.aX = attackerX
set sd.aY = attackerY
set angle = Atan2(GetUnitY(attacked) - sd.aY, GetUnitX(attacked) - sd.aX)
set sd.cos = Cos(angle)
set sd.sin = Sin(angle)
set sd.ds = Distance(level)
set sd.dm = 50
set sd.e = false
set multiply = Damage_Multiply(level)
if(item1 > 0) then
set multiply = multiply + (UPGRADE1_DAMAGE_MULTIPLY1 * item1)
endif
if(item2 > 0) then
set multiply = multiply + (UPGRADE1_DAMAGE_MULTIPLY2 * item2)
endif
if(item3 > 0) then
set multiply = multiply + (UPGRADE1_DAMAGE_MULTIPLY3 * item3)
endif
if(item4 > 0) then
set sd.ds = sd.ds + (UPGRADE2_DISTANCE1 * item4)
set sd.dm = sd.dm + (UPGRADE2_DISTANCE_MOVE1 * item4)
endif
if(item5 > 0) then
set sd.ds = sd.ds + (UPGRADE2_DISTANCE2 * item5)
set sd.dm = sd.dm + (UPGRADE2_DISTANCE_MOVE2 * item5)
endif
set sd.md = sd.ds
set sd.dd = amount * multiply
set sd.dd = sd.dd
set sd.rd = Radius(level)
set sd.oX = attackerX
set sd.oY = attackerY
set sd.f = angle * bj_RADTODEG
set sd.m = 0
set sd.dum = null
set sd.r = 0
if(item6 > 0) then
set sd.r = sd.r + (UPGRADE3_STRIKE1 * item6)
endif
if(isNull) then
if(Total2 <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = sd
else
if(Total2 <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total2 = Total2 + 1
endif
call SetUnitTimeScale(attacker, 3)
call SetUnitAnimationByIndex(attacker, ATTACK_ANIME)
call SetUnitPathing(attacker, false)
endif
set attacker = null
set attacked = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local unit learner = GetLearningUnit()
local integer learnerType = GetUnitTypeId(learner)
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
local Fatal_Data fd
local integer i = 0
local boolean exist = false
if(GetUnitAbilityLevel(learner, SPELL_ID) <= 1) then
set i = 0
loop
exitwhen(i >= Total)
set fd = Ar[i]
if(fd.u == learner) then
set exist = true
set fd.cm = Attack_Count(level)
endif
set i = i + 1
endloop
if(not exist) then
set fd = Fatal_Data.create()
set fd.u = learner
set fd.c = 0
set fd.cm = Attack_Count(level)
set Total = Total + 1
set Ar[Total - 1] = fd
endif
else
set i = 0
loop
exitwhen(i >= Total)
set fd = Ar[i]
if(fd.u == learner) then
set fd.cm = Attack_Count(level)
endif
set i = i + 1
endloop
endif
set learner = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
local unit learner = GetTriggerUnit()
local boolean okey = (GetLearnedSkill() == SPELL_ID) and (not IsUnitIllusion(GetTriggerUnit()))
set learner = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(FatalStrikeAttackTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(FatalStrikeAttackTrg, Condition(function Attack_Conditions))
call TriggerAddAction(FatalStrikeAttackTrg, function Attack_Actions)
call TriggerRegisterAnyUnitEventBJ(FatalStrikeLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(FatalStrikeLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(FatalStrikeLearnTrg, function Learn_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set Total2 = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
globals
group ZealousCaster = CreateGroup()
endglobals
scope Zealous initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A058' //Spell Zealous rawcode
private constant integer ABILITY_ID = 'A059' //Ability Zealous (Dummy) rawcode
private constant real INTERVAL_MOVE = 0.24 //Interval in second of move
private constant real DISTANCE_TO_TARGET = 60.0 //Move to distance from target
private constant real TIMER_END = 2.0 //End cast
private constant integer ANIMATE = 4 //Animation index
private constant integer ITEM1_UPGRADE1 = 'I011' //Item Walking Slippers
private constant integer ITEM1_UPGRADE2 = 'I017' //Item Platinum Sprinter
private constant integer ITEM1_UPGRADE3 = 'crdt' //Item Armlet of Insanity
private constant integer ITEM2_UPGRADE1 = 'I01l' //Item Cloak of Shadow
private constant integer ITEM2_UPGRADE2 = 'I01W' //Item Ghost Veil
private constant integer UPGRADE1_COUNTER1 = 1 //Upgrade 1 counter add 1
private constant integer UPGRADE1_COUNTER2 = 2 //Upgrade 1 counter add 2
private constant integer UPGRADE1_COUNTER3 = 3 //Upgrade 1 counter add 3
private constant integer UPGRADE2_MULTIPLE1 = 1 //Upgrade 2 counter multiple 1
private constant integer UPGRADE2_MULTIPLE2 = 1 //Upgrade 2 counter multiple 2
private constant real UPGRADE2_BACKWARD1 = 300.0 //Upgrade 2 backward distance 1
private constant real UPGRADE2_BACKWARD2 = 600.0 //Upgrade 2 backward distance 2
private constant real UPGRADE2_RADIUS1 = 300.0 //Upgrade 2 radius 1
private constant real UPGRADE2_RADIUS2 = 600.0 //Upgrade 2 radius 2
private constant real UPGRADE2_RADIUS_INCREMENT1 = 100.0 //Upgrade 2 radius increment 1
private constant real UPGRADE2_RADIUS_INCREMENT2 = 100.0 //Upgrade 2 radius increment 2
private constant integer UPGRADE2_COUNTER_REFILL1 = 1 //Upgrade 2 counter refill 1
private constant integer UPGRADE2_COUNTER_REFILL2 = 3 //Upgrade 2 counter refill 1
private constant string SPELL_EFFECT = "Abilities\\Spells\\Orc\\MirrorImage\\MirrorImageCaster.mdl" //Move effect
endglobals
//Number of moves
private function Counter takes integer level returns integer
if(level == 1) then
return 4
elseif(level == 2) then
return 5
elseif(level == 3) then
return 7
else
return 0
endif
endfunction
//Targets affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and /*
*/not (GetUnitAbilityLevel(target, 'Aloc') > 0) and /*
*/not (GetUnitAbilityLevel(target, 'Avul') > 0) and /*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Zealous_Data
unit u //Unit caster
player o //Owner of caster
unit t //Unit target
boolean g //Go
real e //Timer end
integer c //Count moves
integer cr //Count refill
real i //Interval between moves
real im //New interval between moves
real r //Area of effec
real cX //Caster x
real cY //Caster y
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Zealous_Data array Ar[10]
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Zealous_Data sd
local integer i = 0
local real angle = 0.0
local real rad = 0.0
local real x = 0.0
local real y = 0.0
local real cX = 0.0
local real cY = 0.0
local real tX = 0.0
local real tY = 0.0
local boolean shift = false
local unit f = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.g) then
if(sd.c > 0) then
if(sd.i > 0) then
set sd.i = sd.i - Interval()
else
if(IsUnitVisible(sd.t, sd.o) and (GetUnitAbilityLevel(sd.t, 'Avul') <= 0)) then
set cX = GetUnitX(sd.u)
set cY = GetUnitY(sd.u)
set tX = GetUnitX(sd.t)
set tY = GetUnitY(sd.t)
set angle = Atan2(tY - cY, tX - cX) * bj_RADTODEG
set rad = (angle + 90.0) * bj_DEGTORAD //(180.0 - GetUnitFacing(sd.u)) * bj_DEGTORAD
set x = tX + DISTANCE_TO_TARGET * Cos(rad)
set y = tY + DISTANCE_TO_TARGET * Sin(rad)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.u, "origin"))
set angle = Atan2(tY - y, tX - x) * bj_RADTODEG
call SetUnitX(sd.u, x)
call SetUnitY(sd.u, y)
call SetUnitFacing(sd.u, angle)
set sd.i = sd.im
if(sd.c / 2 == 0) then
call IssueTargetOrder(sd.u, "attack", sd.t)
endif
else
set shift = false
if(sd.r > 0.0) then
call GroupEnumUnitsInRange(all, GetUnitX(sd.t), GetUnitY(sd.t), sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o) and IsUnitVisible(f, sd.o) and (not shift)) then
set shift = true
set sd.t = f
endif
endloop
endif
if(not shift) then
set sd.c = 0
else
call IssueTargetOrder(sd.u, "attack", sd.t)
set sd.c = sd.c + sd.cr
endif
endif
if(IsUnitDead(sd.t)) then
set shift = false
if(sd.r > 0.0) then
call GroupEnumUnitsInRange(all, GetUnitX(sd.t), GetUnitY(sd.t), sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o) and IsUnitVisible(f, sd.o) and (not shift)) then
set shift = true
set sd.t = f
endif
endloop
endif
if(not shift) then
set sd.c = 0
else
call IssueTargetOrder(sd.u, "attack", sd.t)
set sd.c = sd.c + sd.cr
endif
endif
if(not IsUnitInGroup(sd.u, WhirlingBladeCaster)) then
set sd.c = sd.c - 1
endif
if(IsUnitInGroup(sd.u, TorridStingCaster)) then
set sd.c = 0
endif
endif
else
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.u, "origin"))
call SetUnitPosition(sd.u, sd.cX, sd.cY)
call SetUnitInvulnerable(sd.u, false)
//call SetUnitTimeScale(sd.u, 1.0)
call SetUnitTurnSpeed(sd.u, GetUnitDefaultTurnSpeed(sd.u))
call SetUnitMoveSpeed(sd.u, GetUnitDefaultMoveSpeed(sd.u))
call UnitRemoveAbility(sd.u, ABILITY_ID)
call SetUnitPathing(sd.u, true)
call GroupRemoveUnit(ZealousCaster, sd.u)
set sd.u = null
set sd.o = null
set sd.t = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
else
if(sd.e > 0.0) then
set sd.e = sd.e - Interval()
else
set sd.u = null
set sd.o = null
set sd.t = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Zealous_Data sd = Zealous_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
local unit target = GetSpellTargetUnit()
local boolean isNull = (Ar[Total] == null)
local integer i = 0
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local real distance = 0.0
local real facing = (GetUnitFacing(caster) + 180.0)
local real rad = facing * bj_DEGTORAD
local real x = 0.0
local real y = 0.0
set sd.u = caster
set sd.o = owner
set sd.t = target
set sd.g = false
set sd.e = TIMER_END
set sd.c = Counter(level)
set sd.cr = 0
set sd.i = 0.0
set sd.im = INTERVAL_MOVE
set sd.r = 0.0
set sd.cX = casterX
set sd.cY = casterY
call UnitShareVision(sd.t, sd.o, true)
if(item1 > 0) then
set sd.c = sd.c + (UPGRADE1_COUNTER1 * item1)
endif
if(item2 > 0) then
set sd.c = sd.c + (UPGRADE1_COUNTER2 * item2)
endif
if(item3 > 0) then
set sd.c = sd.c + (UPGRADE1_COUNTER3 * item3)
endif
if(item4 > 0) then
//set sd.c = sd.c * (UPGRADE2_MULTIPLE1 * item4)
set distance = UPGRADE2_BACKWARD1
set sd.r = sd.r + (UPGRADE2_RADIUS1)
if(item4 > 1) then
set sd.r = sd.r + (UPGRADE2_RADIUS_INCREMENT1 * (item4 - 1))
endif
set sd.cr = sd.cr + (UPGRADE2_COUNTER_REFILL1 * item4)
endif
if(item5 > 0) then
//set sd.c = sd.c * (UPGRADE2_MULTIPLE2 * item5)
set distance = UPGRADE2_BACKWARD2
set sd.r = sd.r + (UPGRADE2_RADIUS2)
if(item5 > 1) then
set sd.r = sd.r + (UPGRADE2_RADIUS_INCREMENT2 * (item5 - 1))
endif
set sd.cr = sd.cr + (UPGRADE2_COUNTER_REFILL2 * item5)
endif
if(distance > 0.0) then
set x = casterX + distance * Cos(rad)
set y = casterY + distance * Sin(rad)
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0)) and (not IsBarrel(sd.u, x, y, 100.0))) then
call SetUnitX(caster, x)
call SetUnitY(caster, y)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, caster, "origin"))
//set sd.cX = x
//set sd.cY = y
endif
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set target = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Stop_Actions takes nothing returns nothing
local Zealous_Data sd
local unit caster = GetTriggerUnit()
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set sd.g = true
call UnitShareVision(sd.t, sd.o, false)
call SetUnitInvulnerable(caster, true)
//call SetUnitTimeScale(caster, 4.0)
call SetUnitTurnSpeed(caster, 3.0)
call UnitAddAbility(caster, ABILITY_ID)
call SetUnitMoveSpeed(caster, 1.0)
call UnitAddAbility(caster, 'Arav')
call UnitRemoveAbility(caster, 'Arav')
call SetUnitPathing(caster, false)
call IssueTargetOrder(caster, "attack", sd.t)
call GroupAddUnit(ZealousCaster, caster)
set i = Total
endif
set i = i + 1
endloop
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(ZealousTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(ZealousTrg, Condition(function Conditions))
call TriggerAddAction(ZealousTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(ZealousStopTrg, EVENT_PLAYER_UNIT_SPELL_FINISH)
call TriggerAddCondition(ZealousStopTrg, Condition(function Conditions))
call TriggerAddAction(ZealousStopTrg, function Stop_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=26
//TESH.alwaysfold=0
globals
group WhirlingBladeCaster = CreateGroup()
endglobals
scope WhirlingBlade initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A052' //Spell Whirling Blade rawcode
private constant integer ANIME = 13 //Archslayer spin animation
private constant real DAMAGE_TO_TREES = 1.0 //Damage to trees
private constant real INTERVAL = 2.0 //Interval between whirls
private constant real DISTANCE_OFFSET = 100.0 //Distance offset
private constant real WAIT = 0.1 //Wait time
private constant integer ITEM1_UPGRADE1 = 'I01J' //Item Lightning Gripper
private constant integer ITEM1_UPGRADE2 = 'I028' //Item Stormanifer
private constant integer ITEM2_UPGRADE1 = 'bspd' //Item Boots of Speed
private constant integer ITEM2_UPGRADE2 = 'I01T' //Item Sneaker of Exzel
private constant integer UPGRADE1_SPIN1 = 1 //Upgrade 1 that add 1 spins
private constant integer UPGRADE1_SPIN2 = 3 //Upgrade 1 that add 3 spins
private constant real UPGRADE2_RADIUS1 = 150.0 //Upgrade 2 that add radius 1
private constant real UPGRADE2_RADIUS2 = 300.0 //Upgrade 2 that add radius 2
private constant real UPGRADE2_DAMAGE1 = 30.0 //Upgrade 2 damage 1
private constant real UPGRADE2_DAMAGE2 = 60.0 //Upgrade 2 damage 2
private constant integer UPGRADE_DUMMY = 'n026' //Upgrade dummy
private constant attacktype A_TYPE = ATTACK_TYPE_CHAOS //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_ENHANCED //Spell damage type
private constant string SPELL_EFFECT = "Abilities\\Weapons\\PhoenixMissile\\Phoenix_Missile_mini.mdl" //Spin effect
endglobals
//Spin amount
private function Spin takes integer level returns integer
return 3 + (3 * level)
endfunction
//Radius of the spell will be affected
private function Radius takes integer level returns real
return 300.0 + (level * 0)
endfunction
//Damage to the unit affected
private function Damage takes integer level returns real
if(level == 1) then
return 120.0
elseif(level == 2) then
return 200.0
else
return 0.0
endif
endfunction
//Distance travel per charge
private function Distance takes integer level returns real
return 100.0 + (level * 0)
endfunction
//Targets affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_FLYING) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct WhirlingBlade_Data
unit u //Unit caster
player o //Owner of caster
unit dum //Dummy unit
real tX //Target x
real tY //Target y
integer s //Spin amount
integer c //Count spin
real i //Interval between spin
real cos //Cos of angle
real sin //Sin of angle
real ds //Distance per charge
real w //Wait time
boolean up //Upgrade
real dd //Damage deal
real dr //Damage radius
effect e //Effect
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private WhirlingBlade_Data array Ar[10]
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local WhirlingBlade_Data sd
local integer i = 0
local unit f = null
local real fX = 0.0
local real fY = 0.0
local real x = 0.0
local real y = 0.0
local real angle = 0.0
local boolean b = false
local integer j = 0
local real face = 0.0
local integer total = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(IsUnitDead(sd.u)) then
set sd.s = 0
endif
if(sd.w > 0) then
set sd.w = sd.w - Interval()
elseif(sd.s > 0 or sd.i > 0) then
if(sd.i >= INTERVAL) then
set sd.i = 0.0
if(IsUnitInGroup(sd.u, ZealousCaster)) then
set sd.tX = GetUnitX(sd.u)
set sd.tY = GetUnitY(sd.u)
else
set sd.tX = GetUnitX(sd.u) + sd.ds * sd.cos
set sd.tY = GetUnitY(sd.u) + sd.ds * sd.sin
if(sd.tX > WorldBounds.minX + 300.0 and /*
*/sd.tX < WorldBounds.maxX - 300.0 and /*
*/sd.tY > WorldBounds.minY + 300.0 and /*
*/sd.tY < WorldBounds.maxY - 300.0 and (not IsWall(sd.tX, sd.tY, 100.0)) and (not IsBarrel(sd.u, sd.tX, sd.tY, 100.0))) then
call SetUnitPosition(sd.u, sd.tX, sd.tY)
endif
endif
if(sd.up) then
call SetUnitX(sd.dum, sd.tX)
call SetUnitY(sd.dum, sd.tY)
endif
call SetUnitAnimationByIndex(sd.u, ANIME)
call GroupEnumUnitsInRange(all, sd.tX, sd.tY, sd.dr, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
endloop
call HitTree(sd.tX, sd.tY, sd.dr, DAMAGE_TO_TREES, 0.0)
set sd.i = sd.i - Interval()
elseif(sd.i > 0) then
set sd.i = sd.i - Interval()
else
set sd.i = INTERVAL
set sd.s = sd.s - 1
endif
else
call PauseUnit(sd.u, false)
call SetUnitPathing(sd.u, true)
call SetUnitAnimation(sd.u, "stand")
call SetUnitPosition(sd.u, GetUnitX(sd.u), GetUnitY(sd.u))
if(sd.dum != null) then
call KillUnit(sd.dum)
endif
call Pather(sd.u, 1.0)
call GroupRemoveUnit(WhirlingBladeCaster, sd.u)
call DestroyEffect(sd.e)
set sd.e = null
set sd.u = null
set sd.o = null
set sd.dum = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local WhirlingBlade_Data sd = WhirlingBlade_Data.create()
local unit caster = GetSpellAbilityUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
local real angle = GetUnitFacing(caster)
local real rad = angle * bj_DEGTORAD
local real targetX = casterX + DISTANCE_OFFSET * Cos(rad)
local real targetY = casterY + DISTANCE_OFFSET * Sin(rad)
local integer i = 0
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local boolean up = false
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_AS_WhirlingBlade
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
//set dx = targetX - casterX
//set dy = targetY - casterY
//set imax = R2I(SquareRoot(dx * dx + dy * dy))
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, caster, "origin"))
/*set i = 0
loop
exitwhen(i >= imax)
set ix = casterX + i * Cos(angle * bj_DEGTORAD)
set iy = casterY + i * Sin(angle * bj_DEGTORAD)
if(IsWall(ix, iy, 60.0) or IsWater(ix, iy, 60.0)) then
set targetX = ix - i * Cos(angle * bj_DEGTORAD)
set targetY = iy - i * Sin(angle * bj_DEGTORAD)
set i = imax
endif
set i = i + 1
endloop*/
call GroupAddUnit(WhirlingBladeCaster, caster)
call PauseUnit(caster, true)
call SetUnitPathing(caster, false)
set sd.u = caster
set sd.o = owner
set sd.dum = null
set sd.tX = targetX
set sd.tY = targetY
set sd.s = Spin(level)
set sd.i = INTERVAL
set sd.cos = Cos(rad)
set sd.sin = Sin(rad)
set sd.ds = Distance(level)
set sd.w = WAIT
set sd.dd = Damage(level)// + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.dr = Radius(level)
set sd.e = AddSpecialEffectTarget(SPELL_EFFECT, caster, "weapon")
set sd.up = false
if(item1 > 0) then
set sd.s = sd.s + (UPGRADE1_SPIN1 * item1)
endif
if(item2 > 0) then
set sd.s = sd.s + (UPGRADE1_SPIN2 * item2)
set sd.up = true
endif
if(item3 > 0) then
set sd.dr = sd.dr + UPGRADE2_RADIUS1
set sd.dd = sd.dd + (UPGRADE2_DAMAGE1 * item3)
endif
if(item4 > 0) then
set sd.dr = sd.dr + UPGRADE2_RADIUS2
set sd.dd = sd.dd + (UPGRADE2_DAMAGE1 * item4)
set sd.up = true
endif
if(sd.up) then
set sd.dum = CreateUnit(owner, UPGRADE_DUMMY, casterX, casterY, bj_UNIT_FACING)
call UnitAddAbility(sd.dum, 'Arav')
call UnitRemoveAbility(sd.dum, 'Arav')
call SetUnitPathing(sd.dum, false)
call SetUnitX(sd.dum, casterX)
call SetUnitY(sd.dum, casterY)
call SetUnitAnimation(sd.dum, "stand")
if(item4 > 0) then
call SetUnitScale(sd.dum, 1.2, 1.2, 1.2)
elseif(item3 > 0) then
call SetUnitScale(sd.dum, 1.1, 1.1, 1.1)
endif
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
set s = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(WhirlingBladeTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(WhirlingBladeTrg, Condition(function Conditions))
call TriggerAddAction(WhirlingBladeTrg, function Actions)
//Setting globals
set all = CreateGroup()
set bexpr = Condition(function Pick)
set Tim = CreateTimer()
set Total = 0
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=9
//TESH.alwaysfold=0
globals
group EarthTrembleDummy = CreateGroup()
endglobals
scope EarthTremble initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A05C' //Spell Earth Tremble rawcode
private constant integer CAST_ID = 'AOeq' //Cast Earth Tremble (Dummy) rawcode
private constant integer ABILITY_ID = 'A05F' //Ability Spirit Bond rawcode
private constant real MAX_INTERVAL = 1.0 //Maximum interval of damage
private constant integer DUMMY_ID = 'n00V' //Dummy rawcode
private constant integer ITEM1_UPGRADE1 = 'rde1' //Item Barrel Buckler
private constant integer ITEM1_UPGRADE2 = 'rde3' //Item Robust Shield
private constant integer ITEM1_UPGRADE3 = 'I025' //Item Encease Siege
private constant integer ITEM2_UPGRADE1 = 'I00J' //Item Astrallian Robe
private constant integer ITEM2_UPGRADE2 = 'I01L' //Item Windsage
private constant integer ITEM3_UPGRADE1 = 'I006' //Item Baneriven Dagger
private constant integer ITEM3_UPGRADE2 = 'I010' //Item Venomwax Fang
private constant integer ITEM3_UPGRADE3 = 'I014' //Item Cinquedea Ivy
private constant real UPGRADE1_DURATION1 = 2.0 //Upgrade 1 effect 1
private constant real UPGRADE1_DURATION2 = 4.0 //Upgrade 1 effect 2
private constant real UPGRADE1_DURATION3 = 6.0 //Upgrade 1 effect 3
private constant real UPGRADE2_DAMAGE1 = 10.0 //Upgrade 2 effect 1
private constant real UPGRADE2_DAMAGE2 = 20.0 //Upgrade 2 effect 2
private constant real UPGRADE2_PULL_DISTANCE1 = 25.0 //Upgrade 2 effect 1
private constant real UPGRADE2_PULL_DISTANCE2 = 50.0 //Upgrade 2 effect 2
private constant integer UPGRADE3_LEVEL1 = 4 //Upgrade 3 effect 1
private constant integer UPGRADE3_LEVEL2 = 8 //Upgrade 3 effect 2
private constant integer UPGRADE3_LEVEL3 = 12 //Upgrade 3 effect 3
private constant real UPGRADE3_RADIUS1 = 100.0 //Upgrade 3 effect 1
private constant real UPGRADE3_RADIUS2 = 200.0 //Upgrade 3 effect 2
private constant real UPGRADE3_RADIUS3 = 300.0 //Upgrade 3 effect 3
private constant integer SPIRIT_BOND_ITEM1_UPGRADE1 = 'prvt' //Item Periapt of Vitality
private constant integer SPIRIT_BOND_ITEM1_UPGRADE2 = 'rhth' //Item Zemi of Eternal
private constant integer SPIRIT_BOND_ITEM1_UPGRADE3 = 'I015' //Item Orb of Descent
private constant integer SPIRIT_BOND_ITEM2_UPGRADE1 = 'penr' //Item Gratify Rosary
private constant integer SPIRIT_BOND_ITEM2_UPGRADE2 = 'pmna' //Item Pendant of Innerforce
private constant integer SPIRIT_BOND_ITEM2_UPGRADE3 = 'I01V' //Item Power Fragment
private constant real SPIRIT_BOND_UPGRADE1_LIFE_REGENERATION1 = 5.0 //Spirit bond upgrade 1 regeneration 1
private constant real SPIRIT_BOND_UPGRADE1_LIFE_REGENERATION2 = 10.0 //Spirit bond upgrade 1 regeneration 2
private constant real SPIRIT_BOND_UPGRADE1_LIFE_REGENERATION3 = 15.0 //Spirit bond upgrade 1 regeneration 3
private constant real SPIRIT_BOND_UPGRADE2_MANA_REGENERATION1 = 3.0 //Spirit bond upgrade 1 regeneration 1
private constant real SPIRIT_BOND_UPGRADE2_MANA_REGENERATION2 = 6.0 //Spirit bond upgrade 1 regeneration 2
private constant real SPIRIT_BOND_UPGRADE2_MANA_REGENERATION3 = 9.0 //Spirit bond upgrade 1 regeneration 3
private constant string FIRE_WALL_EFFECT = "Abilities\\Weapons\\DemolisherFireMissile\\DemolisherFireMissile.mdl" //Stack Fire Wall effect
private constant string SPIRIT_BOND_EFFECT = "Abilities\\Weapons\\WitchDoctorMissile\\WitchDoctorMissile.mdl" //Stack Tracking Sense effect
private constant attacktype A_TYPE = ATTACK_TYPE_MAGIC //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_DEMOLITION //Spell damage type
endglobals
//Time duration
private function Duration takes integer level returns real
return 10.0 + (0.0 * level)
endfunction
//Damage
private function Damage takes integer level returns real
if(level == 1) then
return 20.0
elseif(level == 2) then
return 25.0
elseif(level == 3) then
return 35.0
elseif(level == 4) then
return 50.0
else
return 0.0
endif
endfunction
//Radius of damage
private function Radius takes integer level returns real
return 300.0 + (0.0 * level)
endfunction
//Bond effect with fire wall
private function Bond_FireWall takes integer level returns real
return 1.0 + (0.5 * level)
endfunction
//Bond effect with storm called
private function Bond_StormCalled takes integer level returns real
return 1.0 + (0.5 * level)
endfunction
//Bond effect with tracking sense (not used)
private function Bond_TrackingSense takes integer level returns real
return 30.0 + (0.0 * level)
endfunction
//Targets affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_FLYING) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.5
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct EarthTremble_Data
unit u //Unit caster
player o //Owner of caster
unit dum //Unit dummy
real t //Time left
real x //Target x
real y //Target y
real i //Interval
real im //Interval max
real r //Radius
real d //Damage
real p //Pull distance
real lr //Life regeneration
real mr //Mana regeneration
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private EarthTremble_Data array Ar[100]
private group all
private group copy
private boolexpr bexpr
private location loc
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local EarthTremble_Data sd
local integer i = 0
local unit f = null
local real fX = 0.0
local real fY = 0.0
local real fAngle = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local boolean exist = false
local integer levelBond = 0
local boolean stackFireWall = false
local boolean stackStormCalled = false
local boolean stackTrackingSense = false
local real damage = 0.0
local real dissipate = 0.0
local real x = 0.0
local real y = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t > 0.0) then
set sd.t = sd.t - Interval()
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
set levelBond = GetUnitAbilityLevel(sd.u, ABILITY_ID)
set stackFireWall = false
set stackStormCalled = false
set damage = sd.d
set dissipate = 0.0
if(levelBond > 0) then
set exist = false
set copy = CopyGroup(FireWallDummy)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == sd.o and (not exist)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = sd.x - fX
set dy = sd.y - fY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= sd.r) then
set exist = true
endif
endif
endloop
if(exist) then
set damage = damage + damage * Bond_FireWall(levelBond)
set stackFireWall = true
endif
set exist = false
set copy = CopyGroup(StormCalledDummy)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == sd.o and (not exist)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = sd.x - fX
set dy = sd.y - fY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= sd.r) then
set exist = true
endif
endif
endloop
if(exist) then
set dissipate = damage * Bond_StormCalled(levelBond)
set stackStormCalled = true
endif
set exist = false
if(sd.lr > 0.0 or sd.mr > 0.0) then
set copy = CopyGroup(TrackingSenseDummy)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == sd.o) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = sd.x - fX
set dy = sd.y - fY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= sd.r) then
call DestroyEffect(AddSpecialEffectTarget(SPIRIT_BOND_EFFECT, sd.u, "head"))
if(sd.lr > 0.0) then
call SetUnitState(sd.u, UNIT_STATE_LIFE, GetUnitState(sd.u, UNIT_STATE_LIFE) + sd.lr)
endif
if(sd.mr > 0.0) then
call SetUnitState(sd.u, UNIT_STATE_MANA, GetUnitState(sd.u, UNIT_STATE_MANA) + sd.mr)
endif
endif
endif
endloop
endif
endif
call HitTree(sd.x, sd.y, sd.r, 5.0, 0.0)
call GroupEnumUnitsInRange(all, sd.x, sd.y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
call UnitDamageTarget(sd.u, f, damage, true, false, A_TYPE, D_TYPE, null)
if(sd.p > 0.0) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set fAngle = Atan2(sd.y - fY, sd.x - fX)
set dx = sd.x - fX
set dy = sd.y - fY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance > sd.p) then
set x = fX + sd.p * Cos(fAngle)
set y = fY + sd.p * Sin(fAngle)
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0)) and (not IsBarrel(sd.u, x, y, 100.0))) then
call SetUnitX(f, x)
call SetUnitY(f, y)
endif
else
call SetUnitX(f, sd.x)
call SetUnitY(f, sd.y)
endif
endif
if(stackFireWall) then
call DestroyEffect(AddSpecialEffect(FIRE_WALL_EFFECT, GetUnitX(f), GetUnitY(f)))
endif
if(stackStormCalled) then
call SetUnitState(f, UNIT_STATE_MANA, GetUnitState(f, UNIT_STATE_MANA) - dissipate)
endif
endif
endloop
endif
else
call GroupRemoveUnit(EarthTrembleDummy, sd.dum)
call RemoveUnit(sd.dum)
set sd.u = null
set sd.o = null
set sd.dum = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local EarthTremble_Data sd = EarthTremble_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local integer levelBond = GetUnitAbilityLevel(caster, ABILITY_ID)
local player owner = GetOwningPlayer(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local real targetX = 0.0
local real targetY = 0.0
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item6 = IsUnitHasItemType(caster, ITEM3_UPGRADE1)
local integer item7 = IsUnitHasItemType(caster, ITEM3_UPGRADE2)
local integer item8 = IsUnitHasItemType(caster, ITEM3_UPGRADE3)
local integer extraLevel = 0
local real extraRadius = 0.0
local integer bondItem1 = IsUnitHasItemType(caster, SPIRIT_BOND_ITEM1_UPGRADE1)
local integer bondItem2 = IsUnitHasItemType(caster, SPIRIT_BOND_ITEM1_UPGRADE2)
local integer bondItem3 = IsUnitHasItemType(caster, SPIRIT_BOND_ITEM1_UPGRADE3)
local integer bondItem4 = IsUnitHasItemType(caster, SPIRIT_BOND_ITEM2_UPGRADE1)
local integer bondItem5 = IsUnitHasItemType(caster, SPIRIT_BOND_ITEM2_UPGRADE2)
local integer bondItem6 = IsUnitHasItemType(caster, SPIRIT_BOND_ITEM2_UPGRADE3)
local real life = 0.0
local real mana = 0.0
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
set sd.u = caster
set sd.o = owner
set sd.dum = CreateUnit(owner, DUMMY_ID, targetX, targetY, 0.0)
set sd.t = Duration(level)
set sd.x = targetX
set sd.y = targetY
set sd.i = 0.0
set sd.im = MAX_INTERVAL
set sd.r = Radius(level)
set sd.d = Damage(level)
set sd.p = 0.0
set sd.lr = 0.0
set sd.mr = 0.0
if(bondItem1 > 0) then
set life = life + (SPIRIT_BOND_UPGRADE1_LIFE_REGENERATION1 * bondItem1 * levelBond)
endif
if(bondItem2 > 0) then
set life = life + (SPIRIT_BOND_UPGRADE1_LIFE_REGENERATION2 * bondItem2 * levelBond)
endif
if(bondItem3 > 0) then
set life = life + (SPIRIT_BOND_UPGRADE1_LIFE_REGENERATION3 * bondItem3 * levelBond)
endif
if(bondItem4 > 0) then
set mana = mana + (SPIRIT_BOND_UPGRADE2_MANA_REGENERATION1 * bondItem4 * levelBond)
endif
if(bondItem5 > 0) then
set mana = mana + (SPIRIT_BOND_UPGRADE2_MANA_REGENERATION2 * bondItem5 * levelBond)
endif
if(bondItem6 > 0) then
set mana = mana + (SPIRIT_BOND_UPGRADE2_MANA_REGENERATION3 * bondItem6 * levelBond)
endif
set sd.lr = life
set sd.mr = mana
if(item6 > 0) then
set extraLevel = UPGRADE3_LEVEL1
set extraRadius = UPGRADE3_RADIUS1
endif
if(item7 > 0) then
set extraLevel = UPGRADE3_LEVEL2
set extraRadius = UPGRADE3_RADIUS2
endif
if(item8 > 0) then
set extraLevel = UPGRADE3_LEVEL3
set extraRadius = UPGRADE3_RADIUS3
endif
set sd.r = sd.r + extraRadius
call UnitAddAbility(sd.dum, CAST_ID)
call SetUnitAbilityLevel(sd.dum, CAST_ID, level + extraLevel)
call IssuePointOrder(sd.dum, "earthquake", targetX, targetY)
call GroupAddUnit(EarthTrembleDummy, sd.dum)
if(item1 > 0) then
set sd.t = sd.t + (UPGRADE1_DURATION1 * item1)
endif
if(item2 > 0) then
set sd.t = sd.t + (UPGRADE1_DURATION2 * item2)
endif
if(item3 > 0) then
set sd.t = sd.t + (UPGRADE1_DURATION3 * item3)
endif
if(item4 > 0) then
set sd.d = sd.d + (UPGRADE2_DAMAGE1 * item4)
set sd.p = sd.p + (UPGRADE2_PULL_DISTANCE1 * item4)
endif
if(item5 > 0) then
set sd.d = sd.d + (UPGRADE2_DAMAGE2 * item5)
set sd.p = sd.p + (UPGRADE2_PULL_DISTANCE1 * item5)
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(EarthTrembleTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(EarthTrembleTrg, Condition(function Conditions))
call TriggerAddAction(EarthTrembleTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set copy = CreateGroup()
set bexpr = Condition(function Pick)
set loc = Location(0, 0)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call AbilityPreload(ABILITY_ID)
call Preload(FIRE_WALL_EFFECT)
endfunction
endscope
//TESH.scrollpos=245
//TESH.alwaysfold=0
globals
group TrackingSenseDummy = CreateGroup()
endglobals
scope TrackingSense initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A05H' //Spell Tracking Sense rawcode
private constant integer DUMMY_ID = 'n00U' //Dummy rawcode
private constant integer UNIT_KEY = 0 //Unit target key
private constant integer ITEM1_UPGRADE1 = 'I01Q' //Item Book of Spirit
private constant integer ITEM1_UPGRADE2 = 'I01R' //Item Shadow Grimoire
private constant integer ITEM2_UPGRADE1 = 'I00K' //Item Expidition Footgear
private constant integer ITEM2_UPGRADE2 = 'bspd' //Item Boots of Speed
private constant integer ITEM2_UPGRADE3 = 'I016' //Item Jungle Runner
private constant integer ITEM3_UPGRADE1 = 'tels' //Item Hunting Scope
private constant integer ITEM3_UPGRADE2 = 'crys' //Item Crystal Ball
private constant real UPGRADE1_MOVE_SPEED1 = 10.0 //Upgrade 1 effect dummy 1
private constant real UPGRADE1_MOVE_SPEED2 = 20.0 //Upgrade 1 effect dummy 2
private constant integer UPGRADE1_DUMMY1 = 'n02Q' //Upgrade 1 effect 1
private constant integer UPGRADE1_DUMMY2 = 'n02R' //Upgrade 1 effect 2
private constant real UPGRADE2_DURATION1 = 3.0 //Upgrade 2 effect 1
private constant real UPGRADE2_DURATION2 = 6.0 //Upgrade 2 effect 2
private constant real UPGRADE2_DURATION3 = 9.0 //Upgrade 2 effect 3
private constant real UPGRADE3_DISTANCE_AMPLIFY1 = 250.0 //Upgrade 3 effect 1
private constant real UPGRADE3_DISTANCE_AMPLIFY2 = 500.0 //Upgrade 3 effect 2
private constant integer UPGRADE3_ABILITY2 = 'A0BK' //Upgrade 3 ability 2
private constant string SPELL_EFFECT = "Abilities\\Weapons\\WitchDoctorMissile\\WitchDoctorMissile.mdl" //Target effect
endglobals
//Time duration of revealing unit
private function Duration takes integer level returns real
if(level == 1) then
return 12.0
elseif(level == 2) then
return 20.0
elseif(level == 3) then
return 30.0
else
return 0.0
endif
endfunction
//Move speed per unit
private function Move_Speed takes integer level returns real
return 20.0 + (10.0 * level)
endfunction
//Distance amplify
private function Distance_Amplify takes integer level returns real
return 500.0 + (0.0 * level)
endfunction
//Amplify move speed
private function Amplify takes integer level returns real
return 2.0 + (0.0 * level)
endfunction
//Radius of damage
private function Radius takes integer level returns real
return 9000.0 + (0.0 * level)
endfunction
//Targets affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_HERO) == true)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct TrackingSense_Data
unit u //Unit caster
player o //Owner of caster
group g //Group of dummies
hashtable ht //Hashtable
effect e //Effect
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private TrackingSense_Data array Ar[100]
private group all
private boolexpr bexpr
private group copy
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local TrackingSense_Data sd
local integer i = 0
local unit f = null
local integer fID = 0
local boolean exist = false
local unit target = null
local real targetX = 0.0
local real targetY = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
set exist = (FirstOfGroup(sd.g) != null)
if(exist) then
set copy = CopyGroup(sd.g)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set fID = GetUnitUserData(f)
if(IsUnitDead(f)) then
call GroupRemoveUnit(sd.g, f)
call FlushChildHashtable(sd.ht, fID)
else
set target = LoadUnitHandle(sd.ht, fID, UNIT_KEY)
if(target != null) then
set targetX = GetUnitX(target)
set targetY = GetUnitY(target)
if(not IsUnitDead(target)) then
call IssuePointOrder(f, "move", targetX, targetY)
//call SetUnitX(f, targetX)
//call SetUnitY(f, targetY)
else
call KillUnit(f)
endif
endif
endif
endloop
else
call SetUnitMoveSpeed(sd.u, GetUnitDefaultMoveSpeed(sd.u))
call DestroyEffect(sd.e)
set sd.e = null
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
set target = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local TrackingSense_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local boolean isNull = (Ar[Total] == null)
local integer dummyType = DUMMY_ID
local unit f = null
local real fX = 0.0
local real fY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local real duration = 0.0
local unit dummy = null
local integer dummyID = 0
local real movespeed = 0.0
local real distanceAmplify = Distance_Amplify(level)
local real amplify = Amplify(level)
local real radius = 0.0
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE3)
local integer item6 = IsUnitHasItemType(caster, ITEM3_UPGRADE1)
local integer item7 = IsUnitHasItemType(caster, ITEM3_UPGRADE2)
if(isNull) then
set sd = TrackingSense_Data.create()
set sd.g = CreateGroup()
set sd.ht = InitHashtable()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.o = owner
set sd.e = AddSpecialEffectTarget(SPELL_EFFECT, caster, "weapon")
set duration = Duration(level)
if(item1 > 0) then
set dummyType = UPGRADE1_DUMMY1
endif
if(item2 > 0) then
set dummyType = UPGRADE1_DUMMY2
endif
if(item3 > 0) then
set duration = duration + (UPGRADE2_DURATION1 * item3)
endif
if(item4 > 0) then
set duration = duration + (UPGRADE2_DURATION2 * item4)
endif
if(item5 > 0) then
set duration = duration + (UPGRADE2_DURATION3 * item5)
endif
if(item6 > 0) then
set distanceAmplify = distanceAmplify + (UPGRADE3_DISTANCE_AMPLIFY1 * item6)
endif
if(item7 > 0) then
set distanceAmplify = distanceAmplify + (UPGRADE3_DISTANCE_AMPLIFY2 * item7)
endif
call GroupEnumUnitsInRange(all, casterX, casterY, Radius(level), bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, owner)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = casterX - fX
set dy = casterY - fY
set distance = SquareRoot(dx * dx + dy * dy)
set dummy = CreateUnit(owner, dummyType, fX, fY, 0.0)
call GroupAddUnit(sd.g, dummy)
call UnitApplyTimedLife(dummy, 'BTLF', duration)
call GroupAddUnit(TrackingSenseDummy, dummy)
if(item1 > 0) then
call SetUnitMoveSpeed(dummy, GetUnitMoveSpeed(dummy) + (UPGRADE1_MOVE_SPEED1 * item1))
endif
if(item2 > 0) then
call SetUnitMoveSpeed(dummy, GetUnitMoveSpeed(dummy) + (UPGRADE1_MOVE_SPEED2 * item2))
endif
if(item7 > 0) then
call UnitAddAbility(dummy, UPGRADE3_ABILITY2)
call SetUnitAbilityLevel(dummy, UPGRADE3_ABILITY2, item7)
endif
set dummyID = GetUnitUserData(dummy)
call SaveUnitHandle(sd.ht, dummyID, UNIT_KEY, f)
if(distance <= distanceAmplify) then
set movespeed = movespeed + Move_Speed(level) * amplify
else
set movespeed = movespeed + Move_Speed(level)
endif
endif
endloop
call SetUnitMoveSpeed(caster, GetUnitMoveSpeed(caster) + movespeed)
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set owner = null
set dummy = null
set f = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(TrackingSenseTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(TrackingSenseTrg, Condition(function Conditions))
call TriggerAddAction(TrackingSenseTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
set copy = CreateGroup()
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=10
//TESH.alwaysfold=0
globals
group FireWallDummy = CreateGroup()
endglobals
scope FireWall initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A05E' //Spell Titan Shock rawcode
private constant integer CAST_ID = 'A07T' //Spell Storm Hammer rawcode
private constant integer DUMMY1_ID = 'n00S' //Dummy pillar
private constant integer ABILITY_ID = 'A05F' //Ability Spirit Bond rawcode
private constant real DELAY = 1.0 //Delay pillar
private constant real COOLDOWN = 0.5 //Cooldown attack upgrade
private constant integer ITEM1_UPGRADE1 = 'I013' //Item Silverlight Toucher
private constant integer ITEM1_UPGRADE2 = 'I012' //Item Arcane Heaver
private constant integer ITEM1_UPGRADE3 = 'lgdh' //Item Vangage Expulsion
private constant integer ITEM2_UPGRADE1 = 'I01A' //Item Fatal Cleaver
private constant integer ITEM2_UPGRADE2 = 'I01C' //Item Sagaris Carnage
private constant integer UPGRADE1_PILLAR1 = 2 //Upgrade 1 effect 1
private constant integer UPGRADE1_PILLAR2 = 4 //Upgrade 1 effect 2
private constant integer UPGRADE1_PILLAR3 = 6 //Upgrade 1 effect 3
private constant real UPGRADE1_RANGE2 = 20.0 //Upgrade 1 effect 2
private constant real UPGRADE1_RANGE3 = 40.0 //Upgrade 1 effect 3
private constant real UPGRADE2_PERCENT1 = 0.5 //Upgrade 2 percent 1
private constant real UPGRADE2_PERCENT2 = 1.0 //Upgrade 2 percent 2
private constant integer UPGRADE2_DUMMY_ID = 'n02S' //Dummy move
private constant real UPGRADE2_DUMMY_DISTANCE_MOVE = 40.0 //Dummy move
private constant real UPGRADE2_DUMMY_DURATION = 30.0 //Dummy duration max
private constant real UPGRADE2_DISTANCE_HIT = 50.0 //Distance hit
private constant real UPGRADE2_RADIUS_PASS_FIRE = 50.0 //Pass fire
private constant integer SPIRIT_BOND_ITEM1_UPGRADE1 = 'prvt' //Item Periapt of Vitality
private constant integer SPIRIT_BOND_ITEM1_UPGRADE2 = 'rhth' //Item Zemi of Eternal
private constant integer SPIRIT_BOND_ITEM1_UPGRADE3 = 'I015' //Item Orb of Descent
private constant integer SPIRIT_BOND_ITEM2_UPGRADE1 = 'penr' //Item Gratify Rosary
private constant integer SPIRIT_BOND_ITEM2_UPGRADE2 = 'pmna' //Item Pendant of Innerforce
private constant integer SPIRIT_BOND_ITEM2_UPGRADE3 = 'I01V' //Item Power Fragment
private constant real SPIRIT_BOND_UPGRADE1_LIFE_REGENERATION1 = 5.0 //Spirit bond upgrade 1 regeneration 1
private constant real SPIRIT_BOND_UPGRADE1_LIFE_REGENERATION2 = 10.0 //Spirit bond upgrade 1 regeneration 2
private constant real SPIRIT_BOND_UPGRADE1_LIFE_REGENERATION3 = 15.0 //Spirit bond upgrade 1 regeneration 3
private constant real SPIRIT_BOND_UPGRADE2_MANA_REGENERATION1 = 3.0 //Spirit bond upgrade 1 regeneration 1
private constant real SPIRIT_BOND_UPGRADE2_MANA_REGENERATION2 = 6.0 //Spirit bond upgrade 1 regeneration 2
private constant real SPIRIT_BOND_UPGRADE2_MANA_REGENERATION3 = 9.0 //Spirit bond upgrade 1 regeneration 3
private constant string EXPLODE_EFFECT = "Abilities\\Weapons\\DemolisherFireMissile\\DemolisherFireMissile.mdl" //Hit Fire Wall effect
private constant string TRACKING_SENSE_EFFECT = "Abilities\\Spells\\Items\\AIma\\AImaTarget.mdl" //Stack Tracking Sense effect
private constant string UPGRADE_ATTACK_EFFECT = "Abilities\\Weapons\\FireBallMissile\\FireBallMissile.mdl" //Fireball effect
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_FIRE //Spell damage type
endglobals
//Number of pillars
private function Pillar takes integer level returns integer
return 3 + (2 * level)
endfunction
//Duration of pillar life time
private function Duration takes integer level returns real
return 40.0 + (0.0 * level)
endfunction
//Range between pillars
private function Pillar_Range takes integer level returns real
return 80.0 + (0.0 * level)
endfunction
//Distance from target to pillars
private function Distance takes integer level returns real
return 140.0 + (0.0 * level)
endfunction
//Radius detection
private function Radius takes integer level returns real
return 100.0 + (0.0 * level)
endfunction
//Damage
private function Damage takes integer level returns real
if(level == 1) then
return 40.0
elseif(level == 2) then
return 50.0
elseif(level == 3) then
return 60.0
else
return 0.0
endif
endfunction
//Bond effect with Earth Tremble
private function Bond_EarthTremble takes integer level returns real
return 1.0 + (0.5 * level)
endfunction
//Bond effect with Storm Called
private function Bond_StormCalled takes integer level returns real
return 1.1 + (0.3 * level)
endfunction
//Bond effect with tracking sense
private function Bond_TrackingSense takes integer level returns real
return 30.0 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct FireWall_Data
unit u //Unit caster
player o //Owner of caster
group gp //Group dummmy
hashtable ht //Hashtable
endstruct
//----------------------------------------------------------------
struct FireBall_Data
unit u //Unit caster
player o //Owner of caster
unit t //Unit target
unit dum //Unit dummy
real dm //Distance move
real d //Duration max
boolean f //Pass fire
real dd //Damage add
real md //Multiple of damage
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private FireWall_Data array Ar[100]
private integer Total
private timer Tim2
private FireBall_Data array Ar2[100]
private integer Total2
private group all
private group copy
private group copy2
private boolexpr bexpr
private location loc
private group Cooldown
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local FireWall_Data sd
local integer i = 0
local unit f = null
local real fX = 0.0
local real fY = 0.0
local integer fID = 0
local real duration = 0.0
local real radius = 0.0
local real damage = 0.0
local integer level = 0
local real delay = 0.0
local boolean stacked = false
local boolean exist = false
local integer levelBond = 0
local unit g = null
local real gX = 0.0
local real gY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local real size = 0.0
local real life = 0.0
local real mana = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
set levelBond = GetUnitAbilityLevel(sd.u, ABILITY_ID)
set copy = CopyGroup(sd.gp)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set fID = GetUnitUserData(f)
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set duration = LoadReal(sd.ht, fID, 0)
set radius = LoadReal(sd.ht, fID, 1)
set damage = LoadReal(sd.ht, fID, 2)
set level = LoadInteger(sd.ht, fID, 3)
set delay = LoadReal(sd.ht, fID, 4)
set stacked = LoadBoolean(sd.ht, fID, 5)
set life = LoadReal(sd.ht, fID, 6)
set mana = LoadReal(sd.ht, fID, 7)
if(levelBond > 0 and (not stacked)) then
set exist = false
set copy2 = CopyGroup(StormCalledDummy)
loop
set g = FirstOfGroup(copy2)
exitwhen(g == null)
call GroupRemoveUnit(copy2, g)
if(GetOwningPlayer(g) == sd.o and (not exist)) then
set gX = GetUnitX(g)
set gY = GetUnitY(g)
set dx = fX - gX
set dy = fY - gY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= radius) then
set exist = true
endif
endif
endloop
if(exist) then
set size = Bond_StormCalled(levelBond)//1.1 + (0.3 * levelBond)
set radius = radius * Bond_StormCalled(levelBond)
call SetUnitScale(f, size, size, size)
call SaveReal(sd.ht, fID, 1, radius)
call SaveBoolean(sd.ht, fID, 5, true)
endif
endif
if(delay > 0.0) then
set delay = delay - Interval()
if(levelBond > 0) then
set exist = false
set copy2 = CopyGroup(EarthTrembleDummy)
loop
set g = FirstOfGroup(copy2)
exitwhen(g == null)
call GroupRemoveUnit(copy2, g)
if(GetOwningPlayer(g) == sd.o and (not exist)) then
set gX = GetUnitX(g)
set gY = GetUnitY(g)
set dx = fX - gX
set dy = fY - gY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= 300.0) then
set exist = true
endif
endif
endloop
if(exist) then
set delay = delay - Interval() * levelBond
endif
endif
call SaveReal(sd.ht, fID, 4, delay)
else
call GroupEnumUnitsInRange(all, fX, fY, radius, bexpr)
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
if (IsUnitEnemy(g, sd.o)) then
set duration = 0
endif
endloop
if(duration > 0) then
if(levelBond > 0) then
set exist = false
set copy2 = CopyGroup(EarthTrembleDummy)
loop
set g = FirstOfGroup(copy2)
exitwhen(g == null)
call GroupRemoveUnit(copy2, g)
if(GetOwningPlayer(g) == sd.o and (not exist)) then
set gX = GetUnitX(g)
set gY = GetUnitY(g)
set dx = fX - gX
set dy = fY - gY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= radius) then
set exist = true
endif
endif
endloop
if(exist) then
set duration = duration + Interval() * Bond_EarthTremble(levelBond)
endif
if(life > 0 or mana > 0) then
set copy2 = CopyGroup(TrackingSenseDummy)
loop
set g = FirstOfGroup(copy2)
exitwhen(g == null)
call GroupRemoveUnit(copy2, g)
if(GetOwningPlayer(g) == sd.o and (not exist)) then
set gX = GetUnitX(g)
set gY = GetUnitY(g)
set dx = fX - gX
set dy = fY - gY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= radius) then
call DestroyEffect(AddSpecialEffectTarget(TRACKING_SENSE_EFFECT, sd.u, "head"))
if(life > 0.0) then
call SetUnitState(sd.u, UNIT_STATE_LIFE, GetUnitState(sd.u, UNIT_STATE_LIFE) + life)
endif
if(mana > 0.0) then
call SetUnitState(sd.u, UNIT_STATE_MANA, GetUnitState(sd.u, UNIT_STATE_MANA) + mana)
endif
endif
endif
endloop
endif
endif
set duration = duration - Interval()
call SaveReal(sd.ht, fID, 0, duration)
else
call GroupEnumUnitsInRange(all, fX, fY, radius, bexpr)
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
if (IsUnitEnemy(g, sd.o)) then
call UnitDamageTarget(sd.u, g, damage, true, false, A_TYPE, D_TYPE, null)
call TargetCast(sd.o, fX, fY, 0.5, CAST_ID, level, "thunderbolt", 0, g)
call DestroyEffect(AddSpecialEffect(EXPLODE_EFFECT, fX, fY))
set duration = 0
set exist = true
endif
endloop
call FlushChildHashtable(sd.ht, fID)
call RemoveUnit(f)
call GroupRemoveUnit(sd.gp, f)
call GroupRemoveUnit(FireWallDummy, f)
endif
endif
endloop
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
set g = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local FireWall_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local integer levelBond = GetUnitAbilityLevel(caster, ABILITY_ID)
local real angle = GetUnitFacing(caster)
local player owner = GetOwningPlayer(caster)
local integer pillar = Pillar(level)
local real duration = Duration(level)
local real range = Pillar_Range(level)
local real distance = Distance(level)
local real radius = Radius(level)
local real damage = Damage(level)
local integer i = 0
local integer r = 0
local integer p = 0
local real targetX = 0.0
local real targetY = 0.0
local real rad = 0.0
local real x = 0.0
local real y = 0.0
local real tX = 0.0
local real tY = 0.0
local boolean exist = false
local unit dummy = null
local integer dummyID = 0
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local real changeRange = 0.0
local integer item4 = IsUnitHasItemType(caster, SPIRIT_BOND_ITEM1_UPGRADE1)
local integer item5 = IsUnitHasItemType(caster, SPIRIT_BOND_ITEM1_UPGRADE2)
local integer item6 = IsUnitHasItemType(caster, SPIRIT_BOND_ITEM1_UPGRADE3)
local integer item7 = IsUnitHasItemType(caster, SPIRIT_BOND_ITEM2_UPGRADE1)
local integer item8 = IsUnitHasItemType(caster, SPIRIT_BOND_ITEM2_UPGRADE2)
local integer item9 = IsUnitHasItemType(caster, SPIRIT_BOND_ITEM2_UPGRADE3)
local real life = 0.0
local real mana = 0.0
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
set damage = damage + (damage * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set exist = true
set i = Total
endif
set i = i + 1
endloop
if(exist) then
set x = targetX
set y = targetY
if(item1 > 0) then
set pillar = pillar + (UPGRADE1_PILLAR1 * item1)
endif
if(item2 > 0) then
set pillar = pillar + (UPGRADE1_PILLAR2 * item2)
set changeRange = UPGRADE1_RANGE2
endif
if(item3 > 0) then
set pillar = pillar + (UPGRADE1_PILLAR3 * item3)
set changeRange = UPGRADE1_RANGE3
endif
set range = range - changeRange
set i = 0
set r = 0
loop
exitwhen(i >= pillar)
set p = ModuloInteger(i, 2)
if(p == 0) then
set p = 1
else
set p = -1
endif
set rad = angle + (p * 90)
set rad = rad * bj_DEGTORAD
set tX = x + (range * r) * Cos(rad)
set tY = y + (range * r) * Sin(rad)
if(tX > WorldBounds.minX + 300.0 and /*
*/tX < WorldBounds.maxX - 300.0 and /*
*/tY > WorldBounds.minY + 300.0 and /*
*/tY < WorldBounds.maxY - 300.0 and (not IsWall(tX, tY, 100.0))) then
else
set tX = x
set tY = y
endif
set dummy = CreateUnit(owner, DUMMY1_ID, tX, tY, 0.0)
set dummyID = GetUnitUserData(dummy)
call SetUnitAnimation(dummy, "birth")
call QueueUnitAnimation(dummy, "stand")
call UnitAddAbility(dummy, 'Arav')
call UnitRemoveAbility(dummy, 'Arav')
call SetUnitPathing(dummy, false)
call SetUnitX(dummy, tX)
call SetUnitY(dummy, tY)
call GroupAddUnit(sd.gp, dummy)
call GroupAddUnit(FireWallDummy, dummy)
call SaveReal(sd.ht, dummyID, 0, duration)
call SaveReal(sd.ht, dummyID, 1, radius)
call SaveReal(sd.ht, dummyID, 2, damage)
call SaveInteger(sd.ht, dummyID, 3, level)
call SaveReal(sd.ht, dummyID, 4, DELAY)
call SaveBoolean(sd.ht, dummyID, 5, false)
if(levelBond > 0) then
if(item1 > 0) then
set life = life + (SPIRIT_BOND_UPGRADE1_LIFE_REGENERATION1 * item1 * levelBond)
endif
if(item2 > 0) then
set life = life + (SPIRIT_BOND_UPGRADE1_LIFE_REGENERATION2 * item2 * levelBond)
endif
if(item3 > 0) then
set life = life + (SPIRIT_BOND_UPGRADE1_LIFE_REGENERATION3 * item3 * levelBond)
endif
if(item4 > 0) then
set mana = mana + (SPIRIT_BOND_UPGRADE2_MANA_REGENERATION1 * item4 * levelBond)
endif
if(item5 > 0) then
set mana = mana + (SPIRIT_BOND_UPGRADE2_MANA_REGENERATION2 * item5 * levelBond)
endif
if(item6 > 0) then
set mana = mana + (SPIRIT_BOND_UPGRADE2_MANA_REGENERATION3 * item6 * levelBond)
endif
endif
call SaveReal(sd.ht, dummyID, 6, life)
call SaveReal(sd.ht, dummyID, 7, mana)
if(ModuloInteger(i, 2) == 0) then
set r = r + 1
endif
set i = i + 1
endloop
endif
set caster = null
set owner = null
set dummy = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local FireWall_Data sd
local unit learner = GetLearningUnit()
local player owner = GetOwningPlayer(learner)
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
set sd = FireWall_Data.create()
set sd.u = learner
set sd.o = owner
set sd.gp = CreateGroup()
set sd.ht = InitHashtable()
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set learner = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
return (GetLearnedSkill() == SPELL_ID)
endfunction
//----------------------------------------------------------------
private function Actions_Execute2 takes nothing returns nothing
local FireBall_Data fd
local FireWall_Data sd
local integer i = 0
local integer j = 0
local real x = 0.0
local real y = 0.0
local real targetX = 0.0
local real targetY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local real rad = 0.0
local real damage = 0.0
local unit f = null
local integer fId = 0
loop
exitwhen(i >= Total2)
set fd = Ar2[i]
if(fd.d > 0.0) then
set x = GetUnitX(fd.dum)
set y = GetUnitY(fd.dum)
set targetX = GetUnitX(fd.t)
set targetY = GetUnitY(fd.t)
set dx = x - targetX
set dy = y - targetY
set distance = SquareRoot(dx * dx + dy * dy)
set rad = Atan2(targetY - y, targetX - x)
if(distance < UPGRADE2_DISTANCE_HIT) then
set fd.d = 0.0
else
call SetUnitFacing(fd.dum, rad * bj_RADTODEG)
set x = x + fd.dm * Cos(rad)
set y = y + fd.dm * Sin(rad)
call SetUnitX(fd.dum, x)
call SetUnitY(fd.dum, y)
if(not fd.f) then
set damage = 0.0
set j = 0
loop
exitwhen(j >= Total)
set sd = Ar[j]
if(sd.u == fd.u) then
set copy = CopyGroup(sd.gp)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not fd.f) then
set fId = GetUnitUserData(f)
set targetX = GetUnitX(f)
set targetY = GetUnitY(f)
set dx = x - targetX
set dy = y - targetY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= UPGRADE2_RADIUS_PASS_FIRE) then
set fd.f = true
set damage = damage + LoadReal(sd.ht, fId, 2)
endif
endif
endloop
set j = Total
endif
set j = j + 1
endloop
set fd.dd = fd.dd + damage
else
call DestroyEffect(AddSpecialEffectTarget(UPGRADE_ATTACK_EFFECT, fd.dum, "origin"))
endif
endif
else
call KillUnit(fd.dum)
set fd.dd = fd.dd * fd.md
if(IsUnitType(fd.t, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(fd.u, fd.t, fd.dd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(fd.u, fd.t, fd.dd, true, false, A_TYPE, D_TYPE, null)
endif
call fd.destroy()
set Ar2[i] = Ar2[Total2 - 1]
set Total2 = Total2 - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total2 == 0 then
call PauseTimer(Tim2)
endif
endfunction
//----------------------------------------------------------------
private function Attack_Actions takes nothing returns nothing
local FireBall_Data fd = FireBall_Data.create()
local unit attacker = GetAttacker()
local real attackerX = GetUnitX(attacker)
local real attackerY = GetUnitY(attacker)
local player owner = GetOwningPlayer(attacker)
local real face = GetUnitFacing(attacker)
local unit attacked = GetTriggerUnit()
local real attackedX = GetUnitX(attacked)
local real attackedY = GetUnitY(attacked)
local integer item1 = IsUnitHasItemType(attacker, ITEM2_UPGRADE1)
local integer item2 = IsUnitHasItemType(attacker, ITEM2_UPGRADE2)
set fd.u = attacker
set fd.o = owner
set fd.t = attacked
set fd.dum = CreateUnit(owner, UPGRADE2_DUMMY_ID, attackerX, attackerY, face)
set fd.dm = UPGRADE2_DUMMY_DISTANCE_MOVE
set fd.d = UPGRADE2_DUMMY_DURATION
set fd.f = false
set fd.dd = 0.0
set fd.md = 0.0
if(item1 > 0) then
set fd.md = fd.md + (UPGRADE2_PERCENT1 * item1)
endif
if(item2 > 0) then
set fd.md = fd.md + (UPGRADE2_PERCENT2 * item2)
endif
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = fd
call GroupAddUnit(Cooldown, attacker)
call TriggerSleepAction(COOLDOWN)
call GroupRemoveUnit(Cooldown, attacker)
set attacker = null
set owner = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Attack_Conditions takes nothing returns boolean
local unit attacker = GetAttacker()
local player owner = GetOwningPlayer(attacker)
local unit attacked = GetTriggerUnit()
local integer item1 = IsUnitHasItemType(attacker, ITEM2_UPGRADE1)
local integer item2 = IsUnitHasItemType(attacker, ITEM2_UPGRADE2)
local boolean okey = GetUnitAbilityLevel(attacker, SPELL_ID) > 0 and /*
*/(item1 > 0 or item2 > 0) and /*
*/(not IsUnitInGroup(attacker, Cooldown)) and /*
*/IsUnitEnemy(attacked, owner)
set attacker = null
set owner = null
set attacked = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(FireWallLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(FireWallLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(FireWallLearnTrg, function Learn_Actions)
call TriggerRegisterAnyUnitEventBJ(FireWallTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(FireWallTrg, Condition(function Conditions))
call TriggerAddAction(FireWallTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(FireWallAttackTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(FireWallAttackTrg, Condition(function Attack_Conditions))
call TriggerAddAction(FireWallAttackTrg, function Attack_Actions)
//Setting globals
set all = CreateGroup()
set copy = CreateGroup()
set copy2 = CreateGroup()
set Tim = CreateTimer()
set Total = 0
set Tim2 = CreateTimer()
set Total2 = 0
set bexpr = Condition(function Pick)
set loc = Location(0, 0)
set Cooldown = CreateGroup()
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call AbilityPreload(ABILITY_ID)
call Preload(EXPLODE_EFFECT)
endfunction
endscope
//TESH.scrollpos=653
//TESH.alwaysfold=0
globals
group StormCalledDummy = CreateGroup()
endglobals
scope StormCalled initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A05D' //Spell Storm Called rawcode
private constant integer ABILITY_ID = 'A05F' //Ability Spirit Bond rawcode
private constant integer DUMMY_ID = 'n00T' //Electric rawcode
private constant real STARTING_ROTATION_SPEED = 42.0 //Rotation speed (degree per interval)
private constant real SPEED_DECELERATE = 2.5 //Speed deceleration
private constant real STARTING_ACCELERATION = 8 //Speed acceleration
private constant real DAMAGE_TO_TREES = 5.0 //Damage to trees
private constant string LIGHTNING_ID = "CHIM" //Lightning impact rawcode
private constant real KNOCKBACK_DURATION = 0.4 //Duration knock
private constant real LIGHTNING_TIME = 0.5 //Lightning time
private constant integer ITEM1_UPGRADE1 = 'I001' //Item Acolyte Mantle
private constant integer ITEM1_UPGRADE2 = 'I027' //Item Mindseer of Ultimate
private constant integer ITEM2_UPGRADE1 = 'I01J' //Item Lightning Gripper
private constant integer ITEM2_UPGRADE2 = 'I028' //Item Stormanifer
private constant real UPGRADE1_RADIUS1 = 100.0 //Upgrade item 1 radius 1
private constant real UPGRADE1_RADIUS2 = 200.0 //Upgrade item 1 radius 2
private constant integer UPGRADE2_ELECTRIC1 = 1 //Upgrade item 1 electric addition 1
private constant integer UPGRADE2_ELECTRIC2 = 2 //Upgrade item 1 electric addition 2
private constant real UPGRADE2_RADIUS_DAMAGE1 = 100.0 //Upgrade item 2 radius damage 1
private constant real UPGRADE2_RADIUS_DAMAGE2 = 200.0 //Upgrade item 2 radius damage 2
private constant integer SPIRIT_BOND_ITEM1_UPGRADE1 = 'prvt' //Item Periapt of Vitality
private constant integer SPIRIT_BOND_ITEM1_UPGRADE2 = 'rhth' //Item Zemi of Eternal
private constant integer SPIRIT_BOND_ITEM1_UPGRADE3 = 'I015' //Item Orb of Descent
private constant integer SPIRIT_BOND_ITEM2_UPGRADE1 = 'penr' //Item Gratify Rosary
private constant integer SPIRIT_BOND_ITEM2_UPGRADE2 = 'pmna' //Item Pendant of Innerforce
private constant integer SPIRIT_BOND_ITEM2_UPGRADE3 = 'I01V' //Item Power Fragment
private constant real SPIRIT_BOND_UPGRADE1_LIFE_REGENERATION1 = 5.0 //Spirit bond upgrade 1 regeneration 1
private constant real SPIRIT_BOND_UPGRADE1_LIFE_REGENERATION2 = 10.0 //Spirit bond upgrade 1 regeneration 2
private constant real SPIRIT_BOND_UPGRADE1_LIFE_REGENERATION3 = 15.0 //Spirit bond upgrade 1 regeneration 3
private constant real SPIRIT_BOND_UPGRADE2_MANA_REGENERATION1 = 3.0 //Spirit bond upgrade 1 regeneration 1
private constant real SPIRIT_BOND_UPGRADE2_MANA_REGENERATION2 = 6.0 //Spirit bond upgrade 1 regeneration 2
private constant real SPIRIT_BOND_UPGRADE2_MANA_REGENERATION3 = 9.0 //Spirit bond upgrade 1 regeneration 3
private constant string SPELL_EFFECT = "Abilities\\Weapons\\FarseerMissile\\FarseerMissile.mdl" //Spell effect
private constant string DAMAGE_EFFECT = "Abilities\\Spells\\Human\\Thunderclap\\ThunderClapCaster.mdl" //Damage effect
private constant string TRACKING_SENSE_EFFECT = "Abilities\\Spells\\Items\\AIma\\AImaTarget.mdl" //Stack Tracking Sense effect
private constant attacktype A_TYPE = ATTACK_TYPE_CHAOS //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_LIGHTNING //Spell attack type
endglobals
//Damage deal
private function Damage takes integer level returns real
if(level == 1) then
return 100.0
elseif(level == 2) then
return 200.0
else
return 0.0
endif
endfunction
//Damage deal
private function Electric_Damage takes integer level returns real
if(level == 1) then
return 2.0
elseif(level == 2) then
return 3.0
else
return 0.0
endif
endfunction
//Percent
private function Percentage takes integer level returns real
return 0.1 + (0.1 * level)
endfunction
//Radius of area of effect
private function Radius takes integer level returns real
return 300.0 + (0.0 * level)
endfunction
//Radius of area of effect
private function Electric_Radius takes integer level returns real
return 100.0 + (0.0 * level)
endfunction
//Number of rotation
private function Rotation takes integer level returns integer
return 3 + (0 * level)
endfunction
//Number of electric
private function Electric takes integer level returns integer
return 3 + (0 * level)
endfunction
//Bond effect with tracking sense
private function Bond_TrackingSense takes integer level returns real
return 30.0 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_FLYING) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct StormCalled_Data
unit u //Unit caster
player o //Owner of caster
integer l //Spell level
integer e //Number of electric
unit array c[10] //Electric dummy
real ae //Angle between electric
real x //Target x
real y //Target y
real d //Total radius
real dM //Max radius
real r //Target radius
real n //Total rotation
real a //Angle
real t //Rotation speed
real td //Rotation speed acceleration
real dr //Damage radius
real dd //Damage deal
real er //Electric radius
real ed //Electric damage
boolean p //Pull
boolean rv //Effect reverse
boolean end //Check end radius
lightning li //Lightning
real lt //Lightning time
fogmodifier fm //Fog modifier
boolean up //Upgrade
real lr //Life regeneration
real mr //Mana regeneration
endstruct
//----------------------------------------------------------------
globals
private location loc
private timer Tim
private integer Total
private StormCalled_Data array Ar[10]
private group all
private group copy
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local StormCalled_Data sd
local integer i = 0
local integer j = 0
local real tX = 0.0
local real tY = 0.0
local real radDecrement = 0.0
local unit f = null
local real fX = 0.0
local real fY = 0.0
local real fAngle = 0.0
local real dx = 0.0
local real dy = 0.0
local real fDistance = 0.0
local integer levelBond = 0
local real distance = 0.0
local boolean exist = false
local boolean stackEarthTremble = false
local boolean stackFireWall = false
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.r == 0 and not sd.end) then
set levelBond = GetUnitAbilityLevel(sd.u, ABILITY_ID)
set stackEarthTremble = false
if(levelBond > 0) then
set exist = false
set copy = CopyGroup(EarthTrembleDummy)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == sd.o and (not exist)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = sd.x - fX
set dy = sd.y - fY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= sd.dr) then
set exist = true
endif
endif
endloop
if(exist) then
set stackEarthTremble = true
endif
endif
call DestroyEffect(AddSpecialEffect(DAMAGE_EFFECT, sd.x, sd.y))
call GroupEnumUnitsInRange(all, sd.x, sd.y, sd.dr, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (IsUnitEnemy(f, sd.o)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
if(stackEarthTremble) then
call SetUnitPosition(f, sd.x, sd.y)
endif
endif
endloop
call MoveLocation(loc, sd.x, sd.y)
set sd.li = AddLightningEx(LIGHTNING_ID, true, sd.x, sd.y, 4000.0, sd.x, sd.y, GetLocationZ(loc))
set sd.lt = LIGHTNING_TIME
set j = 0
loop
exitwhen(j >= sd.e)
set sd.c[j] = CreateUnit(sd.o, DUMMY_ID, sd.x, sd.y, bj_UNIT_FACING)
call GroupAddUnit(StormCalledDummy, sd.c[j])
set j = j + 1
endloop
set sd.r = sd.r + 1
elseif(sd.r < sd.dM and not sd.end)then
set sd.a = sd.a - sd.t
set sd.t = sd.t - sd.td
set sd.td = sd.td / SPEED_DECELERATE
set radDecrement = sd.d / ((sd.n * 360) / sd.t)
set sd.r = sd.r + radDecrement
if(sd.lt > 0) then
set sd.lt = sd.lt - Interval()
else
call DestroyLightning(sd.li)
set sd.li = null
endif
set levelBond = GetUnitAbilityLevel(sd.u, ABILITY_ID)
set stackFireWall = false
set j = 0
loop
exitwhen(j >= sd.e)
set tX = sd.x + sd.r * Cos((sd.a + j * sd.ae) * bj_DEGTORAD)
set tY = sd.y + sd.r * Sin((sd.a + j * sd.ae) * bj_DEGTORAD)
if(tX > WorldBounds.minX + 300.0 and /*
*/tX < WorldBounds.maxX - 300.0 and /*
*/tY > WorldBounds.minY + 300.0 and /*
*/tY < WorldBounds.maxY - 300.0 and (not IsWall(tX, tY, 100.0))) then
call SetUnitX(sd.c[j], tX)
call SetUnitY(sd.c[j], tY)
endif
call SetUnitAnimation(sd.c[j], "Death")
if(levelBond > 0) then
set exist = false
set copy = CopyGroup(FireWallDummy)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == sd.o and (not exist)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = tX - fX
set dy = tY - fY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= sd.er) then
set exist = true
endif
endif
endloop
if(exist) then
set stackFireWall = true
call GroupEnumUnitsInRange(all, tX, tY, sd.er * 2, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (IsUnitEnemy(f, sd.o)) then
if(sd.p) then
call SetUnitX(f, tX)
call SetUnitY(f, tY)
endif
endif
endloop
endif
endif
call GroupEnumUnitsInRange(all, tX, tY, sd.er, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (IsUnitEnemy(f, sd.o)) then
if(sd.p) then
call SetUnitX(f, tX)
call SetUnitY(f, tY)
call UnitDamageTarget(sd.u, f, sd.ed, true, false, A_TYPE, D_TYPE, null)
endif
endif
endloop
call HitTree(tX, tY, sd.dr, DAMAGE_TO_TREES, 0.1)
set j = j + 1
endloop
elseif(not sd.end) then
set sd.end = true
if(sd.up) then
set j = 0
loop
exitwhen(j >= sd.e)
set tX = GetUnitX(sd.c[j])
set tY = GetUnitY(sd.c[j])
call DestroyEffect(AddSpecialEffect(DAMAGE_EFFECT, tX, tY))
set j = j + 1
endloop
endif
elseif(sd.r > 0 and sd.end and sd.rv) then
set sd.a = sd.a + sd.t
set sd.t = sd.t - sd.td
set sd.td = sd.td / SPEED_DECELERATE
set radDecrement = sd.d / ((sd.n * 360) / sd.t)
set sd.r = sd.r - radDecrement
set levelBond = GetUnitAbilityLevel(sd.u, ABILITY_ID)
set stackFireWall = false
set j = 0
loop
exitwhen(j >= sd.e)
set tX = sd.x + sd.r * Cos((sd.a + j * sd.ae) * bj_DEGTORAD)
set tY = sd.y + sd.r * Sin((sd.a + j * sd.ae) * bj_DEGTORAD)
call SetUnitX(sd.c[j], tX)
call SetUnitY(sd.c[j], tY)
call SetUnitAnimation(sd.c[j], "Death")
if(levelBond > 0) then
set exist = false
set copy = CopyGroup(FireWallDummy)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == sd.o and (not exist)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = tX - fX
set dy = tY - fY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= sd.er) then
set exist = true
endif
endif
endloop
if(exist) then
set stackFireWall = true
call GroupEnumUnitsInRange(all, tX, tY, sd.er * 2, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (IsUnitEnemy(f, sd.o)) then
if(sd.p) then
call SetUnitX(f, tX)
call SetUnitY(f, tY)
endif
endif
endloop
endif
endif
call GroupEnumUnitsInRange(all, tX, tY, sd.er, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (IsUnitEnemy(f, sd.o)) then
if(sd.p) then
call SetUnitX(f, tX)
call SetUnitY(f, tY)
call UnitDamageTarget(sd.u, f, sd.ed, true, false, A_TYPE, D_TYPE, null)
endif
endif
endloop
call HitTree(tX, tY, sd.dr, DAMAGE_TO_TREES, 0.1)
set j = j + 1
endloop
elseif(sd.end and sd.rv) then
set levelBond = GetUnitAbilityLevel(sd.u, ABILITY_ID)
set stackEarthTremble = false
if(levelBond > 0) then
set exist = false
set copy = CopyGroup(EarthTrembleDummy)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == sd.o and (not exist)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = sd.x - fX
set dy = sd.y - fY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= sd.dr) then
set exist = true
endif
endif
endloop
if(exist) then
set stackEarthTremble = true
endif
if(sd.lr > 0 or sd.mr > 0) then
set copy = CopyGroup(TrackingSenseDummy)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == sd.o and (not exist)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = sd.x - fX
set dy = sd.y - fY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= sd.dr) then
call DestroyEffect(AddSpecialEffectTarget(TRACKING_SENSE_EFFECT, sd.u, "origin"))
if(sd.lr > 0.0) then
call SetUnitState(sd.u, UNIT_STATE_LIFE, GetUnitState(sd.u, UNIT_STATE_LIFE) + sd.lr)
endif
if(sd.mr > 0.0) then
call SetUnitState(sd.u, UNIT_STATE_MANA, GetUnitState(sd.u, UNIT_STATE_MANA) + sd.mr)
endif
endif
endif
endloop
endif
endif
call DestroyEffect(AddSpecialEffect(DAMAGE_EFFECT, sd.x, sd.y))
call GroupEnumUnitsInRange(all, sd.x, sd.y, sd.dr, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (IsUnitEnemy(f, sd.o)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
if(stackEarthTremble) then
call SetUnitPosition(f, sd.x, sd.y)
endif
endif
endloop
call MoveLocation(loc, sd.x, sd.y)
set sd.li = AddLightningEx(LIGHTNING_ID, true, sd.x, sd.y, 4000.0, sd.x, sd.y, GetLocationZ(loc))
set sd.lt = LIGHTNING_TIME
set sd.rv = false
elseif(sd.lt > 0) then
set sd.lt = sd.lt - Interval()
else
call DestroyLightning(sd.li)
set sd.li = null
call FogModifierStop(sd.fm)
call DestroyFogModifier(sd.fm)
set sd.fm = null
set j = 0
loop
exitwhen(j >= sd.e)
call KillUnit(sd.c[j])
call GroupRemoveUnit(StormCalledDummy, sd.c[j])
set sd.c[j] = null
set j = j + 1
endloop
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local StormCalled_Data sd = StormCalled_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer spellID = GetSpellAbilityId()
local player owner = GetOwningPlayer(caster)
local integer level = GetUnitAbilityLevel(caster, spellID)
local integer levelBond = GetUnitAbilityLevel(caster, ABILITY_ID)
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local real extraRadius = 0.0
local integer bondItem1 = IsUnitHasItemType(caster, SPIRIT_BOND_ITEM1_UPGRADE1)
local integer bondItem2 = IsUnitHasItemType(caster, SPIRIT_BOND_ITEM1_UPGRADE2)
local integer bondItem3 = IsUnitHasItemType(caster, SPIRIT_BOND_ITEM1_UPGRADE3)
local integer bondItem4 = IsUnitHasItemType(caster, SPIRIT_BOND_ITEM2_UPGRADE1)
local integer bondItem5 = IsUnitHasItemType(caster, SPIRIT_BOND_ITEM2_UPGRADE2)
local integer bondItem6 = IsUnitHasItemType(caster, SPIRIT_BOND_ITEM2_UPGRADE3)
local real life = 0.0
local real mana = 0.0
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_SC_StormCalled
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
set loc = GetSpellTargetLoc()
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.e = Electric(level)
if(item3 > 0) then
set sd.e = sd.e + (UPGRADE2_ELECTRIC1 * item3)
endif
if(item4 > 0) then
set sd.e = sd.e + (UPGRADE2_ELECTRIC2 * item4)
endif
set sd.ae = 360.0 / sd.e
set sd.x = GetLocationX(loc)
set sd.y = GetLocationY(loc)
set sd.d = Radius(level)
if(item1 > 0) then
set sd.d = sd.d + (UPGRADE1_RADIUS1 * item1)
endif
if(item2 > 0) then
set sd.d = sd.d + (UPGRADE1_RADIUS2 * item2)
endif
set sd.dM = sd.d
set sd.r = 0.0
set sd.n = Rotation(level)
set sd.a = GetUnitFacing(caster)
set sd.t = STARTING_ROTATION_SPEED
set sd.td = STARTING_ACCELERATION
set sd.dr = Radius(level)
set sd.dd = Damage(level)
set sd.dd = sd.dd + (sd.dd * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.er = Electric_Radius(level)
if(item3 > 0) then
set extraRadius = UPGRADE2_RADIUS_DAMAGE1
endif
if(item4 > 0) then
set extraRadius = UPGRADE2_RADIUS_DAMAGE2
endif
set sd.er = sd.er + extraRadius
set sd.ed = Electric_Damage(level)
set sd.ed = sd.ed + (sd.ed * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.p = true
set sd.rv = false
set sd.end = false
set sd.fm = CreateFogModifierRadius(owner, FOG_OF_WAR_VISIBLE, sd.x, sd.y, sd.d, true, false)
call FogModifierStart(sd.fm)
set sd.up = false
set sd.lr = 0.0
set sd.mr = 0.0
if(bondItem1 > 0) then
set life = life + (SPIRIT_BOND_UPGRADE1_LIFE_REGENERATION1 * bondItem1 * levelBond)
endif
if(bondItem2 > 0) then
set life = life + (SPIRIT_BOND_UPGRADE1_LIFE_REGENERATION2 * bondItem2 * levelBond)
endif
if(bondItem3 > 0) then
set life = life + (SPIRIT_BOND_UPGRADE1_LIFE_REGENERATION3 * bondItem3 * levelBond)
endif
if(bondItem4 > 0) then
set mana = mana + (SPIRIT_BOND_UPGRADE2_MANA_REGENERATION1 * bondItem4 * levelBond)
endif
if(bondItem5 > 0) then
set mana = mana + (SPIRIT_BOND_UPGRADE2_MANA_REGENERATION2 * bondItem5 * levelBond)
endif
if(bondItem6 > 0) then
set mana = mana + (SPIRIT_BOND_UPGRADE2_MANA_REGENERATION3 * bondItem6 * levelBond)
endif
set sd.lr = life
set sd.mr = mana
if(item2 > 0) then
set sd.rv = true
endif
if(item1 > 0 or item2 > 0 or item3 > 0 or item4 > 0) then
set sd.up = true
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
set s = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(StormCalledTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(StormCalledTrg, Condition(function Conditions))
call TriggerAddAction(StormCalledTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set loc = Location(0, 0)
set all = CreateGroup()
set copy = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY_ID)
call Preload(SPELL_EFFECT)
call Preload(DAMAGE_EFFECT)
endfunction
endscope
//TESH.scrollpos=112
//TESH.alwaysfold=0
scope VigorousAttack initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A05N' //Spell Vigorous Attack rawcode
private constant integer ABILITY1_ID = 'A05O' //Ability Vigorous Attack (Damage +1) rawcode
private constant integer ABILITY2_ID = 'A05P' //Ability Vigorous Attack (Damage +10) rawcode
private constant integer ABILITY3_ID = 'A05Q' //Ability Vigorous Attack (Damage +100) rawcode
private constant real INTERVAL_DURATION = 1.0 //Interval duration to attack
private constant integer ITEM1_UPGRADE1 = 'I008' //Item Mania Cestus
private constant integer ITEM1_UPGRADE2 = 'I011' //Item Fist of Firebringer
private constant integer ITEM2_UPGRADE1 = 'I01A' //Item Fatal Cleaver
private constant integer ITEM2_UPGRADE2 = 'I01C' //Item Sagaris Carnage
private constant real UPGRADE1_DURATION1 = 0.5 //Upgrade 1 effect 1
private constant real UPGRADE1_DURATION2 = 1.0 //Upgrade 1 effect 2
private constant integer UPGRADE2_DAMAGE1 = 1 //Upgrade 2 effect 1
private constant integer UPGRADE2_DAMAGE2 = 2 //Upgrade 2 effect 2
private constant integer UPGRADE2_MAX_DAMAGE1 = 30 //Upgrade 2 effect 1
private constant integer UPGRADE2_MAX_DAMAGE2 = 60 //Upgrade 2 effect 2
private constant string SPELL_EFFECT = "Abilities\\Weapons\\DemolisherFireMissile\\DemolisherFireMissile.mdl" //Effect maximum
private constant real DISTANCE_FACTOR = 10.0 //Distance factor
endglobals
//Strength increase
private function Damage_Per_Distance takes integer level returns integer
if(level == 1) then
return 2
elseif(level == 2) then
return 4
elseif(level == 3) then
return 6
else
return 0
endif
endfunction
//Max damage
private function Max_Damage takes integer level returns integer
if(level == 1) then
return 60
elseif(level == 2) then
return 120
elseif(level == 3) then
return 200
else
return 0
endif
endfunction
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct VigorousAttack_Data
unit u //Unit caster
player o //Owner of caster
real cX //Caster x
real cY //Caster y
real i //Delay
integer du //Damage updater
boolean a //Attack
integer d //Damage
integer dm //Max damage
integer dpd //Damage per distance
effect e //Effect max damage
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private VigorousAttack_Data array Ar[10]
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local VigorousAttack_Data sd
local integer i = 0
local real x = 0.0
local real y = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local integer totalDistance = 0
local integer totalDamage = 0
local integer damage = 0
local integer lvl = 0
local integer item3 = 0
local integer item4 = 0
local integer extraDamage = 0
local integer extraMaxDamage = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
if(sd.cX == x and sd.cY == y) then
else
if((not sd.a) and sd.d < 1000) then
set item3 = IsUnitHasItemType(sd.u, ITEM2_UPGRADE1)
set item4 = IsUnitHasItemType(sd.u, ITEM2_UPGRADE2)
if(item3 > 0) then
set extraDamage = extraDamage + (UPGRADE2_DAMAGE1 * item3)
set extraMaxDamage = extraMaxDamage + (UPGRADE2_MAX_DAMAGE1 * item3)
endif
if(item4 > 0) then
set extraDamage = extraDamage + (UPGRADE2_DAMAGE2 * item4)
set extraMaxDamage = extraMaxDamage + (UPGRADE2_MAX_DAMAGE2 * item4)
endif
set dx = x - sd.cX
set dy = y - sd.cY
set distance = SquareRoot(dx * dx + dy * dy) / DISTANCE_FACTOR
set totalDistance = R2I(distance)
set totalDamage = sd.d + totalDistance * (sd.dpd + extraDamage)
set totalDamage = IMinBJ(totalDamage, sd.dm + extraMaxDamage)
set damage = totalDamage
set lvl = damage / 100
call SetUnitAbilityLevel(sd.u, ABILITY3_ID, lvl+1)
set damage = ModuloInteger(damage, 100)
set lvl = damage / 10
call SetUnitAbilityLevel(sd.u, ABILITY2_ID, lvl+1)
set damage = ModuloInteger(damage, 10)
set lvl = damage / 1
call SetUnitAbilityLevel(sd.u, ABILITY1_ID, lvl+1)
set sd.d = totalDamage
if(totalDamage == sd.dm and sd.e == null) then
set sd.e = AddSpecialEffectTarget(SPELL_EFFECT, sd.u, "weapon")
endif
endif
set sd.cX = x
set sd.cY = y
endif
if(sd.a) then
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set damage = sd.du
set lvl = damage / 100
call SetUnitAbilityLevel(sd.u, ABILITY3_ID, lvl+1)
set damage = ModuloInteger(damage, 100)
set lvl = damage / 10
call SetUnitAbilityLevel(sd.u, ABILITY2_ID, lvl+1)
set damage = ModuloInteger(damage, 10)
set lvl = damage / 1
call SetUnitAbilityLevel(sd.u, ABILITY1_ID, lvl+1)
if(sd.e != null) then
call DestroyEffect(sd.e)
set sd.e = null
endif
set sd.d = sd.du
set sd.a = false
endif
endif
set i = i + 1
endloop
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit attacker = GetAttacker()
local player owner = GetOwningPlayer(attacker)
local integer ownerNum = GetPlayerId(owner)
local VigorousAttack_Data sd
local integer i = 0
local integer item1 = IsUnitHasItemType(attacker, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(attacker, ITEM1_UPGRADE2)
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == attacker) then
if(sd.d > 0) then
set sd.i = INTERVAL_DURATION
set sd.du = 0
set sd.a = true
if(item1 > 0) then
set sd.i = sd.i + (UPGRADE1_DURATION1 * item1)
endif
if(item2 > 0) then
set sd.i = sd.i + (UPGRADE1_DURATION2 * item2)
endif
endif
set i = Total
endif
set i = i + 1
endloop
set attacker = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit attacker = GetAttacker()
local boolean okey = GetUnitAbilityLevel(attacker, SPELL_ID) > 0
set attacker = null
return okey
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local unit learner = GetLearningUnit()
local integer learnerType = GetUnitTypeId(learner)
local player owner = GetOwningPlayer(learner)
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
local VigorousAttack_Data sd
local integer i = 0
local boolean exist = false
if(GetUnitAbilityLevel(learner, SPELL_ID) <= 1) then
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set exist = true
set sd.dm = Max_Damage(level)
set sd.dpd = Damage_Per_Distance(level)
endif
set i = i + 1
endloop
if(not exist) then
set sd = VigorousAttack_Data.create()
set sd.u = learner
set sd.o = owner
set sd.cX = GetUnitX(learner)
set sd.cY = GetUnitY(learner)
set sd.i = 0
set sd.d = 0
set sd.dm = Max_Damage(level)
set sd.dpd = Damage_Per_Distance(level)
call UnitAddAbility(learner, ABILITY1_ID)
call UnitAddAbility(learner, ABILITY2_ID)
call UnitAddAbility(learner, ABILITY3_ID)
call UnitMakeAbilityPermanent(learner, true, ABILITY1_ID)
call UnitMakeAbilityPermanent(learner, true, ABILITY2_ID)
call UnitMakeAbilityPermanent(learner, true, ABILITY3_ID)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
else
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set sd.dm = Max_Damage(level)
set sd.dpd = Damage_Per_Distance(level)
endif
set i = i + 1
endloop
endif
set learner = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
local unit learner = GetTriggerUnit()
local boolean okey = (GetLearnedSkill() == SPELL_ID) and (not IsUnitIllusion(GetTriggerUnit()))
set learner = null
return okey
endfunction
//----------------------------------------------------------------
function GetVigorousDamage takes unit u returns integer
local VigorousAttack_Data sd
local integer i = 0
local integer damage = 0
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == u) then
if(sd.d > 0) then
set damage = sd.d
endif
set i = Total
endif
set i = i + 1
endloop
set u = null
return damage
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(VigorousAttackTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(VigorousAttackTrg, Condition(function Conditions))
call TriggerAddAction(VigorousAttackTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(VigorousAttackLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(VigorousAttackLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(VigorousAttackLearnTrg, function Learn_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY1_ID)
call AbilityPreload(ABILITY2_ID)
call AbilityPreload(ABILITY3_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=439
//TESH.alwaysfold=0
scope Pulverize initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A05I' //Spell Pulverize rawcode
private constant integer CAST_ID = 'A05R' //Spell Pulverize (Dummy) rawcode
private constant string SPELL_EFFECT = "abilities\\weapons\\DemolisherMissile\\DemolisherMissile.mdl" //Effect hit
private constant real MAX_DISTANCE = 2500.0 //Max distance allowed
private constant real KNOCKBACK_DISTANCE = 70 //Distance knock per time
private constant real KNOCKBACK_DURATION = 0.4 //Duration knock
private constant real DAMAGE_TO_TREES = 30.0 //Damage to trees
private constant real DELAY = 0.5 //Delay
private constant integer ANIME = 6 //Animation attack index
private constant integer ITEM1_UPGRADE1 = 'rat6' //Item Sturdy War Axe
private constant integer ITEM1_UPGRADE2 = 'I01B' //Item Chromium Arc
private constant integer ITEM1_UPGRADE3 = 'anfg' //Item Brutalic
private constant integer ITEM2_UPGRADE1 = 'brac' //Item Giant Belt
private constant integer ITEM2_UPGRADE2 = 'ward' //Item Drum of Horde
private constant integer ITEM2_UPGRADE3 = 'I01H' //Item Wrist of Hercules
private constant real UPGRADE1_DURATION1 = 0.5 //Upgrade 1 effect 1
private constant real UPGRADE1_DURATION2 = 1.0 //Upgrade 1 effect 2
private constant real UPGRADE1_DURATION3 = 1.5 //Upgrade 1 effect 3
private constant real UPGRADE1_DISTANCE3 = 1500.0 //Upgrade 1 effect 3
private constant real UPGRADE2_DAMAGE1 = 50.0 //Upgrade 2 effect 1
private constant real UPGRADE2_DAMAGE2 = 100.0 //Upgrade 2 effect 2
private constant real UPGRADE2_DAMAGE3 = 150.0 //Upgrade 2 effect 3
private constant real UPGRADE2_RADIUS1 = 50.0 //Upgrade 2 effect 1
private constant real UPGRADE2_RADIUS2 = 100.0 //Upgrade 2 effect 2
private constant real UPGRADE2_RADIUS3 = 200.0 //Upgrade 2 effect 3
private constant integer VIGOROUS_ATTACK_SPELL_ID = 'A05N' //Spell Vigorous Attack rawcode
private constant integer VIGOROUS_ATTACK_ITEM3_UPGRADE1 = 'I00N' //Item Mortise Timbercutter
private constant integer VIGOROUS_ATTACK_ITEM3_UPGRADE2 = 'mlst' //Item Vehemence
private constant integer VIGOROUS_ATTACK_ITEM3_UPGRADE3 = 'I00O' //Item Arcanite Reaver
private constant real VIGOROUS_ATTACK_UPGRADE3_PERCENT1 = 0.15 //Vigorous attack upgrade 3 percent influence 1
private constant real VIGOROUS_ATTACK_UPGRADE3_PERCENT2 = 0.30 //Vigorous attack upgrade 3 percent influence 2
private constant real VIGOROUS_ATTACK_UPGRADE3_PERCENT3 = 0.50 //Vigorous attack upgrade 3 percent influence 3
private constant attacktype A_TYPE = ATTACK_TYPE_SIEGE //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_DEMOLITION //Spell damage type
endglobals
//Damage base
private function Damage takes integer level returns real
if(level == 1) then
return 150.0
elseif(level == 2) then
return 200.0
elseif(level == 3) then
return 250.0
elseif(level == 4) then
return 300.0
else
return 0.0
endif
endfunction
//Distance walk
private function Distance takes integer level returns real
return 1500.0 + (0.0 * level)
endfunction
//Duration between charges
private function Duration takes integer level returns real
return 3.0 + (0.0 * level)
endfunction
//Warstomp radius
private function Radius takes integer level returns real
return 400 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_FLYING) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Pulverize_Data
unit u //Unit caster
integer uID //Caster id
player o //Player owner of caster
integer l //Spell level
group g //Group target
unit t //Unit target
real d //Duration cast
real dl //Delay
boolean s //Stop cast
boolean b //Casting spell
real tX //Target x
real tY //Target y
real ds //Max distance
real cos //Cos of angle cast
real sin //Sin of angle cast
real q //Time travel
real d1 //Distance
real d2 //Distance decelerate
real dd //Damage deal
real rd //Radius detect
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Pulverize_Data array Ar[10]
private group all
private boolexpr bexpr
private location loc
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Pulverize_Data sd
local integer i = 0
local real rad = 0.0
local real cX = 0.0
local real cY = 0.0
local real tX = 0.0
local real tY = 0.0
local real angle = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local unit f = null
local real fAngle = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.b) then
if(not sd.s) then
if(sd.d > 0.0) then
set sd.d = sd.d - Interval()
set cX = GetUnitX(sd.u)
set cY = GetUnitY(sd.u)
if(sd.t != null) then
set tX = GetUnitX(sd.t)
set tY = GetUnitY(sd.t)
else
set tX = sd.tX
set tY = sd.tY
endif
set rad = Atan2(tY - cY, tX - cX)
set angle = rad * bj_RADTODEG
call SetUnitFacing(sd.u, angle)
set dx = cX - tX
set dy = cY - tY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance > sd.ds) then
set sd.b = false
endif
else
set sd.s = true
call IssueImmediateOrder(sd.u, "stop")
// call UnitAddAbility(sd.u, 'Abun')
call PauseUnit(sd.u, true)
call SetUnitAnimationByIndex(sd.u, ANIME)
set cX = GetUnitX(sd.u)
set cY = GetUnitY(sd.u)
if(sd.t != null) then
set tX = GetUnitX(sd.t)
set tY = GetUnitY(sd.t)
else
set tX = sd.tX
set tY = sd.tY
endif
set rad = Atan2(tY - cY, tX - cX)
set sd.cos = Cos(rad)
set sd.sin = Sin(rad)
set dx = cX - tX
set dy = cY - tY
set distance = SquareRoot(dx * dx + dy * dy)
set sd.q = R2I(0.2 / Interval())
set sd.d1 = 2 * distance / (sd.q + 1)
set sd.d2 = sd.d1 / sd.q
endif
else
if(sd.dl > 0) then
set sd.dl = sd.dl - Interval()
elseif(sd.d1 > 0) then
set cX = GetUnitX(sd.u)
set cY = GetUnitY(sd.u)
set tX = cX + sd.d1 * sd.cos
set tY = cY + sd.d1 * sd.sin
if(tX > WorldBounds.minX + 300.0 and /*
*/tX < WorldBounds.maxX - 300.0 and /*
*/tY > WorldBounds.minY + 300.0 and /*
*/tY < WorldBounds.maxY - 300.0 and (not IsWall(tX, tY, 100.0)) and (not IsBarrel(sd.u, tX, tY, 100.0))) then
call SetUnitX(sd.u, tX)
call SetUnitY(sd.u, tY)
endif
//if(IsWall(sd.cX, sd.cY, 50.0) or IsWater(sd.cX, sd.cY, 50.0)) then
//set sd.d1 = 0
//else
//call SetUnitPosition(sd.u, sd.cX, sd.cY)
//endif
set sd.d1 = sd.d1 - sd.d2
call GroupEnumUnitsInRange(all, tX, tY, sd.rd, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
//if(IsUnitType(f, UNIT_TYPE_HERO)) then
//set sd.d1 = 0
//endif
if(not IsUnitInGroup(f, sd.g)) then
call GroupAddUnit(sd.g, f)
set fAngle = Atan2(GetUnitY(f) - tY, GetUnitX(f) - tX) * bj_RADTODEG
call Knockback(f, KNOCKBACK_DISTANCE, fAngle, KNOCKBACK_DURATION)
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
call TargetCast(sd.o, tX, tY, 0.5, CAST_ID, sd.l, "thunderbolt", 0, f)
endif
endif
endloop
//call ImmediateEffect(sd.o, sd.cX, sd.cY, 0.5, CAST_ID, sd.charge, "thunderclap", 0)
call HitTree(tX, tY, sd.rd, 5.0, 0.0)
else
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.u, "weapon"))
set sd.b = false
endif
endif
else
//call UnitRemoveAbility(sd.u, 'Abun')
call PauseUnit(sd.u, false)
call IssueImmediateOrder(sd.u, "stop")
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
set sd.u = null
set sd.o = null
set sd.t = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Pulverize_Data sd
local unit caster = GetTriggerUnit()
local player owner = GetOwningPlayer(caster)
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local unit target = GetSpellTargetUnit()
local real targetX = 0.0
local real targetY = 0.0
local boolean isNull = (Ar[Total] == null)
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item6 = IsUnitHasItemType(caster, ITEM2_UPGRADE3)
local real duration = 0.0
local real radius = 0.0
local integer levelVigorous = GetUnitAbilityLevel(caster, VIGOROUS_ATTACK_SPELL_ID)
local integer vigorousItem1 = IsUnitHasItemType(caster, VIGOROUS_ATTACK_ITEM3_UPGRADE1)
local integer vigorousItem2 = IsUnitHasItemType(caster, VIGOROUS_ATTACK_ITEM3_UPGRADE2)
local integer vigorousItem3 = IsUnitHasItemType(caster, VIGOROUS_ATTACK_ITEM3_UPGRADE3)
local real extraDamage = 0.0
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_GT_Pulverize
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
if(target == null) then
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
else
set targetX = GetUnitX(target)
set targetY = GetUnitY(target)
endif
if(isNull) then
set sd = Pulverize_Data.create()
set sd.g = CreateGroup()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.uID = casterID
set sd.o = owner
set sd.l = level
set sd.t = target
set sd.d = Duration(level)
set sd.dl = DELAY
set sd.s = false
set sd.b = true
set sd.tX = targetX
set sd.tY = targetY
set sd.ds = MAX_DISTANCE
set sd.cos = 0
set sd.sin = 0
set sd.q = 0
set sd.d1 = 0
set sd.d2 = 0
set sd.dd = Damage(level)
set sd.dd = sd.dd //+ (sd.dd * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.rd = Radius(level)
if(item1 > 0) then
set duration = UPGRADE1_DURATION1
endif
if(item2 > 0) then
set duration = UPGRADE1_DURATION2
endif
if(item3 > 0) then
set duration = UPGRADE1_DURATION3
set sd.ds = sd.ds + UPGRADE1_DISTANCE3
endif
set sd.d = sd.d - duration
if(item4 > 0) then
set sd.dd = sd.dd + (UPGRADE2_DAMAGE1 * item4)
set radius = UPGRADE2_RADIUS1
endif
if(item5 > 0) then
set sd.dd = sd.dd + (UPGRADE2_DAMAGE2 * item5)
set radius = UPGRADE2_RADIUS2
endif
if(item4 > 0) then
set sd.dd = sd.dd + (UPGRADE2_DAMAGE3 * item6)
set radius = UPGRADE2_RADIUS3
endif
set sd.rd = sd.rd + radius
if(levelVigorous > 0) then
if(vigorousItem1 > 0) then
set extraDamage = extraDamage + (GetVigorousDamage(caster) * VIGOROUS_ATTACK_UPGRADE3_PERCENT1 * vigorousItem1)
endif
if(vigorousItem2 > 0) then
set extraDamage = extraDamage + (GetVigorousDamage(caster) * VIGOROUS_ATTACK_UPGRADE3_PERCENT2 * vigorousItem2)
endif
if(vigorousItem3 > 0) then
set extraDamage = extraDamage + (GetVigorousDamage(caster) * VIGOROUS_ATTACK_UPGRADE3_PERCENT3 * vigorousItem3)
endif
set sd.dd = sd.dd + extraDamage
endif
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set owner = null
set target = null
set s = null
endfunction
//----------------------------------------------------------------
private function Stop_Actions takes nothing returns nothing
local Pulverize_Data sd
local unit caster = GetTriggerUnit()
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster and (not sd.s)) then
set sd.d = Interval()
set sd.dd = 0.0
endif
set i = i + 1
endloop
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(PulverizeTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(PulverizeTrg, Condition(function Conditions))
call TriggerAddAction(PulverizeTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(PulverizeStopTrg, EVENT_PLAYER_UNIT_SPELL_ENDCAST)
call TriggerAddCondition(PulverizeStopTrg, Condition(function Conditions))
call TriggerAddAction(PulverizeStopTrg, function Stop_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
set loc = Location(0, 0)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=299
//TESH.alwaysfold=0
scope Endurance initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A05M' //Spell Endurance rawcode
private constant real TIME_REMAIN = 30.0 //Time duration receiving regeneration
private constant real INTERVAL = 1.0 //Interval
private constant integer ITEM1_UPGRADE1 = 'rlif' //Item Runical Round
private constant integer ITEM1_UPGRADE2 = 'I00A' //Item Aurelian Ring
private constant integer ITEM1_UPGRADE3 = 'I01F' //Item Ataraxia Sparta
private constant integer ITEM1_UPGRADE4 = 'I01G' //Item Throne of Emperor
private constant integer ITEM2_UPGRADE1 = 'prvt' //Item Periapt of Vitality
private constant integer ITEM2_UPGRADE2 = 'rhth' //Item Zemi of Eternal
private constant integer ITEM2_UPGRADE3 = 'I015' //Item Orb of Descent
private constant real UPGRADE1_RADIUS1 = 100.0 //Upgrade 1 effect 1
private constant real UPGRADE1_RADIUS2 = 200.0 //Upgrade 1 effect 2
private constant real UPGRADE1_RADIUS3 = 300.0 //Upgrade 1 effect 3
private constant real UPGRADE1_RADIUS4 = 400.0 //Upgrade 1 effect 4
private constant real UPGRADE1_HEAL3 = 10.0 //Upgrade 1 effect 3
private constant real UPGRADE1_HEAL4 = 20.0 //Upgrade 1 effect 4
private constant real UPGRADE2_REGENERATION1 = 5.0 //Upgrade 2 effect 1
private constant real UPGRADE2_REGENERATION2 = 10.0 //Upgrade 2 effect 2
private constant real UPGRADE2_REGENERATION3 = 15.0 //Upgrade 2 effect 3
private constant real UPGRADE2_DURATION3 = 10.0 //Upgrade 2 effect 3
private constant string SPELL_EFFECT = "Abilities\\Spells\\Orc\\SpiritLink\\SpiritLinkZapTarget.mdl" //Heal effect
private constant string BUFF_EFFECT = "Abilities\\Spells\\Orc\\Voodoo\\VoodooAuraTarget.mdl" //Buff regeneration effect
endglobals
//Heal amount
private function Heal takes integer level returns real
if(level == 1) then
return 40.0
elseif(level == 2) then
return 60.0
elseif(level == 3) then
return 80.0
else
return 0.0
endif
endfunction
//Regeneration
private function Regeneration takes integer level returns real
if(level == 1) then
return 10.0 + (0.0 * level)
elseif(level == 2) then
return 20.0 + (0.0 * level)
elseif(level == 3) then
return 30.0 + (0.0 * level)
else
return 0.0
endif
endfunction
//Radius of effect
private function Radius takes integer level returns real
return 600.0 + (0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Endurance_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of spell
real r //Radius effect
real i //Interval
real im //Interval max
real h //Heal amount
boolean b //Check cast
real rd //Regeneration duration
real rg //Regeneration
endstruct
//----------------------------------------------------------------
struct EnduranceRegeneration_Data
unit u //Unit with regeneration ability
real t //Time remain
real r //Regeneration
real i //Interval
real im //Interval max
effect e //Effect
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Endurance_Data array Ar[10]
private timer Tim2
private integer Total2
private EnduranceRegeneration_Data array Ar2[100]
private group all
private boolexpr bexpr
private group endurance
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute2 takes nothing returns nothing
local EnduranceRegeneration_Data rd
local integer i = 0
loop
exitwhen(i >= Total2)
set rd = Ar2[i]
if(rd.t > 0 and (not IsUnitDead(rd.u))) then
set rd.t = rd.t - Interval()
if(rd.i > 0) then
set rd.i = rd.i - Interval()
else
set rd.i = rd.im
if(IsUnitType(rd.u, UNIT_TYPE_ETHEREAL)) then
call SetUnitState(rd.u, UNIT_STATE_LIFE, GetUnitState(rd.u, UNIT_STATE_LIFE) + rd.r * ETHEREAL_BONUS)
else
call SetUnitState(rd.u, UNIT_STATE_LIFE, GetUnitState(rd.u, UNIT_STATE_LIFE) + rd.r)
endif
endif
else
call GroupRemoveUnit(endurance, rd.u)
call DestroyEffect(rd.e)
set rd.e = null
set rd.u = null
set Ar2[i] = Ar2[Total2 - 1]
set Total2 = Total2 - 1
call rd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total2 == 0 then
call PauseTimer(Tim2)
endif
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Endurance_Data sd
local EnduranceRegeneration_Data rd
local integer i = 0
local integer j = 0
local real x = 0.0
local real y = 0.0
local real life = 0.0
local unit f = null
local boolean exist = false
local integer count = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.b) then
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
if(sd.i > 0) then
set sd.i = sd.i - Interval()
else
set count = 0
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitAlly(f, sd.o) and IsUnitType(f, UNIT_TYPE_HERO)) then
set count = count + 1
endif
endloop
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
set life = GetUnitState(f, UNIT_STATE_LIFE)
if(IsUnitAlly(f, sd.o)) then
if(life >= GetUnitState(f, UNIT_STATE_MAX_LIFE)) then
set j = 0
set exist = false
loop
exitwhen(j >= Total2)
set rd = Ar2[j]
if(f == rd.u) then
set exist = true
set rd.t = TIME_REMAIN
set rd.r = Regeneration(sd.l)
set j = Total2
endif
set j = j + 1
endloop
if(not exist and (not IsUnitInGroup(f, endurance))) then
call GroupAddUnit(endurance, f)
set rd = EnduranceRegeneration_Data.create()
set rd.u = f
set rd.t = sd.rd
set rd.r = sd.rg
set rd.i = 0.0
set rd.im = INTERVAL
set rd.e = AddSpecialEffectTarget(BUFF_EFFECT, rd.u, "overhead")
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = rd
endif
else
call Timed_AddSpecialEffectTarget(SPELL_EFFECT, f, "origin", 2.0)
set sd.i = sd.im
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call SetUnitState(f, UNIT_STATE_LIFE, life + sd.h * ETHEREAL_BONUS * count)
else
call SetUnitState(f, UNIT_STATE_LIFE, life + sd.h * count)
endif
endif
endif
endloop
endif
else
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Endurance_Data sd = Endurance_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM1_UPGRADE4)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item6 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item7 = IsUnitHasItemType(caster, ITEM2_UPGRADE3)
set sd.u = caster
set sd.o = GetOwningPlayer(caster)
set sd.l = level
set sd.r = Radius(level)
set sd.i = 0.0
set sd.im = INTERVAL
set sd.h = Heal(level)
set sd.b = true
set sd.rd = TIME_REMAIN
set sd.rg = Regeneration(level)
if(item1 > 0) then
set sd.r = sd.r + (UPGRADE1_RADIUS1 * item1)
endif
if(item2 > 0) then
set sd.r = sd.r + (UPGRADE1_RADIUS2 * item2)
endif
if(item3 > 0) then
set sd.r = sd.r + (UPGRADE1_RADIUS3 * item3)
set sd.h = sd.h + (UPGRADE1_HEAL3 * item3)
endif
if(item4 > 0) then
set sd.r = sd.r + (UPGRADE1_RADIUS4 * item4)
set sd.h = sd.h + (UPGRADE1_HEAL4 * item4)
endif
set sd.h = sd.h + (sd.h * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
if(item5 > 0) then
set sd.rg = sd.rg + (UPGRADE2_REGENERATION1 * item5)
endif
if(item6 > 0) then
set sd.rg = sd.rg + (UPGRADE2_REGENERATION2 * item6)
endif
if(item7 > 0) then
set sd.rg = sd.rg + (UPGRADE2_REGENERATION3 * item7)
set sd.rd = sd.rd + (UPGRADE2_DURATION3 * item7)
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
endfunction
//----------------------------------------------------------------
private function Stop_Actions takes nothing returns nothing
local Endurance_Data sd
local unit caster = GetTriggerUnit()
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(caster == sd.u) then
set sd.b = false
endif
set i = i + 1
endloop
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(EnduranceTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(EnduranceTrg, Condition(function Conditions))
call TriggerAddAction(EnduranceTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(EnduranceStopTrg, EVENT_PLAYER_UNIT_SPELL_ENDCAST)
call TriggerAddCondition(EnduranceStopTrg, Condition(function Conditions))
call TriggerAddAction(EnduranceStopTrg, function Stop_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
set Tim2 = CreateTimer()
set Total2 = 0
set endurance = CreateGroup()
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
call Preload(BUFF_EFFECT)
endfunction
endscope
//TESH.scrollpos=370
//TESH.alwaysfold=0
globals
group CrushingStompBlocker = CreateGroup()
hashtable CrushingStomp_ht = InitHashtable()
integer CRUSHING_STOMP_X_KEY = 0
integer CRUSHING_STOMP_Y_KEY = 1
endglobals
scope CrushingStomp initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A05J' //Spell Earth Crushing rawcode
private constant string SPELL_EFFECT = "Abilities\\Weapons\\AncientProtectorMissile\\AncientProtectorMissile.mdl" //Effect Earthquake
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Other\\Volcano\\VolcanoDeath.mdl" //Effect crush block
private constant integer DUMMY_ID = 'n00W' //Dummy Earthquake (Blocker) rawcode
private constant integer DESTRUCTABLE_ID = 'LTbx' //Destructable Spell Blocker rawcode
private constant integer X_KEY = 0 //Blocker key x
private constant integer Y_KEY = 1 //Blocker key y
private constant integer DEST_KEY = 2 //Blocker key destructable
private constant real DISTANCE_DESTROY = 200.0 //Distance remove block from caster
private constant integer ITEM1_UPGRADE1 = 'I020' //Item Elven Leafcoat
private constant integer ITEM1_UPGRADE2 = 'I022' //Item Maridian Stark
private constant integer ITEM1_UPGRADE3 = 'I007' //Item Macabre Crowfort
private constant integer ITEM2_UPGRADE1 = 'I00Q' //Item Edge of Blaze
private constant integer ITEM2_UPGRADE2 = 'frgd' //Item Heaven Rapier
private constant real UPGRADE1_SPEED1 = 1.5 //Upgrade 1 effect 1
private constant real UPGRADE1_SPEED2 = 2.0 //Upgrade 1 effect 2
private constant real UPGRADE1_SPEED3 = 2.5 //Upgrade 1 effect 3
private constant real UPGRADE1_LIFE_TIME3 = 4.0 //Upgrade 1 effect 3
private constant integer UPGRADE2_CAST_ID = 'A0BF' //Upgrade 2 ability
private constant integer UPGRADE2_STUN_LEVEL1 = 1 //Upgrade 2 effect 1
private constant integer UPGRADE2_STUN_LEVEL2 = 2 //Upgrade 2 effect 2
private constant integer VIGOROUS_ATTACK_SPELL_ID = 'A05N' //Spell Vigorous Attack rawcode
private constant integer VIGOROUS_ATTACK_ITEM3_UPGRADE1 = 'I00N' //Item Mortise Timbercutter
private constant integer VIGOROUS_ATTACK_ITEM3_UPGRADE2 = 'mlst' //Item Vehemence
private constant integer VIGOROUS_ATTACK_ITEM3_UPGRADE3 = 'I00O' //Item Arcanite Reaver
private constant real VIGOROUS_ATTACK_UPGRADE3_PERCENT1 = 0.15 //Vigorous attack upgrade 3 percent influence 1
private constant real VIGOROUS_ATTACK_UPGRADE3_PERCENT2 = 0.30 //Vigorous attack upgrade 3 percent influence 2
private constant real VIGOROUS_ATTACK_UPGRADE3_PERCENT3 = 0.50 //Vigorous attack upgrade 3 percent influence 3
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_DEFENSIVE //Spell damage type
endglobals
//Radius of effect
private function Radius takes integer level returns real
return 500.0 + (level * 0.0)
endfunction
//Dummy blocker life time
private function Life_Time takes integer level returns real
if(level == 1) then
return 6.0
elseif(level == 2) then
return 8.0
elseif(level == 3) then
return 12.0
else
return 0.0
endif
endfunction
//Damage deal
private function Damage takes integer level returns real
if(level == 1) then
return 100.0
elseif(level == 2) then
return 150.0
elseif(level == 3) then
return 200.0
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_FLYING) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct CrushingStomp_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of Earth CrushingStomp
group g //Damaged target
group d //Dummy units
real x //Target x
real y //Target y
real r //Radius
boolean rc //Radius move in or out
real rm //Radius move
real rt //Current radius
real lf //Life time
boolean c //Check stomp
integer count //Counter
real dd //Damage
integer sl //Stun level
boolean dr //Drag enemy
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private CrushingStomp_Data array Ar[10]
private group all
private group copy
private boolexpr bexpr
private trigger CrushingBlockTrg
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local CrushingStomp_Data sd
local integer i = 0
local integer j = 0
local integer effectRad = 0
local real x = 0.0
local real y = 0.0
local unit dummy = null
local integer dummyID = 0
local unit f = null
local destructable dest = null
local real fX = 0.0
local real fY = 0.0
local real fAngle = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(not sd.c) then
if(sd.rc) then
set sd.rt = sd.rt + sd.rm
set effectRad = ModuloInteger(R2I(sd.rt), 60)
if(effectRad == 0) then
set j = 36
loop
exitwhen(j <= 0)
set x = sd.x + sd.rt * Cos((0 + j * (360 / 36)) * bj_DEGTORAD)
set y = sd.y + sd.rt * Sin((0 + j * (360 / 36)) * bj_DEGTORAD)
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, x, y))
set j = j - 1
endloop
endif
call GroupEnumUnitsInRange(all, sd.x, sd.y, sd.rt, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
if(not IsUnitInGroup(f, sd.g)) then
call GroupAddUnit(sd.g, f)
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
if(sd.dr) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = sd.x - fX
set dy = sd.y - fY
set distance = SquareRoot(dx * dx + dy * dy) + 100.0
set fAngle = Atan2(fY - sd.y, fX - sd.x) * bj_RADTODEG
call Knockback_NoPause(f, RMaxBJ(50.0, sd.r - distance), fAngle, 2.0)
endif
endif
endif
endloop
call HitTree(sd.x, sd.y, sd.rt, 5.0, 0.0)
if(sd.rt >= sd.r) then
set sd.rc = false
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
endif
elseif(sd.rt > 0) then
set sd.c = true
set sd.count = 6
elseif(FirstOfGroup(sd.d) != null) then
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
set copy = CopyGroup(sd.d)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = fX - x
set dy = fY - y
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= DISTANCE_DESTROY) then
call KillUnit(f)
call GroupRemoveUnit(sd.d, f)
endif
if(IsUnitDead(f)) then
call GroupRemoveUnit(sd.d, f)
endif
endloop
else
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
loop
set f = FirstOfGroup(sd.d)
exitwhen(f == null)
set dummyID = GetUnitUserData(f)
call KillUnit(f)
call GroupRemoveUnit(sd.d, f)
endloop
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
elseif(sd.count > 0) then
if(sd.sl > 0) then
call GroupEnumUnitsInRange(all, sd.x, sd.y, sd.rt, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
call TargetCast(sd.o, sd.x, sd.y, 0.5, UPGRADE2_CAST_ID, sd.sl, "thunderbolt", 0, f)
endif
endloop
endif
set j = 0
loop
exitwhen(j >= 10)
set x = sd.x + sd.rt * Cos(((j * (360 / 10)) + sd.count * (360 / 60)) * bj_DEGTORAD)
set y = sd.y + sd.rt * Sin(((j * (360 / 10)) + sd.count * (360 / 60)) * bj_DEGTORAD)
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
set dummy = CreateUnit(sd.o, DUMMY_ID, x, y, R2I(GetRandomInt(0, 360)) )
set dummyID = GetUnitUserData(dummy)
call SetUnitPathing(dummy, false)
call UnitAddAbility(dummy, 'Arav')
call UnitRemoveAbility(dummy, 'Arav')
call SetUnitPosition(dummy, x, y)
call UnitApplyTimedLife(dummy, 'BTLF', sd.lf)
call UnitAddAbility(dummy, 'Aloc')
call GroupAddUnit(sd.d, dummy)
set dest = CreateDestructable(DESTRUCTABLE_ID, x, y, 0.0, 1.0, 1)
call SaveReal(CrushingStomp_ht, dummyID, X_KEY, x)
call SaveReal(CrushingStomp_ht, dummyID, Y_KEY, y)
//call SetTerrainPathable(x, y, PATHING_TYPE_WALKABILITY, false)
call SaveDestructableHandle(CrushingStomp_ht, dummyID, DEST_KEY, dest)
call GroupAddUnit(CrushingStompBlocker, dummy)
if(ModuloInteger(sd.count, 5) == 0) then
call DestroyEffect(AddSpecialEffect(SPECIAL_EFFECT, x, y))
endif
endif
set j = j + 1
endloop
set sd.count = sd.count - 1
else
set sd.rc = false
set sd.rt = 0
set sd.c = false
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set dummy = null
set f = null
set dest = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local CrushingStomp_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local player owner = GetOwningPlayer(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local boolean isNull = (Ar[Total] == null)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer levelVigorous = GetUnitAbilityLevel(caster, VIGOROUS_ATTACK_SPELL_ID)
local integer vigorousItem1 = IsUnitHasItemType(caster, VIGOROUS_ATTACK_ITEM3_UPGRADE1)
local integer vigorousItem2 = IsUnitHasItemType(caster, VIGOROUS_ATTACK_ITEM3_UPGRADE2)
local integer vigorousItem3 = IsUnitHasItemType(caster, VIGOROUS_ATTACK_ITEM3_UPGRADE3)
local real extraDamage = 0.0
if(isNull) then
set sd = CrushingStomp_Data.create()
set sd.g = CreateGroup()
set sd.d = CreateGroup()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.x = GetUnitX(caster)
set sd.y = GetUnitY(caster)
set sd.r = Radius(level)
set sd.rc = true
set sd.rm = (sd.r * Interval())
set sd.rt = 0
set sd.lf = Life_Time(sd.l)
set sd.c = false
set sd.count = 0
set sd.dd = Damage(level)// + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.sl = 0
set sd.dr = false
if(item1 > 0) then
set sd.rm = sd.rm * UPGRADE1_SPEED1
endif
if(item2 > 0) then
set sd.rm = sd.rm * UPGRADE1_SPEED2
endif
if(item3 > 0) then
set sd.rm = sd.rm * UPGRADE1_SPEED3
set sd.lf = sd.lf + (UPGRADE1_LIFE_TIME3 * item3)
endif
if(item4 > 0) then
set sd.sl = UPGRADE2_STUN_LEVEL1
endif
if(item5 > 0) then
set sd.sl = UPGRADE2_STUN_LEVEL2
set sd.dr = true
endif
if(levelVigorous > 0) then
if(vigorousItem1 > 0) then
set extraDamage = extraDamage + (GetVigorousDamage(caster) * VIGOROUS_ATTACK_UPGRADE3_PERCENT1 * vigorousItem1)
endif
if(vigorousItem2 > 0) then
set extraDamage = extraDamage + (GetVigorousDamage(caster) * VIGOROUS_ATTACK_UPGRADE3_PERCENT2 * vigorousItem2)
endif
if(vigorousItem3 > 0) then
set extraDamage = extraDamage + (GetVigorousDamage(caster) * VIGOROUS_ATTACK_UPGRADE3_PERCENT3 * vigorousItem3)
endif
set sd.dd = sd.dd + extraDamage
endif
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Block_Execute takes nothing returns nothing
local unit enumU = GetEnumUnit()
local integer enumID = GetUnitUserData(enumU)
local real x = 0.0
local real y = 0.0
local real dest = 0.0
if((IsUnitDead(enumU))) then
set x = LoadReal(CrushingStomp_ht, enumID, X_KEY)
set y = LoadReal(CrushingStomp_ht, enumID, Y_KEY)
call RemoveDestructable(LoadDestructableHandle(CrushingStomp_ht, enumID, DEST_KEY))
call FlushChildHashtable(CrushingStomp_ht, enumID)
call GroupRemoveUnit(CrushingStompBlocker, enumU)
endif
set enumU = null
endfunction
//----------------------------------------------------------------
private function Block_Actions takes nothing returns nothing
call ForGroup(CrushingStompBlocker, function Block_Execute)
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local unit learner = GetLearningUnit()
call EnableTrigger(CrushingBlockTrg)
set learner = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
return(GetLearnedSkill() == SPELL_ID)
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set CrushingBlockTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(CrushingTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(CrushingTrg, Condition(function Conditions))
call TriggerAddAction(CrushingTrg, function Actions)
call TriggerRegisterTimerEventPeriodic(CrushingBlockTrg, 0.1)
call DisableTrigger(CrushingBlockTrg)
call TriggerAddAction(CrushingBlockTrg, function Block_Actions)
call TriggerRegisterAnyUnitEventBJ(CrushingLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(CrushingLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(CrushingLearnTrg, function Learn_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set copy = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
endfunction
endscope
//TESH.scrollpos=389
//TESH.alwaysfold=0
scope TerraShock initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A05L' //Spell Terra Shock rawcode
private constant integer ABILITY_ID = 'A0C0' //Ability Titan TerraShock (Strength) rawcode
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Orc\\Shockwave\\ShockwaveMissile.mdl" //Move special effect
private constant string SPELL_EFFECT1 = "Abilities\\Weapons\\DemolisherFireMissile\\DemolisherFireMissile.mdl" //Crush effect string
private constant string SPELL_EFFECT2 = "abilities\\weapons\\DemolisherMissile\\DemolisherMissile.mdl" //Knock effect string
private constant real RADIUS_HIT_TREE = 150.0 //Radius that kill trees
private constant integer EFFECT_INTERVAL = 2 //Interval between effects
private constant real KNOCKBACK_DURATION = 0.4 //Duration knock
private constant integer ITEM1_UPGRADE1 = 'I00Y' //Item Blight River
private constant integer ITEM1_UPGRADE2 = 'rugt' //Item Aphotical Scythe
private constant integer ITEM2_UPGRADE1 = 'I00R' //Item Aztez Spear
private constant integer ITEM2_UPGRADE2 = 'I00S' //Item Truepierce Lance
private constant integer ITEM2_UPGRADE3 = 'I002' //Item Amazon Meld
private constant real UPGRADE1_RADIUS1 = 100.0 //Upgrade item 1 increase radius 1
private constant real UPGRADE1_RADIUS2 = 200.0 //Upgrade item 1 increase radius 2
private constant real UPGRADE2_DISTANCE1 = 200.0 //Upgrade item 2 increase distance 1
private constant real UPGRADE2_DISTANCE2 = 400.0 //Upgrade item 2 increase distance 2
private constant real UPGRADE2_DISTANCE3 = 600.0 //Upgrade item 2 increase distance 3
private constant real UPGRADE2_DAMAGE1 = 1.0 //Upgrade item 2 increase damage 1
private constant real UPGRADE2_DAMAGE2 = 2.0 //Upgrade item 2 increase damage 2
private constant real UPGRADE2_DAMAGE3 = 4.0 //Upgrade item 2 increase damage 3
private constant attacktype A_TYPE = ATTACK_TYPE_CHAOS //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_DEMOLITION //Spell damage type
endglobals
//Move per interval
private function Move takes integer level returns real
return 150.0 + (0.0 * level)
endfunction
//Radius effect
private function Detect_Radius takes integer level returns real
return 200.0 + (0 * level)
endfunction
//Total knock duration
private function Duration takes integer level returns real
return 2.0 + (0.0 * level)
endfunction
//Distance target unit travel per interval
private function Distance takes integer level returns real
if(level == 1) then
return 600.0
elseif(level == 2) then
return 1000.0
else
return 0.0
endif
endfunction
//Damage deal to target
private function Damage takes integer level returns real
if(level == 1) then
return 4.0
elseif(level == 2) then
return 8.0
else
return 0.0
endif
endfunction
//Radius effect
private function Radius takes integer level returns real
return 125.0 + (0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_FLYING) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct TerraShock_Data
unit u //Unit targeted
unit c //Unit caster
player o //Owner of caster
integer l //Spell level
boolean a //Attack
real m //Move per interval
real mm //Move max
real d1 //Distance the unit per interval
real d2 //Deceleration of speed
real sin //Sin of radiance of angle between caster and target
real cos //Cos of radiance of angle between caster and target
real d //Damage receive
real dm //Damage multiplier
real dr //Detect radius
real r //Radius effect
boolean k //Knockback area
integer ei //Effect interval
effect e //Effect
boolean up //Upgrade
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private TerraShock_Data array Ar[10]
private group all
private boolexpr bexpr
private location loc
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local TerraShock_Data sd
local integer i = 0
local real x = 0.0
local real y = 0.0
local real oriX = 0.0
local real oriY = 0.0
local real distance = 0.0
local real dx = 0.0
local real dy = 0.0
local unit f = null
local real fX = 0.0
local real fY = 0.0
local real fAngle = 0.0
local real fDistance = 0.0
local real realDistance = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(not sd.a) then
if(sd.mm > 0) then
set x = GetUnitX(sd.c) + sd.m * sd.cos
set y = GetUnitY(sd.c) + sd.m * sd.sin
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0)) and (not IsBarrel(sd.c, x, y, 100.0))) then
call SetUnitX(sd.c, x)
call SetUnitY(sd.c, y)
endif
set sd.mm = sd.mm - sd.m
else
call PauseUnit(sd.c, false)
call SetUnitTimeScale(sd.c, 1.0)
call DestroyEffect(sd.e)
if(sd.u == null) then
set x = GetUnitX(sd.c) + sd.m * sd.cos
set y = GetUnitY(sd.c) + sd.m * sd.sin
call GroupEnumUnitsInRange(all, x, y, sd.dr, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (sd.u == null and IsUnitEnemy(f, sd.o)) then
set sd.u = f
endif
endloop
if(sd.u == null) then
if(sd.e != null) then
call DestroyEffect(sd.e)
set sd.e = null
endif
set sd.u = null
set sd.c = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
else
set sd.a = true
endif
else
set sd.a = true
endif
endif
else
set oriX = GetUnitX(sd.u)
set oriY = GetUnitY(sd.u)
set realDistance = 0
loop
exitwhen(realDistance >= sd.d1)
set x = oriX + (realDistance) * sd.cos
set y = oriY + (realDistance) * sd.sin
set realDistance = realDistance + 10
endloop
set x = oriX + (realDistance) * sd.cos
set y = oriY + (realDistance) * sd.sin
call SetUnitPosition(sd.u, x, y)
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
set dx = x - oriX
set dy = y - oriY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance < 10 or distance > sd.d1 + 10) then
call UnitDamageTarget(sd.c, sd.u, sd.d * sd.dm, true, false, A_TYPE, D_TYPE, null)
if(sd.ei > EFFECT_INTERVAL) then
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT1, x, y))
set sd.ei = 0
else
set sd.ei = sd.ei + 1
endif
else
call UnitDamageTarget(sd.c, sd.u, sd.d, true, false, A_TYPE, D_TYPE, null)
if(sd.ei > EFFECT_INTERVAL) then
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT2, x, y))
set sd.ei = 0
else
set sd.ei = sd.ei + 1
endif
endif
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (IsUnitEnemy(f, sd.o) and f != sd.u) then
call UnitDamageTarget(sd.c, f, sd.d, true, false, A_TYPE, D_TYPE, null)
if(sd.k) then
//call SetUnitX(f, x + (sd.d1) * sd.cos)
//call SetUnitY(f, y + (sd.d1) * sd.sin)
call SetUnitPosition(f, oriX, oriY)
endif
if(sd.up) then
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT2, GetUnitX(f), GetUnitY(f)))
endif
endif
endloop
call HitTree(x, y, RADIUS_HIT_TREE, 0, 0.0)
set sd.d1 = sd.d1 - sd.d2
//set sd.d = RMaxBJ(sd.d - distance * 0.1, Damage(sd.l))
if(sd.d1 <= 0 or IsUnitType(sd.u, UNIT_TYPE_MAGIC_IMMUNE)) then
call PauseUnit(sd.u, false)
call Pather(sd.u, 1.0)
if(sd.e != null) then
call DestroyEffect(sd.e)
set sd.e = null
endif
set sd.u = null
set sd.c = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local TerraShock_Data sd = TerraShock_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local unit target = GetSpellTargetUnit()
local real targetX = 0.0
local real targetY = 0.0
local real angle = 0.0
local integer q = R2I(Duration(level) / Interval())
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local real knockDistance = Distance(level)
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE3)
local real offsetDistance = 0.0
local real extraRadius = 0.0
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_GT_TerraShock
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
if(target != null) then
set targetX = GetUnitX(target)
set targetY = GetUnitY(target)
set offsetDistance = 100.0
else
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
endif
set angle = Atan2(targetY - casterY, targetX - casterX)
set dx = casterX - targetX
set dy = casterY - targetY
set distance = SquareRoot(dx * dx + dy * dy) - offsetDistance
set sd.u = target
set sd.c = caster
set sd.o = GetOwningPlayer(caster)
set sd.l = level
set sd.a = false
set sd.m = Move(level)
set sd.mm = distance - 100.0
if(item3 > 0) then
set knockDistance = knockDistance + (UPGRADE2_DISTANCE1 * item3)
endif
if(item4 > 0) then
set knockDistance = knockDistance + (UPGRADE2_DISTANCE2 * item4)
endif
if(item5 > 0) then
set knockDistance = knockDistance + (UPGRADE2_DISTANCE3 * item5)
endif
set sd.d1 = 2 * knockDistance / (q + 1)
set sd.d2 = sd.d1 / q
set sd.cos = Cos(angle)
set sd.sin = Sin(angle)
set sd.d = Damage(level)
set sd.d = sd.d// + (sd.d * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.dm = 2.0
set sd.dr = Detect_Radius(level)
set sd.r = Radius(level)
set sd.k = false
set sd.ei = 0
set sd.e = AddSpecialEffectTarget(SPECIAL_EFFECT, caster, "origin")
set sd.up = false
call PauseUnit(target, true)
call PauseUnit(caster, true)
call SetUnitTimeScale(caster, 2.0)
if(item1 > 0) then
set sd.k = true
set extraRadius = UPGRADE1_RADIUS1
endif
if(item2 > 0) then
set sd.k = true
set extraRadius = UPGRADE1_RADIUS2
endif
set sd.r = sd.r + extraRadius
if(item3 > 0) then
set sd.d = sd.d + (UPGRADE2_DAMAGE1 * item3)
endif
if(item4 > 0) then
set sd.d = sd.d + (UPGRADE2_DAMAGE2 * item4)
endif
if(item5 > 0) then
set sd.d = sd.d + (UPGRADE2_DAMAGE3 * item5)
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set target = null
set s = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(TerraShockTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(TerraShockTrg, Condition(function Conditions))
call TriggerAddAction(TerraShockTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
set loc = Location(0, 0)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPECIAL_EFFECT)
call Preload(SPELL_EFFECT1)
call Preload(SPELL_EFFECT2)
endfunction
endscope
//TESH.scrollpos=4
//TESH.alwaysfold=0
scope MysticWave initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A05S' //Spell Lightning Charge rawcode
private constant integer ABILITY_ID = 'A05V' //Ability Resistance (Ward) rawcode
private constant real DELAY = 0.2 //Delay before another jump
private constant real JUMP_DURATION = 2.0 //Duration no unit before jump
private constant real LIGHTNING_TIME = 1.0 //Lightning life time
private constant string LIGHTNING_ID = "HWPB" //Lightning impact rawcode
private constant integer ITEM1_UPGRADE1 = 'belv' //Item Bracer of Bold
private constant integer ITEM1_UPGRADE2 = 'I00C' //Item Amulet of Dexterity
private constant integer ITEM1_UPGRADE3 = 'evtl' //Item Talisman of Evasion
private constant integer ITEM1_UPGRADE4 = 'I01K' //Item Void Artifice
private constant integer ITEM1_UPGRADE5 = 'clfm' //Item Diamond Escutcheon
private constant integer ITEM2_UPGRADE1 = 'prvt' //Item Periapt of Vitality
private constant integer ITEM2_UPGRADE2 = 'rhth' //Item Zemi of Eternal
private constant integer ITEM2_UPGRADE3 = 'I015' //Item Orb of Descent
private constant integer ITEM3_UPGRADE1 = 'I01R' //Item Shadow Grimoire
private constant real UPGRADE1_RADIUS1 = 100.0 //Upgrade 1 effect 1
private constant real UPGRADE1_RADIUS2 = 200.0 //Upgrade 1 effect 2
private constant real UPGRADE1_RADIUS3 = 300.0 //Upgrade 1 effect 3
private constant real UPGRADE1_RADIUS4 = 400.0 //Upgrade 1 effect 4
private constant real UPGRADE1_RADIUS5 = 500.0 //Upgrade 1 effect 5
private constant integer UPGRADE1_JUMP3 = 2 //Upgrade 1 effect 3
private constant integer UPGRADE1_JUMP4 = 4 //Upgrade 1 effect 4
private constant integer UPGRADE1_JUMP5 = 6 //Upgrade 1 effect 5
private constant real UPGRADE2_HEAL1 = 20.0 //Upgrade 2 effect 1
private constant real UPGRADE2_HEAL2 = 40.0 //Upgrade 2 effect 2
private constant real UPGRADE2_HEAL3 = 60.0 //Upgrade 2 effect 3
private constant real UPGRADE2_DAMAGE3 = 1.0 //Upgrade 2 effect 3
private constant real UPGRADE3_RADIUS_DAMAGE1 = 100.0 //Upgrade 3 effect 1
private constant attacktype A_TYPE = ATTACK_TYPE_MAGIC //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_MAGIC //Spell damage type
private constant string SPELL_EFFECT = "Abilities\\Spells\\Orc\\HealingWave\\HealingWaveTarget.mdl" //Effect hit
endglobals
//Jump amount
private function Jump takes integer level returns integer
if(level == 1) then
return 6
elseif(level == 2) then
return 8
elseif(level == 3) then
return 11
elseif(level == 4) then
return 15
else
return 0
endif
endfunction
//Radius
private function Radius takes integer level returns real
return 700.0 + (0.0 * level)
endfunction
//Heal amount
private function Heal takes integer level returns real
if(level == 1) then
return 60.0
elseif(level == 2) then
return 80.0
elseif(level == 3) then
return 100.0
elseif(level == 4) then
return 120.0
else
return 0.0
endif
endfunction
//Damage radius
private function Damage_Radius takes integer level returns real
return 100.0 + (0.0 * level)
endfunction
//Damage
private function Damage takes integer level returns real
if(level == 1) then
return 1.0
elseif(level == 2) then
return 2.0
elseif(level == 3) then
return 4.0
elseif(level == 4) then
return 7.0
else
return 0.0
endif
endfunction
//Unit affected
private function TargetsEnemy takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Unit affected
private function TargetsAlly takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetOwningPlayer(target) != Player(PLAYER_NEUTRAL_PASSIVE))
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct MysticWave_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of spell
unit t //Target unit
unit nt //Next target
group g //Group target
integer j //Jump amount
real r //Radius detect
real i //Interval
real im //Interval max
real ij //Interval jump
real h //Heal amount
real d //Damage
real dr //Damage radius
endstruct
//----------------------------------------------------------------
struct MysticLightning_Data
unit u //Unit caster
player o //Owner of caster
unit t1 //Unit first
unit t2 //Unit target
lightning l //Lightning
real i //Time remain
real d //Damage
real r //Radius
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private MysticWave_Data array Ar[100]
private timer Tim2
private integer Total2
private MysticWave_Data array Ar2[100]
private group all
private group part
private group temp
private boolexpr bexprEnemy
private boolexpr bexprAlly
endglobals
//----------------------------------------------------------------
private function PickEnemy takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = TargetsEnemy(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function PickAlly takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = TargetsAlly(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute2 takes nothing returns nothing
local MysticLightning_Data ld
local integer i = 0
local integer j = 0
local real cX = 0.0
local real cY = 0.0
local real tX = 0.0
local real tY = 0.0
local real dx = 0.0
local real dy = 0.0
local integer imax = 0
local real angle = 0.0
local real x = 0.0
local real y = 0.0
local unit f = null
loop
exitwhen(i >= Total2)
set ld = Ar2[i]
if(IsUnitDead(ld.t1) or IsUnitDead(ld.t2) or ld.t1 == null or ld.t2 == null) then
set ld.i = 0.0
endif
if(ld.i > 0.0) then
set ld.i = ld.i - Interval()
set cX = GetUnitX(ld.t1)
set cY = GetUnitY(ld.t1)
set tX = GetUnitX(ld.t2)
set tY = GetUnitY(ld.t2)
call MoveLightning(ld.l, true, cX, cY, tX, tY)
set dx = tX - cX
set dy = tY - cY
set imax = R2I(SquareRoot(dx * dx + dy * dy))
set angle = bj_RADTODEG * Atan2(tY - cY, tX - cX)
set j = 0
loop
exitwhen(j >= imax)
set x = cX + j * Cos(angle * bj_DEGTORAD)
set y = cY + j * Sin(angle * bj_DEGTORAD)
call GroupEnumUnitsInRange(all, x, y, ld.r, bexprEnemy)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, ld.o)) then
call GroupAddUnit(part, f)
endif
endloop
set j = j + R2I(ld.r)
endloop
loop
set f = FirstOfGroup(part)
exitwhen(f == null)
call GroupRemoveUnit(part, f)
call UnitDamageTarget(ld.u, f, ld.d, true, false, A_TYPE, D_TYPE, null)
endloop
else
call DestroyLightning(ld.l)
set ld.l = null
set ld.u = null
set ld.o = null
set ld.t1 = null
set ld.t2 = null
set Ar2[i] = Ar2[Total2 - 1]
set Total2 = Total2 - 1
call ld.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total2 == 0 then
call PauseTimer(Tim2)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local MysticWave_Data sd
local MysticLightning_Data ld
local integer i = 0
local real cX = 0.0
local real cY = 0.0
local real tX = 0.0
local real tY = 0.0
local boolean exist = false
local unit f = null
local real fX = 0.0
local real fY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local integer random = 0
local integer level = 0
local sound s = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(IsUnitDead(sd.t) or sd.t == null) then
set sd.j = 0
endif
if(sd.j > 0) then
if(sd.i > 0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
if(sd.nt != null) then
set cX = GetUnitX(sd.t)
set cY = GetUnitY(sd.t)
set tX = GetUnitX(sd.nt)
set tY = GetUnitY(sd.nt)
call SetUnitState(sd.nt, UNIT_STATE_LIFE, GetUnitState(sd.nt, UNIT_STATE_LIFE) + sd.h)
set ld = MysticLightning_Data.create()
set ld.u = sd.u
set ld.o = sd.o
set ld.t1 = sd.t
set ld.t2 = sd.nt
set ld.l = AddLightning(LIGHTNING_ID, true, cX, cY, tX, tY)
set ld.i = LIGHTNING_TIME
set ld.d = sd.d
set ld.r = sd.dr
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = ld
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.nt, "origin"))
set s = gg_snd_HealingWave
call AttachSoundToUnit(s, sd.nt)
call StartSound(s)
set s = null
if(IsUnitType(sd.nt, UNIT_TYPE_HERO)) then
set sd.j = sd.j - 1
endif
set sd.ij = JUMP_DURATION
call GroupAddUnit(sd.g, sd.nt)
set sd.t = sd.nt
set sd.nt = null
else
set exist = false
set cX = GetUnitX(sd.t)
set cY = GetUnitY(sd.t)
call GroupEnumUnitsInRange(all, cX, cY, sd.r, bexprAlly)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = fX - cX
set dy = fY - cY
set distance = SquareRoot(dx * dx + dy * dy)
if(IsUnitAlly(f, sd.o) and /*
*/(not IsUnitInGroup(f, sd.g)) and /*
*/f != sd.t and /*
*/IsUnitVisible(f, sd.o) and /*
*/(not exist) and /*
*/distance > 10.0) then
set exist = true
set sd.nt = f
endif
endloop
if(not exist) then
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
call GroupEnumUnitsInRange(all, cX, cY, sd.r, bexprAlly)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = fX - cX
set dy = fY - cY
set distance = SquareRoot(dx * dx + dy * dy)
if(IsUnitAlly(f, sd.o) and /*
*/(not IsUnitInGroup(f, sd.g)) and /*
*/f != sd.t and /*
*/IsUnitVisible(f, sd.o) and /*
*/distance > 10.0 and /*
*/(GetPlayerId(GetOwningPlayer(f)) < 8)) then
call GroupAddUnit(temp, f)
endif
endloop
loop
set f = FirstOfGroup(temp)
exitwhen(f == null)
call GroupRemoveUnit(temp, f)
if(not exist) then
if(FirstOfGroup(temp) != null) then
set random = GetRandomInt(1, 10)
if(random <= 2) then
set exist = true
set sd.nt = f
endif
else
set exist = true
set sd.nt = f
endif
endif
endloop
endif
if(not exist) then
if(sd.ij > 0) then
set sd.ij = sd.ij - Interval()
else
set sd.j = 0
endif
endif
endif
endif
else
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
set sd.u = null
set sd.o = null
set sd.t = null
set sd.nt = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set s = null
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local MysticWave_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local unit target = GetSpellTargetUnit()
local boolean isNull = (Ar[Total] == null)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM1_UPGRADE4)
local integer item5 = IsUnitHasItemType(caster, ITEM1_UPGRADE5)
local integer item6 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item7 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item8 = IsUnitHasItemType(caster, ITEM2_UPGRADE3)
local integer item9 = IsUnitHasItemType(caster, ITEM3_UPGRADE1)
if(isNull) then
set sd = MysticWave_Data.create()
set sd.g = CreateGroup()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.t = caster
set sd.nt = target
set sd.j = Jump(level) + 1
set sd.r = Radius(level)
set sd.i = 0.0
set sd.im = DELAY
set sd.ij = JUMP_DURATION
set sd.h = Heal(level)
set sd.h = sd.h + (sd.h * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.d = Damage(level)
set sd.d = sd.d + (sd.d * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.dr = Damage_Radius(level)
if(item1 > 0) then
set sd.r = sd.r + (UPGRADE1_RADIUS1 * item1)
endif
if(item2 > 0) then
set sd.r = sd.r + (UPGRADE1_RADIUS2 * item2)
endif
if(item3 > 0) then
set sd.r = sd.r + (UPGRADE1_RADIUS3 * item3)
set sd.j = sd.j + (UPGRADE1_JUMP3 * item3)
endif
if(item4 > 0) then
set sd.r = sd.r + (UPGRADE1_RADIUS4 * item4)
set sd.j = sd.j + (UPGRADE1_JUMP3 * item4)
endif
if(item5 > 0) then
set sd.r = sd.r + (UPGRADE1_RADIUS5 * item5)
set sd.j = sd.j + (UPGRADE1_JUMP3 * item5)
endif
if(item6 > 0) then
set sd.h = sd.h + (UPGRADE2_HEAL1 * item6)
endif
if(item7 > 0) then
set sd.h = sd.h + (UPGRADE2_HEAL2 * item7)
endif
if(item8 > 0) then
set sd.h = sd.h + (UPGRADE2_HEAL3 * item8)
set sd.d = sd.d + (UPGRADE2_DAMAGE3 * item8)
endif
if(item9 > 0) then
set sd.dr = sd.dr + UPGRADE3_RADIUS_DAMAGE1
endif
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set target = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Die_Actions takes nothing returns nothing
local unit dying = GetTriggerUnit()
local MysticWave_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(IsUnitInGroup(dying, sd.g)) then
call GroupRemoveUnit(sd.g, dying)
endif
set i = i + 1
endloop
set dying = null
endfunction
//----------------------------------------------------------------
private function Die_Conditions takes nothing returns boolean
return true
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(MysticWaveTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(MysticWaveTrg, Condition(function Conditions))
call TriggerAddAction(MysticWaveTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(MysticWaveDieTrg, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(MysticWaveDieTrg, Condition(function Die_Conditions))
call TriggerAddAction(MysticWaveDieTrg, function Die_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set Tim2 = CreateTimer()
set Total2 = 0
set all = CreateGroup()
set part = CreateGroup()
set temp = CreateGroup()
set bexprEnemy = Condition(function PickEnemy)
set bexprAlly = Condition(function PickAlly)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=113
//TESH.alwaysfold=0
scope PalmFlip initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A05T' //Spell Palm Flip rawcode
private constant integer CAST_ID = 'A09V' //Cast Palm Flip (Dummy) rawcode
private constant integer ABILITY_ID = 'A062' //Ability Palm Flip (Damage) rawcode
private constant real DELAY = 0.0 //Delay before jump
private constant real DISTANCE = 600.0 //Distance flip
private constant real TIME_ANIMATE = 0.3 //Time for Occult Sage animate
private constant real DURATION = 30.0 //Damage increase duration
private constant integer ITEM1_UPGRADE1 = 'rag1' //Item Walking Slippers
private constant integer ITEM1_UPGRADE2 = 'I00K' //Item Expidition Footgear
private constant integer ITEM1_UPGRADE3 = 'I01X' //Item Oversurge
private constant integer ITEM1_UPGRADE4 = 'I01W' //Item Ghost Veil
private constant integer ITEM2_UPGRADE1 = 'I00T' //Item Hardspike Beetle
private constant integer ITEM2_UPGRADE2 = 'I00U' //Item Skull Crusher
private constant real UPGRADE1_RADIUS1 = 50.0 //Upgrade 1 effect 1
private constant real UPGRADE1_RADIUS2 = 100.0 //Upgrade 1 effect 2
private constant real UPGRADE1_RADIUS3 = 200.0 //Upgrade 1 effect 3
private constant real UPGRADE1_RADIUS4 = 300.0 //Upgrade 1 effect 4
private constant real UPGRADE1_DURATION3 = 5.0 //Upgrade 1 effect 1
private constant real UPGRADE1_DURATION4 = 10.0 //Upgrade 1 effect 2
private constant real UPGRADE2_DAMAGE1 = 100.0 //Upgrade 1 effect 1
private constant real UPGRADE2_DAMAGE2 = 200.0 //Upgrade 1 effect 2
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_NORMAL //Spell damage type
private constant string SPELL_EFFECT = "Abilities\\Weapons\\FaerieDragonMissile\\FaerieDragonMissile.mdl" //Effect hit
private constant string SPECIAL_EFFECT = "Units\\NightElf\\Wisp\\WispExplode.mdl" //Effect
endglobals
//Radius
private function Radius takes integer level returns real
return 300.0 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct PalmFlip_Data
unit u //Unit caster
integer id //Caster id
integer l //Level of spell
integer el //Extra level
player o //Owner of caster
real i //Interval delay
real cos //Cos of angle
real sin //Sin of angle
real tX //Target x
real tY //Target y
real dm //Distance move
real x //X of graph
real y //Y of graph
real t //Distance
boolean f //Finish
real d //Duration of increase damage
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private PalmFlip_Data array Ar[100]
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local PalmFlip_Data sd
local integer i = 0
local real x = 0.0
local real y = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
elseif(sd.x < sd.t) then
set sd.x = sd.x + sd.dm
set sd.y = (-1 / ((3 * sd.t) / 4)) * sd.x * (sd.x - sd.t)
set x = GetUnitX(sd.u) + sd.dm * sd.cos
set y = GetUnitY(sd.u) + sd.dm * sd.sin
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0)) and (not IsBarrel(sd.u, x, y, 100.0))) then
call SetUnitX(sd.u, x)
call SetUnitY(sd.u, y)
endif
call SetUnitFlyHeight(sd.u, sd.y, 0.0)
elseif(not sd.f) then
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
set sd.f = true
//call SetUnitPosition(sd.u, x, y)
call SetUnitFlyHeight(sd.u, GetUnitDefaultFlyHeight(sd.u), 0.0)
call SetUnitPathing(sd.u, true)
//call QueueUnitAnimation(sd.u, "stand")
call UnitAddAbility(sd.u, ABILITY_ID)
call SetUnitAbilityLevel(sd.u, ABILITY_ID, sd.l + sd.el)
call Pather(sd.u, 1.5)
elseif(sd.d > 0.0) then
set sd.d = sd.d - Interval()
if(GetUnitAbilityLevel(sd.u, ABILITY_ID) <= 0) then
call UnitAddAbility(sd.u, ABILITY_ID)
call SetUnitAbilityLevel(sd.u, ABILITY_ID, sd.l + sd.el)
endif
else
call UnitRemoveAbility(sd.u, ABILITY_ID)
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local PalmFlip_Data sd = PalmFlip_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer casterType = GetUnitTypeId(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real face = GetUnitFacing(caster) + 180.0
local real rad = face * bj_DEGTORAD
local real targetX = casterX + DISTANCE * Cos(rad)
local real targetY = casterY + DISTANCE * Sin(rad)
local real dx = casterX - targetX
local real dy = casterY - targetY
local real distance = SquareRoot(dx * dx + dy * dy)
local unit f = null
local real radius = 0.0
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM1_UPGRADE4)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item6 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local real extraRadius = 0.0
local real damage = 0.0
set sd.u = caster
set sd.id = casterID
set sd.l = level
set sd.el = 0
set sd.o = owner
set sd.i = DELAY
set sd.cos = Cos(rad)
set sd.sin = Sin(rad)
set sd.tX = targetX
set sd.tY = targetY
set sd.dm = distance / (TIME_ANIMATE / Interval())
set sd.x = 0
set sd.y = 0
set sd.t = distance
set sd.f = false
set sd.d = DURATION
call UnitAddAbility(caster, 'Arav')
call UnitRemoveAbility(caster, 'Arav')
call SetUnitPathing(caster, false)
call DestroyEffect(AddSpecialEffect(SPECIAL_EFFECT, casterX, casterY))
set radius = Radius(level)
if(item1 > 0) then
set extraRadius = extraRadius + UPGRADE1_RADIUS1
endif
if(item2 > 0) then
set extraRadius = extraRadius + UPGRADE1_RADIUS2
endif
if(item3 > 0) then
set extraRadius = extraRadius + UPGRADE1_RADIUS3
set sd.d = sd.d + (UPGRADE1_DURATION3 * item3)
endif
if(item4 > 0) then
set extraRadius = extraRadius + UPGRADE1_RADIUS4
set sd.d = sd.d + (UPGRADE1_DURATION4 * item4)
endif
set radius = radius + extraRadius
if(item5 > 0) then
set damage = damage + (UPGRADE2_DAMAGE1 * item5)
endif
if(item6 > 0) then
set damage = damage + (UPGRADE2_DAMAGE1 * item6)
set sd.el = 3
endif
set damage = damage + (damage * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
call GroupEnumUnitsInRange(all, casterX, casterY, radius, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, owner)) then
call TargetCast(owner, casterX, casterY, 0.5, CAST_ID, level, "thunderbolt", 0, f)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, f, "origin"))
if(damage > 0.0) then
call UnitDamageTarget(caster, f, damage, true, false, A_TYPE, D_TYPE, null)
endif
endif
endloop
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
set f = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(PalmFlipTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(PalmFlipTrg, Condition(function Conditions))
call TriggerAddAction(PalmFlipTrg, function Actions)
//setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call AbilityPreload(ABILITY_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=15
//TESH.alwaysfold=0
scope Hex initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A05X' //Spell Hex rawcode
private constant integer ABILITY_ID = 'A08Y' //Ability Hex (Agility) rawcode
private constant real INTERVAL = 0.5 //Interval
private constant real MAX_INTERVAL = 1.0 //Max interval
private constant real RADIUS = 500.0 //Radius detect
private constant integer ITEM1_UPGRADE1 = 'tels' //Item Hunting Scope
private constant integer ITEM1_UPGRADE2 = 'crys' //Item Crystal Ball
private constant integer ITEM2_UPGRADE1 = 'I01U' //Item Royaltouch
private constant integer ITEM2_UPGRADE2 = 'I00B' //Item Moth's Mouth
private constant integer ITEM2_UPGRADE3 = 'rnsp' //Item Ivory Halo
private constant real UPGRADE1_RADIUS1 = 150.0 //Upgrade 1 effect 1
private constant real UPGRADE1_RADIUS2 = 300.0 //Upgrade 1 effect 2
private constant integer UPGRADE2_ABILITY_ID1 = 'A0BG' //Upgrade 2 effect 1
private constant integer UPGRADE2_ABILITY_ID2 = 'Algm' //Upgrade 2 effect 2
private constant string SPELL_EFFECT = "Abilities\\Spells\\NightElf\\FaerieDragonInvis\\FaerieDragon_Invis.mdl" //Upgrade effect
endglobals
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false)
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private trigger HexTrg
private group Group
private real Interval
private group copy
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit f = null
local real fX = 0.0
local real fY = 0.0
local integer level = 0
local player owner = null
local integer total = 0
local integer lvl = 0
local unit g = null
local integer i = 0
local real radius = 0.0
local integer item1 = 0
local integer item2 = 0
local integer item3 = 0
local integer item4 = 0
local integer item5 = 0
set copy = CopyGroup(Group)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not IsUnitDead(f)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set level = GetUnitAbilityLevel(f, SPELL_ID)
if(level > 0) then
set owner = GetOwningPlayer(f)
set radius = RADIUS
set item1 = IsUnitHasItemType(f, ITEM1_UPGRADE1)
set item2 = IsUnitHasItemType(f, ITEM1_UPGRADE2)
set item3 = IsUnitHasItemType(f, ITEM2_UPGRADE1)
set item4 = IsUnitHasItemType(f, ITEM2_UPGRADE2)
set item5 = IsUnitHasItemType(f, ITEM2_UPGRADE3)
if(item1 > 0) then
set radius = radius + (UPGRADE1_RADIUS1 * item1)
endif
if(item2 > 0) then
set radius = radius + (UPGRADE1_RADIUS2 * item2)
endif
set total = 0
call GroupEnumUnitsInRange(all, fX, fY, radius, bexpr)
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
if(g != f and IsUnitAlly(g, owner) and GetOwningPlayer(g) != Player(PLAYER_NEUTRAL_PASSIVE) and /*
*/(not IsUnitPaused(g))) then
set total = total + 1
endif
endloop
if(Interval <= 0.0) then
set i = 0
loop
exitwhen(i >= total)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, f, "hand, left"))
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, f, "hand, right"))
set i = i + 1
endloop
endif
if(GetUnitAbilityLevel(f, ABILITY_ID) <= 0) then
call UnitAddAbility(f, ABILITY_ID)
endif
if(item3 > 0 or item5 > 0) then
call UnitAddAbility(f, UPGRADE2_ABILITY_ID1)
else
call UnitRemoveAbility(f, UPGRADE2_ABILITY_ID1)
endif
if(item4 > 0 or item5 > 0) then
call UnitAddAbility(f, UPGRADE2_ABILITY_ID2)
else
call UnitRemoveAbility(f, UPGRADE2_ABILITY_ID2)
endif
set lvl = (1 + (level - 1) * 6) + total
call SetUnitAbilityLevel(f, ABILITY_ID, lvl)
call SetUnitAbilityLevel(f, UPGRADE2_ABILITY_ID1, lvl)
call SetUnitAbilityLevel(f, UPGRADE2_ABILITY_ID2, lvl)
endif
endif
endloop
if(Interval > 0.0) then
set Interval = Interval - INTERVAL
else
set Interval = MAX_INTERVAL
endif
set owner = null
set f = null
set g = null
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local unit learner = GetLearningUnit()
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
if(GetUnitAbilityLevel(learner, SPELL_ID) <= 1 and (not IsUnitInGroup(learner, Group))) then
call GroupAddUnit(Group, learner)
call UnitAddAbility(learner, ABILITY_ID)
if(not IsTriggerEnabled(HexTrg)) then
call EnableTrigger(HexTrg)
endif
endif
set learner = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
local unit learner = GetTriggerUnit()
local boolean okey = GetLearnedSkill() == SPELL_ID and (not IsUnitIllusion(learner))
set learner = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set HexTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(HexLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(HexLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(HexLearnTrg, function Learn_Actions)
call TriggerRegisterTimerEventPeriodic(HexTrg, INTERVAL)
call DisableTrigger(HexTrg)
call TriggerAddAction(HexTrg, function Actions)
//Setting globals
set Group = CreateGroup()
set Interval = 0.0
set copy = CreateGroup()
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY_ID)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
globals
group TormentWarder = CreateGroup()
group TormentWard = CreateGroup()
endglobals
scope TormentWard initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A05U' //Spell Torment Ward rawcode
private constant integer ABILITY_ID = 'A05W' //Ability Max Speed rawcode
private constant integer DUMMY1_ID = 'osp1' //Dummy Torment Ward (Level 1) rawcode
private constant integer DUMMY2_ID = 'osp2' //Dummy Torment Ward (Level 2) rawcode
private constant integer DUMMY3_ID = 'osp3' //Dummy Torment Ward (Level 3) rawcode
private constant real WARD_POSITION_OFFSET = 100.0 //Position offset from caster
private constant real ATTACK_OFFSET = 10.0 //Offset when attacked by a Torment Ward
private constant integer ANIME = 3 //Animation index death alternate
private constant real DISTANCE_OFFSET = 200.0 //Distance offset
private constant real DISTANCE_FOR_PULL = 300.0 //Distance that wont pull
private constant real DISTANCE_MOVE = 10.0 //Distance move
private constant real DISTANCE_MIN = 100.0 //Distance minimum
private constant integer ITEM1_UPGRADE1 = 'I003' //Item Bronzesteel Knife
private constant integer ITEM1_UPGRADE2 = 'I006' //Item Baneriven Dagger
private constant integer ITEM1_UPGRADE3 = 'I010' //Item Venomwax Fang
private constant integer ITEM1_UPGRADE4 = 'I014' //Item Cinquedea Ivy
private constant integer ITEM2_UPGRADE1 = 'afac' //Item Scoutbow
private constant integer ITEM2_UPGRADE2 = 'ajen' //Item Ralex Hawk
private constant real UPGRADE1_DURATION1 = 5.0 //Upgrade 1 effect 1
private constant real UPGRADE1_DURATION2 = 10.0 //Upgrade 1 effect 2
private constant real UPGRADE1_DURATION3 = 20.0 //Upgrade 1 effect 3
private constant real UPGRADE1_DURATION4 = 30.0 //Upgrade 1 effect 4
private constant integer UPGRADE1_WARD4 = 1 //Upgrade 1 effect 4
private constant real UPGRADE2_OFFSET1 = 5.0 //Upgrade 2 effect 1
private constant real UPGRADE2_OFFSET2 = 10.0 //Upgrade 2 effect 2
private constant real UPGRADE2_RADIUS2 = 100.0 //Radius detection increase
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_MAGIC //Spell damage type
endglobals
//Total summon
private function Total_Ward takes integer level returns integer
if(level == 1) then
return 4
elseif(level == 2) then
return 4
elseif(level == 3) then
return 4
else
return 0
endif
endfunction
//Unit type
private function Ward_Type takes integer level returns integer
if(level == 1) then
return DUMMY1_ID
elseif(level == 2) then
return DUMMY2_ID
elseif(level == 3) then
return DUMMY3_ID
else
return 0
endif
endfunction
//Time duration
private function Duration takes integer level returns real
if(level == 1) then
return 30.0
elseif(level == 2) then
return 40.0
elseif(level == 3) then
return 60.0
else
return 0.0
endif
endfunction
//Radius detect
private function Radius takes integer level returns real
return 250.0 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false)
//*/(GetUnitTypeId(target) == DUMMY1_ID or /*
//*/GetUnitTypeId(target) == DUMMY2_ID or /*
//*/GetUnitTypeId(target) == DUMMY3_ID)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct TormentWard_Data
unit u //Unit caster
player o //Owner of caster
unit array dum[9] //Unit dummy ward
integer t //Total
real i //Interval
real d //Distance offset
real x //Target x
real y //Target y
boolean array m[9] //Mode
real r //Radius
real ao //Attack offset
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private TormentWard_Data array Ar[100]
private location loc
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local TormentWard_Data sd
local integer i = 0
local integer j = 0
local unit f = null
local integer lvl = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
set j = 0
loop
exitwhen(j >= sd.t)
if(sd.m[j]) then
set lvl = 1
call GroupEnumUnitsInRange(all, GetUnitX(sd.dum[j]), GetUnitY(sd.dum[j]), sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(f != sd.dum[j] and IsUnitAlly(f, sd.o) and (not IsUnitPaused(f))) then
set lvl = lvl + 1
endif
endloop
if(lvl > 1) then
call UnitAddAbility(sd.dum[j], ABILITY_ID)
else
call UnitRemoveAbility(sd.dum[j], ABILITY_ID)
endif
else
set sd.i = sd.i - Interval()
if(GetUnitState(sd.dum[j], UNIT_STATE_LIFE) >= GetUnitState(sd.dum[j], UNIT_STATE_MAX_LIFE)) then
call SetUnitAnimation(sd.dum[j], "stand")
call PauseUnit(sd.dum[j], false)
call SetUnitInvulnerable(sd.dum[j], false)
set sd.m[j] = true
endif
endif
set j = j + 1
endloop
if(not IsUnitInGroup(sd.u, TormentWarder)) then
call GroupAddUnit(TormentWarder, sd.u)
endif
else
set j = 0
loop
exitwhen(j >= sd.t)
call KillUnit(sd.dum[j])
call GroupRemoveUnit(TormentWard, sd.dum[j])
set j = j + 1
endloop
call GroupRemoveUnit(TormentWarder, sd.u)
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local TormentWard_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local real targetX = 0.0
local real targetY = 0.0
local real x = 0.0
local real y = 0.0
local real angle = 0.0
local real face = 0.0
local integer i = 0
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM1_UPGRADE4)
local integer item6 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer extraWard = 0
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
if(targetX > WorldBounds.minX + 300.0 and /*
*/targetX < WorldBounds.maxX - 300.0 and /*
*/targetY > WorldBounds.minY + 300.0 and /*
*/targetY < WorldBounds.maxY - 300.0 and (not IsWall(targetX, targetY, 100.0))) then
set sd = TormentWard_Data.create()
set sd.u = caster
set sd.o = owner
if(item4 > 0) then
set extraWard = UPGRADE1_WARD4 * item4
endif
set sd.t = Total_Ward(level) + extraWard
set angle = 360.0/sd.t
set i = 0
loop
exitwhen(i >= sd.t)
set face = i * angle
set x = targetX + DISTANCE_OFFSET * Cos(face * bj_DEGTORAD)
set y = targetY + DISTANCE_OFFSET * Sin(face * bj_DEGTORAD)
set sd.dum[i] = CreateUnit(owner, Ward_Type(level), x, y, face)
call SetUnitAnimation(sd.dum[i], "birth")
call GroupAddUnit(TormentWard, sd.dum[i])
set sd.m[i] = true
set i = i + 1
endloop
set sd.i = Duration(level)
set sd.d = DISTANCE_OFFSET
set sd.x = targetX
set sd.y = targetY
set sd.r = Radius(level)
call GroupAddUnit(TormentWarder, caster)
if(item1 > 0) then
set sd.i = sd.i + (UPGRADE1_DURATION1 * item1)
endif
if(item2 > 0) then
set sd.i = sd.i + (UPGRADE1_DURATION2 * item2)
endif
if(item3 > 0) then
set sd.i = sd.i + (UPGRADE1_DURATION3 * item3)
endif
if(item4 > 0) then
set sd.i = sd.i + (UPGRADE1_DURATION4 * item4)
endif
if(item6 > 0) then
set sd.r = sd.r + (UPGRADE2_RADIUS2 * item6)
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Die_Actions takes nothing returns nothing
local unit dying = GetTriggerUnit()
local integer dyingType = GetUnitTypeId(dying)
local real dyingX = GetUnitX(dying)
local real dyingY = GetUnitY(dying)
local real face = GetUnitFacing(dying)
local player owner = GetOwningPlayer(dying)
local TormentWard_Data sd
local integer i = 0
local integer j = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
set j = 0
loop
exitwhen(j >= sd.t)
if(dying == sd.dum[j]) then
set sd.dum[j] = CreateUnit(owner, dyingType, dyingX, dyingY, face)
call PauseUnit(sd.dum[j], true)
call SetUnitInvulnerable(sd.dum[j], true)
call SetUnitState(sd.dum[j], UNIT_STATE_LIFE, 1)
call SetUnitAnimationByIndex(sd.dum[j], ANIME)
call QueueUnitAnimation(sd.dum[j], "stand, alternate")
set sd.m[j] = false
set i = Total
set j = sd.t
endif
set j = j + 1
endloop
set i = i + 1
endloop
set dying = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Die_Conditions takes nothing returns boolean
return (GetUnitTypeId(GetTriggerUnit()) == DUMMY1_ID or /*
*/GetUnitTypeId(GetTriggerUnit()) == DUMMY2_ID or /*
*/GetUnitTypeId(GetTriggerUnit()) == DUMMY3_ID) and GetKillingUnit() != null
endfunction
//----------------------------------------------------------------
private function Attack_Actions takes nothing returns nothing
local unit attacker = GetAttacker()
local unit attacked = GetTriggerUnit()
local TormentWard_Data sd
local integer i = 0
local integer j = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
set j = 0
loop
exitwhen(j >= sd.t)
if(not IsUnitPaused(sd.dum[j])) then
call IssueTargetOrder(sd.dum[j], "attack", attacked)
endif
set j = j + 1
endloop
set i = i + 1
endloop
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Attack_Conditions takes nothing returns boolean
return IsUnitInGroup(GetAttacker(), TormentWarder)
endfunction
//----------------------------------------------------------------
function TormentWard_onDamage takes unit attacker, unit attacked, real amount returns nothing
local player owner = GetOwningPlayer(attacker)
local real attackerX = GetUnitX(attacker)
local real attackerY = GetUnitY(attacker)
local real attackedX = GetUnitX(attacked)
local real attackedY = GetUnitY(attacked)
local real dx = attackerX - attackedX
local real dy = attackerY - attackedY
local real distance = SquareRoot(dx * dx + dy * dy)
local real rad = Atan2(attackerY - attackedY, attackerX - attackedX)
local real tX = 0.0
local real tY = 0.0
local real offset = 0.0
local unit hero = GetHero(owner)
local integer item5 = 0
local integer item6 = 0
local real extraOffset = 0.0
set offset = ATTACK_OFFSET
if(hero != null) then
set item5 = IsUnitHasItemType(hero, ITEM2_UPGRADE1)
set item6 = IsUnitHasItemType(hero, ITEM2_UPGRADE2)
if(item5 > 0) then
set extraOffset = UPGRADE2_OFFSET1
endif
if(item6 > 0) then
set extraOffset = UPGRADE2_OFFSET2
endif
set offset = offset + extraOffset
endif
if(distance > DISTANCE_FOR_PULL) then
set tX = attackedX + offset * Cos(rad)
set tY = attackedY + offset * Sin(rad)
if((not IsUnitType(attacked, UNIT_TYPE_MAGIC_IMMUNE)) and /*
*/(GetUnitAbilityLevel(attacked, 'Avul') <= 0)) then
call SetUnitX(attacked, tX)
call SetUnitY(attacked, tY)
endif
endif
set owner = null
set attacker = null
set attacked = null
set hero = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(TormentWardTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(TormentWardTrg, Condition(function Conditions))
call TriggerAddAction(TormentWardTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(TormentWardDieTrg, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(TormentWardDieTrg, Condition(function Die_Conditions))
call TriggerAddAction(TormentWardDieTrg, function Die_Actions)
call TriggerRegisterAnyUnitEventBJ(TormentWardAttackTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(TormentWardAttackTrg, Condition(function Attack_Conditions))
call TriggerAddAction(TormentWardAttackTrg, function Attack_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set loc = Location(0, 0)
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY_ID)
endfunction
endscope
//TESH.scrollpos=181
//TESH.alwaysfold=0
scope Voodoo initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A05Z' //Spell Voodoo rawcode
private constant integer CAST_ID = 'ANhx' //Cast Voodoo rawcode
private constant integer BUFF_ID = 'B01S' //Buff Voodoo rawcode
private constant integer DAMAGE_KEY = 0 //Damage key
private constant integer READY_KEY = 1 //Ready to check damage key
private constant integer ITEM1_UPGRADE1 = 'I00M' //Item Mystic Wand
private constant integer ITEM1_UPGRADE2 = 'I027' //Item Mindseer of Ultimate
private constant integer ITEM2_UPGRADE1 = 'odef' //Item Eve Feather
private constant integer ITEM2_UPGRADE2 = 'gvsm' //Item Chronos the Forbidden
private constant real UPGRADE1_RADIUS1 = 100.0 //Upgrade 1 effect 1
private constant real UPGRADE1_RADIUS2 = 200.0 //Upgrade 1 effect 2
private constant real UPGRADE2_DAMAGE1 = 100.0 //Upgrade 1 effect 1
private constant real UPGRADE2_DAMAGE2 = 200.0 //Upgrade 1 effect 2
private constant attacktype A_TYPE = ATTACK_TYPE_CHAOS //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_UNIVERSAL //Spell damage type
private constant string UPGRADE_EFFECT = "Abilities\\Spells\\Human\\Polymorph\\PolyMorphDoneGround.mdl" //Upgrade effect
private constant string SPELL_EFFECT = "war3mapImported\\AncientExplode.mdx" //Spell effect
endglobals
//Initial damage
private function Initial_Damage takes integer level returns real
return 100.0 + (0.0 * level)
endfunction
//Damage absorb
private function Damage takes integer level returns real
return 0.0 + (400.0 * level)
endfunction
//Radius
private function Radius takes integer level returns real
return 500.0 + (0.0 * level)
endfunction
//Targets affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Voodoo_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of spell
group g //Group attacked
hashtable ht //Hashtable
boolean c //Channeling
real x //Target x
real y //Target y
real d //Damage require
real dm //Damage up per interval
boolean up //Upgrade
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Voodoo_Data array Ar[10]
private group copy
private location loc
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Voodoo_Data sd
local integer i = 0
local unit f = null
local integer fId
local real damage = 0.0
local boolean ready = false
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.c) then
set sd.d = sd.d + sd.dm
elseif(FirstOfGroup(sd.g) != null) then
set copy = CopyGroup(sd.g)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set fId = GetUnitUserData(f)
if(not IsUnitDead(f)) then
set damage = LoadReal(sd.ht, fId, DAMAGE_KEY)
set ready = LoadBoolean(sd.ht, fId, READY_KEY)
if(not ready) then
if(GetUnitAbilityLevel(f, BUFF_ID) > 0) then
call SaveBoolean(sd.ht, fId, READY_KEY, true)
endif
else
if(GetUnitAbilityLevel(f, BUFF_ID) <= 0) then
call FlushChildHashtable(sd.ht, fId)
call GroupRemoveUnit(sd.g, f)
if(sd.up) then
call UnitDamageTarget(sd.u, f, damage, true, false, A_TYPE, D_TYPE, null)
call DestroyEffect(AddSpecialEffectTarget(UPGRADE_EFFECT, f, "origin"))
endif
endif
if(damage >= sd.d) then
call UnitRemoveAbility(f, BUFF_ID)
call FlushChildHashtable(sd.ht, fId)
call GroupRemoveUnit(sd.g, f)
if(sd.up) then
call UnitDamageTarget(sd.u, f, damage, true, false, A_TYPE, D_TYPE, null)
call DestroyEffect(AddSpecialEffectTarget(UPGRADE_EFFECT, f, "origin"))
endif
endif
endif
else
call UnitRemoveAbility(f, BUFF_ID)
call FlushChildHashtable(sd.ht, fId)
call GroupRemoveUnit(sd.g, f)
endif
endloop
else
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Voodoo_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local real targetX = 0.0
local real targetY = 0.0
local boolean isNull = (Ar[Total] == null)
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_OS_Voodoo
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
if(isNull) then
set sd = Voodoo_Data.create()
set sd.g = CreateGroup()
set sd.ht = InitHashtable()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.c = true
set sd.x = targetX
set sd.y = targetY
set sd.d = Initial_Damage(level)
set sd.d = sd.d + (sd.d * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.dm = (Damage(level) / 2) / (1.0 / Interval())
set sd.up = false
if(item2 > 0) then
set sd.up = true
endif
if(item3 > 0) then
set sd.dm = sd.dm + ((UPGRADE2_DAMAGE1 / 2) / (1.0 / Interval()) * item3)
endif
if(item4 > 0) then
set sd.dm = sd.dm + ((UPGRADE2_DAMAGE2 / 2) / (1.0 / Interval()) * item4)
set sd.up = true
endif
set sd.dm = sd.dm + (sd.dm * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set owner = null
set s = null
endfunction
//----------------------------------------------------------------
private function Stop_Actions takes nothing returns nothing
local Voodoo_Data sd
local unit caster = GetTriggerUnit()
local integer i = 0
local unit f = null
local integer fId = 0
local real radius = 0.0
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local real extraRadius = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster and sd.c) then
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, sd.x, sd.y))
set radius = Radius(sd.l)
set extraRadius = 0.0
if(item1 > 0) then
set extraRadius = extraRadius + (UPGRADE1_RADIUS1 * item1)
endif
if(item2 > 0) then
set extraRadius = extraRadius + (UPGRADE1_RADIUS1 * item2)
endif
set radius = radius + extraRadius
call GroupEnumUnitsInRange(all, sd.x, sd.y, radius, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
if(GetUnitAbilityLevel(f, BUFF_ID) <= 0) then
set fId = GetUnitUserData(f)
call SaveReal(sd.ht, fId, DAMAGE_KEY, 0.0)
call SaveBoolean(sd.ht, fId, READY_KEY, false)
if(item2 > 0) then
call TargetCast(sd.o, sd.x, sd.y, 0.5, CAST_ID, sd.l + 2, "hex", 0, f)
else
call TargetCast(sd.o, sd.x, sd.y, 0.5, CAST_ID, sd.l, "hex", 0, f)
endif
call GroupAddUnit(sd.g, f)
endif
endif
endloop
set sd.c = false
set i = Total
endif
set i = i + 1
endloop
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
function Voodoo_onDamage takes unit attacker, unit attacked, real amount returns nothing
local integer attackedID = GetUnitUserData(attacked)
local Voodoo_Data sd
local integer i = 0
local real damage = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(IsUnitInGroup(attacked, sd.g)) then
set damage = LoadReal(sd.ht, attackedID, DAMAGE_KEY)
set damage = damage + amount
call SaveReal(sd.ht, attackedID, DAMAGE_KEY, damage)
endif
set i = i + 1
endloop
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(VoodooTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(VoodooTrg, Condition(function Conditions))
call TriggerAddAction(VoodooTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(VoodooStopTrg, EVENT_PLAYER_UNIT_SPELL_ENDCAST)
call TriggerAddCondition(VoodooStopTrg, Condition(function Conditions))
call TriggerAddAction(VoodooStopTrg, function Stop_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set copy = CreateGroup()
set loc = Location(0, 0)
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call Preload(SPELL_EFFECT)
call Preload(UPGRADE_EFFECT)
endfunction
endscope
//TESH.scrollpos=405
//TESH.alwaysfold=0
scope NecroDraw initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A063' //Spell Necro Draw rawcode
private constant integer DUMMY_ID = 'n00X' //Dummy Necro Draw rawcode
private constant integer DUMMY1_ID = 'n027' //Dummy Necro Draw Blast rawcode
private constant real DISTANCE_MOVE = 50.0 //Distance move of dummy
private constant real MIN_LIFE = 10.0 //Min life more than to use
private constant integer ITEM1_UPGRADE1 = 'mlst' //Item Vehemence
private constant integer ITEM1_UPGRADE2 = 'I00O' //Item Arcanite Reaver
private constant integer ITEM2_UPGRADE1 = 'prvt' //Item Periapt of Vitality
private constant integer ITEM2_UPGRADE2 = 'rhth' //Item Zemi of Eternal
private constant integer ITEM2_UPGRADE3 = 'I015' //Item Orb of Descent
private constant integer ITEM3_UPGRADE1 = 'I026' //Item Adamandatank
private constant integer ITEM3_UPGRADE2 = 'I023' //Item Orenda Spectrum
private constant real UPGRADE1_LIFE1 = 150.0 //Upgrade 1 effect 1
private constant real UPGRADE1_LIFE2 = 300.0 //Upgrade 1 effect 2
private constant real UPGRADE1_LIFE_COST1 = 0.05 //Upgrade 1 effect 1
private constant real UPGRADE1_LIFE_COST2 = 0.01 //Upgrade 1 effect 2
private constant real UPGRADE2_MAX_DAMAGE1 = 200.0 //Upgrade 2 effect 1
private constant real UPGRADE2_MAX_DAMAGE2 = 400.0 //Upgrade 2 effect 2
private constant real UPGRADE2_MAX_DAMAGE3 = 600.0 //Upgrade 2 effect 3
private constant real UPGRADE2_RADIUS3 = 100.0 //Upgrade 2 effect 3
private constant real UPGRADE3_DAMAGE_ABSORB1 = 5.0 //Upgrade 3 effect 1
private constant real UPGRADE3_DAMAGE_ABSORB2 = 10.0 //Upgrade 3 effect 2
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_DEATH //Spell attack type
private constant string SPELL_EFFECT = "Abilities\\Spells\\Undead\\DeathCoil\\DeathCoilSpecialArt.mdl" //Effect to target
endglobals
//Life used
private function Life_Use takes integer level returns real
if(level == 1) then
return 0.1
elseif(level == 2) then
return 0.1
elseif(level == 3) then
return 0.1
elseif(level == 4) then
return 0.1
else
return 0.0
endif
endfunction
//Radius absorb
private function Radius_Absorb takes integer level returns real
if(level == 1) then
return 200.0
elseif(level == 2) then
return 200.0
elseif(level == 3) then
return 300.0
elseif(level == 4) then
return 400.0
else
return 0.0
endif
endfunction
//Absorb amount
private function Absorb_Amount takes integer level returns real
if(level == 1) then
return 10.0
elseif(level == 2) then
return 15.0
elseif(level == 3) then
return 25.0
elseif(level == 4) then
return 40.0
else
return 0.0
endif
endfunction
//Radius
private function Radius takes integer level returns real
if(level == 1) then
return 200.0
elseif(level == 2) then
return 250.0
elseif(level == 3) then
return 300.0
elseif(level == 4) then
return 400.0
else
return 0.0
endif
endfunction
//Damage
private function Damage takes integer level returns real
if(level == 1) then
return 100.0
elseif(level == 2) then
return 100.0
elseif(level == 3) then
return 100.0
elseif(level == 4) then
return 100.0
else
return 0.0
endif
endfunction
//Max damage
private function Max_Damage takes integer level returns real
if(level == 1) then
return 800.0
elseif(level == 2) then
return 800.0
elseif(level == 3) then
return 800.0
elseif(level == 4) then
return 800.0
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct NecroDraw_Data
unit u //Unit caster
integer uID //Caster id
player o //Owner of caster
unit dum //Unit dummy
group g //Group target
real x //Target x
real y //Target y
real d //Distance travel
real dm //Distance move per interval
real cos //Cos of angle
real sin //Sin of angle
real aa //Absorb amount per unit
real ar //Absorb radius
real dd //Total absorb deal
real md //Max damage
real r //Radius effect
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private NecroDraw_Data array Ar[10]
private group all
private group copy
private boolexpr bexpr
private location loc
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local NecroDraw_Data sd
local integer i = 0
local real x = 0.0
local real y = 0.0
local unit f = null
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local unit dummy = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.d > 0) then
set x = GetUnitX(sd.dum) + sd.dm * sd.cos
set y = GetUnitY(sd.dum) + sd.dm * sd.sin
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0and (not IsWall(x, y, 100.0))) then
call SetUnitPosition(sd.dum, x, y)
endif
if(sd.dd < sd.md) then
call GroupEnumUnitsInRange(all, x, y, sd.ar, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(not IsUnitInGroup(f, sd.g)) then
call GroupAddUnit(sd.g, f)
if(IsUnitEnemy(f, sd.o)) then
call UnitDamageTarget(sd.u, f, sd.aa, true, false, A_TYPE, D_TYPE, null)
else
if(GetUnitState(f, UNIT_STATE_LIFE) > sd.aa * 2) then
call SetUnitState(f, UNIT_STATE_LIFE, GetUnitState(f, UNIT_STATE_LIFE) - sd.aa)
endif
endif
set sd.dd = sd.dd + sd.aa
endif
endloop
set copy = CopyGroup(RisingDeadUnit)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set dx = GetUnitX(f) - x
set dy = GetUnitY(f) - y
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= sd.ar) then
if(IsUnitEnemy(f, sd.o)) then
//call UnitDamageTarget(sd.u, f, sd.aa, true, false, A_TYPE, D_TYPE, null)
else
//call SetUnitState(f, UNIT_STATE_LIFE, GetUnitState(f, UNIT_STATE_LIFE) - sd.aa)
endif
call KillUnit(f)
set sd.dd = sd.dd + sd.aa
endif
endloop
else
set sd.dd = sd.md
endif
set sd.d = sd.d - sd.dm
else
call KillUnit(sd.dum)
set x = sd.x
set y = sd.y
set dummy = CreateUnit(sd.o, DUMMY1_ID, x, y, bj_UNIT_FACING)
call UnitApplyTimedLife(dummy, 'BTLF', 2.0)
if(sd.dd < sd.md) then
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(not IsUnitInGroup(f, sd.g)) then
call GroupAddUnit(sd.g, f)
if(IsUnitEnemy(f, sd.o)) then
call UnitDamageTarget(sd.u, f, sd.aa, true, false, A_TYPE, D_TYPE, null)
else
if(GetUnitState(f, UNIT_STATE_LIFE) > sd.aa * 2) then
call SetUnitState(f, UNIT_STATE_LIFE, GetUnitState(f, UNIT_STATE_LIFE) - sd.aa)
endif
endif
set sd.dd = sd.dd + sd.aa
endif
endloop
set copy = CopyGroup(RisingDeadUnit)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set dx = GetUnitX(f) - x
set dy = GetUnitY(f) - y
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= sd.r) then
if(IsUnitEnemy(f, sd.o)) then
//call UnitDamageTarget(sd.u, f, sd.aa, true, false, A_TYPE, D_TYPE, null)
else
//call SetUnitState(f, UNIT_STATE_LIFE, GetUnitState(f, UNIT_STATE_LIFE) - sd.aa)
endif
call KillUnit(f)
set sd.dd = sd.dd + sd.aa
endif
endloop
else
set sd.dd = sd.md
endif
set sd.dd = sd.dd + (sd.dd * LoadInteger(MagicDamage_Ht, GetUnitUserData(sd.u), 0) * 0.01)
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, f, "origin"))
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
else
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, f, "origin"))
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call SetUnitState(f, UNIT_STATE_LIFE, GetUnitState(f, UNIT_STATE_LIFE) + sd.dd * ETHEREAL_BONUS)
else
call SetUnitState(f, UNIT_STATE_LIFE, GetUnitState(f, UNIT_STATE_LIFE) + sd.dd)
endif
endif
endloop
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
set sd.u = null
set sd.o = null
set sd.dum = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
set dummy = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local NecroDraw_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local real targetX = 0.0
local real targetY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local real angle = 0.0
local boolean isNull = (Ar[Total] == null)
local real lifeDamage = 0.0
local real lifeCost = 0.0
local real life = 0.0
local real maxDamage = 0.0
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE3)
local integer item6 = IsUnitHasItemType(caster, ITEM3_UPGRADE1)
local integer item7 = IsUnitHasItemType(caster, ITEM3_UPGRADE2)
set lifeCost = Life_Use(level)
set maxDamage = Max_Damage(level)
if(item1 > 0) then
set lifeDamage = lifeDamage + (UPGRADE1_LIFE1 * item1)
set lifeCost = lifeCost + (UPGRADE1_LIFE_COST1 * item1)
endif
if(item2 > 0) then
set lifeDamage = lifeDamage + (UPGRADE1_LIFE2 * item2)
set lifeCost = lifeCost + (UPGRADE1_LIFE_COST2 * item2)
endif
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
set dx = casterX - targetX
set dy = casterY - targetY
set distance = SquareRoot(dx * dx + dy * dy)
set angle = Atan2(targetY - casterY, targetX - casterX)
if(isNull) then
set sd = NecroDraw_Data.create()
set sd.g = CreateGroup()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.uID = casterID
set sd.o = GetOwningPlayer(caster)
set sd.dum = CreateUnit(sd.o, DUMMY_ID, casterX, casterY, angle * bj_RADTODEG)
set sd.x = targetX
set sd.y = targetY
set sd.d = distance
set sd.dm = DISTANCE_MOVE
set sd.cos = Cos(angle)
set sd.sin = Sin(angle)
set sd.aa = Absorb_Amount(level)
set sd.ar = Radius_Absorb(level)
set sd.dd = Damage(level) + lifeDamage
set sd.md = maxDamage
set sd.r = Radius(level)
call SetUnitExploded(sd.dum, true)
set life = GetUnitState(caster, UNIT_STATE_LIFE) * lifeCost
if(not IsUnitType(caster, UNIT_TYPE_MAGIC_IMMUNE)) then
if(GetUnitState(caster, UNIT_STATE_LIFE) > life + MIN_LIFE) then
call SetUnitState(caster, UNIT_STATE_LIFE, GetUnitState(caster, UNIT_STATE_LIFE) - life)
else
call SetUnitState(caster, UNIT_STATE_LIFE, MIN_LIFE)
endif
endif
if(item3 > 0) then
set sd.md = sd.md + (UPGRADE2_MAX_DAMAGE1 * item3)
endif
if(item4 > 0) then
set sd.md = sd.md + (UPGRADE2_MAX_DAMAGE2 * item4)
endif
if(item5 > 0) then
set sd.md = sd.md + (UPGRADE2_MAX_DAMAGE3 * item5)
set sd.ar = sd.ar + UPGRADE2_RADIUS3
set sd.r = sd.r + UPGRADE2_RADIUS3
endif
if(item6 > 0) then
set sd.aa = sd.aa + (UPGRADE3_DAMAGE_ABSORB1 * item6)
endif
if(item7 > 0) then
set sd.aa = sd.aa + (UPGRADE3_DAMAGE_ABSORB2 * item7)
endif
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(NecroDrawTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(NecroDrawTrg, Condition(function Conditions))
call TriggerAddAction(NecroDrawTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set copy = CreateGroup()
set bexpr = Condition(function Pick)
set loc = Location(0, 0)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=468
//TESH.alwaysfold=0
globals
group RisingDeadUnit = CreateGroup()
endglobals
scope RisingDead initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A064' //Spell Rising Dead rawcode
private constant integer DUMMY_ID = 'n01F' //Dummy Death rawcode
private constant integer ITEM1_UPGRADE1 = 'cnob' //Item Horn of Prominence
private constant integer ITEM1_UPGRADE2 = 'I01Q' //Item Book of Spirit
private constant integer ITEM1_UPGRADE3 = 'I01R' //Item Shadow Grimoire
private constant integer ITEM2_UPGRADE1 = 'I00Q' //Item Edge of Blaze
private constant integer ITEM2_UPGRADE2 = 'frgd' //Item Heaven Rapier
private constant integer ITEM3_UPGRADE1 = 'I01A' //Item Fatal Cleaver
private constant integer ITEM3_UPGRADE2 = 'I01C' //Item Sagaris Carnage
private constant integer UPGRADE1_MAX_UNIT1 = 1 //Upgrade 1 effect 1
private constant integer UPGRADE1_MAX_UNIT2 = 2 //Upgrade 1 effect 2
private constant integer UPGRADE1_MAX_UNIT3 = 3 //Upgrade 1 effect 3
private constant real UPGRADE1_DEAD_DURATION3 = 10.0 //Upgrade 1 effect 3
private constant real UPGRADE2_DURATION1 = 10.0 //Upgrade 1 effect 1
private constant real UPGRADE2_DURATION2 = 20.0 //Upgrade 1 effect 2
private constant real UPGRADE3_TRANSFER1 = 0.1 //Upgrade 1 effect 1
private constant real UPGRADE3_TRANSFER2 = 0.2 //Upgrade 1 effect 2
private constant damagetype D_TYPE = DAMAGE_TYPE_DEATH //Spell attack type
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Undead\\DarkSummoning\\DarkSummonMissile.mdl" //Effect on target
private constant string SPELL_EFFECT = "Abilities\\Spells\\Undead\\RaiseSkeletonWarrior\\RaiseSkeleton.mdl" //Effect of Rising Dead
private constant string DEAD_EFFECT = "Abilities\\Spells\\Undead\\DeathCoil\\DeathCoilSpecialArt.mdl" //Effect to target when Rising Dead is dead
endglobals
//Max unit
private function Max_Unit takes integer level returns integer
if(level == 1) then
return 4
elseif(level == 2) then
return 6
elseif(level == 3) then
return 10
else
return 0
endif
endfunction
//Radius of effect
private function Radius takes integer level returns real
return 1000.0 + (0.0 * level)
endfunction
//Duration of summoning unit
private function Duration takes integer level returns real
return 30.0 + (0.0 * level)
endfunction
//Duration of unit summoned
private function Dead_Time takes integer level returns real
return 20.0 + (0.0 * level)
endfunction
//Percent life transfer after dead gone
private function Transfer_Percent takes integer level returns real
return 0.1 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_HERO) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_ANCIENT) == false) and/*
*/(IsUnitIllusion(target) == false)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct RisingDead_Data
unit u //Unit caster
player o //Owner of caster
unit t //Unit target
integer l //Level of spell
group g //Group unit
boolean y //Ally with target
boolean f //Finish
real tr //Time remain
real r //Radius
integer c //Count
integer mc //Max count
real ud //Unit duration
effect e //Effect at target
real i //Interval
real im //Interval max
boolean dr //Order
real p //Percent life
boolean up //Upgrade
endstruct
//----------------------------------------------------------------
globals
private group all
private group copy
private boolexpr bexpr
private RisingDead_Data array Ar[100]
private timer Tim
private integer Total
private group Riser
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local RisingDead_Data sd
local integer i = 0
local real x = 0.0
local real y = 0.0
local unit f = null
local real fX = 0.0
local real fY = 0.0
local real tX = 0.0
local real tY = 0.0
local unit summon = null
local real face = 0.0
local real rad = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.tr > 0 and /*
*/not IsUnitDead(sd.u)) then
set sd.tr = sd.tr - Interval()
set x = GetUnitX(sd.t)
set y = GetUnitY(sd.t)
set face = GetUnitFacing(sd.t)
set rad = face * bj_DEGTORAD
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(sd.c < sd.mc) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
//set tX = x + 50.0 * Cos(rad)
//set tY = y + 50.0 * Sin(rad)
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, fX, fY))
set summon = CreateUnit(sd.o, GetUnitTypeId(f), fX, fY, GetUnitFacing(f))
//call SetUnitVertexColor(summon, 50, 50, 50, 255)
call GroupAddUnit(sd.g, summon)
call GroupAddUnit(RisingDeadUnit, summon)
call SetUnitExploded(summon, true)
call UnitAddAbility(summon, 'Aloc')
call UnitApplyTimedLife(summon, 'BUan', sd.ud)
call IssueTargetOrder(summon, "smart", sd.t)
call UnitAddType(summon, UNIT_TYPE_SUMMONED)
call SetUnitMoveSpeed(summon, 522)
call RemoveUnit(f)
set sd.c = sd.c + 1
endif
endloop
if(sd.y) then
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
elseif(not sd.dr) then
set sd.dr = true
set copy = CopyGroup(sd.g)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not IsUnitDead(f)) then
call IssueTargetOrder(summon, "smart", sd.t)
else
call GroupRemoveUnit(sd.g, f)
endif
endloop
endif
endif
elseif(not sd.f) then
set sd.f = true
call DestroyEffect(sd.e)
set sd.e = null
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
call KillUnit(f)
endloop
else
call GroupRemoveUnit(Riser, sd.t)
if(sd.e != null) then
call DestroyEffect(sd.e)
set sd.e = null
endif
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
set sd.u = null
set sd.o = null
set sd.t = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set summon = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local RisingDead_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local unit target = GetSpellTargetUnit()
local real targetX = GetUnitX(target)
local real targetY = GetUnitY(target)
local boolean isNull = (Ar[Total] == null)
local boolean exist = false
local integer i = 0
local integer maxUnit = Max_Unit(level)
local real duration = Duration(level)
local real lifeDuration = Dead_Time(level)
local real transferPercent = Transfer_Percent(level)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item6 = IsUnitHasItemType(caster, ITEM3_UPGRADE1)
local integer item7 = IsUnitHasItemType(caster, ITEM3_UPGRADE2)
if(item1 > 0) then
set maxUnit = maxUnit + (UPGRADE1_MAX_UNIT1 * item1)
endif
if(item2 > 0) then
set maxUnit = maxUnit + (UPGRADE1_MAX_UNIT2 * item2)
endif
if(item3 > 0) then
set maxUnit = maxUnit + (UPGRADE1_MAX_UNIT3 * item3)
set lifeDuration = lifeDuration + (UPGRADE1_DEAD_DURATION3 * item3)
endif
if(item4 > 0) then
set duration = duration + (UPGRADE2_DURATION1 * item4)
endif
if(item5 > 0) then
set duration = duration + (UPGRADE2_DURATION2 * item5)
endif
if(item6 > 0) then
set transferPercent = transferPercent + (UPGRADE3_TRANSFER1 * item6)
endif
if(item7 > 0) then
set transferPercent = transferPercent + (UPGRADE3_TRANSFER2 * item7)
endif
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(target == sd.t) then
set exist = true
set sd.l = level
set sd.tr = duration
set sd.r = Radius(level)
set sd.mc = maxUnit
set sd.ud = lifeDuration
set sd.p = transferPercent
set i = Total
endif
set i = i + 1
endloop
if(not exist) then
if(isNull) then
set sd = RisingDead_Data.create()
set sd.g = CreateGroup()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.o = owner
set sd.t = target
set sd.l = level
set sd.y = IsUnitAlly(target, owner)
set sd.f = false
set sd.tr = duration
set sd.r = Radius(level)
set sd.c = 0
set sd.mc = maxUnit
set sd.ud = lifeDuration
set sd.e = AddSpecialEffectTarget(SPECIAL_EFFECT, target, "origin")
set sd.i = 0.0
set sd.im = 3.0
set sd.dr = false
set sd.p = transferPercent
call GroupAddUnit(Riser, target)
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total =Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
endif
set caster = null
set owner = null
set target = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Die_Actions takes nothing returns nothing
local RisingDead_Data sd
local unit dying = GetDyingUnit()
local integer i = 0
local real life = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(IsUnitInGroup(dying, sd.g)) then
set life = GetUnitState(dying, UNIT_STATE_MAX_LIFE) * sd.p
set life = life + (life * LoadInteger(MagicDamage_Ht, GetUnitUserData(sd.u), 0) * 0.01)
call GroupRemoveUnit(sd.g, dying)
set sd.c = sd.c - 1
call DestroyEffect(AddSpecialEffectTarget(DEAD_EFFECT, sd.t, "origin"))
if(sd.y) then
if(IsUnitType(sd.t, UNIT_TYPE_ETHEREAL)) then
call SetUnitState(sd.t, UNIT_STATE_LIFE, GetUnitState(sd.t, UNIT_STATE_LIFE) + life * ETHEREAL_BONUS)
else
call SetUnitState(sd.t, UNIT_STATE_LIFE, GetUnitState(sd.t, UNIT_STATE_LIFE) + life)
endif
else
if(IsUnitType(sd.t, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(dying, sd.t, life, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(dying, sd.t, life, true, false, A_TYPE, D_TYPE, null)
endif
endif
set i = Total
endif
set i = i + 1
endloop
set dying = null
endfunction
//----------------------------------------------------------------
private function Die_Conditions takes nothing returns boolean
local unit dying = GetTriggerUnit()
local boolean okey = IsUnitInGroup(dying, RisingDeadUnit)
set dying = null
return okey
endfunction
//----------------------------------------------------------------
private function Attack_Actions takes nothing returns nothing
local RisingDead_Data sd
local unit attacker = GetAttacker()
local unit attacked = GetTriggerUnit()
local integer i = 0
local unit f = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.y) then
if(attacker == sd.t) then
set copy = CopyGroup(sd.g)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
call IssueTargetOrder(f, "attack", attacked)
endloop
set sd.i = sd.im
set sd.dr = false
set i = Total
endif
endif
set i = i + 1
endloop
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Attack_Conditions takes nothing returns boolean
local unit attacker = GetAttacker()
local boolean okey = IsUnitInGroup(attacker, Riser)
set attacker = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(RisingDeadTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(RisingDeadTrg, Condition(function Conditions))
call TriggerAddAction(RisingDeadTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(RisingDeadDieTrg, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(RisingDeadDieTrg, Condition(function Die_Conditions))
call TriggerAddAction(RisingDeadDieTrg, function Die_Actions)
call TriggerRegisterAnyUnitEventBJ(RisingDeadAttackTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(RisingDeadAttackTrg, Condition(function Attack_Conditions))
call TriggerAddAction(RisingDeadAttackTrg, function Attack_Actions)
//Setting globals
set all = CreateGroup()
set copy = CreateGroup()
set bexpr = Condition(function Pick)
set Tim = CreateTimer()
set Total = 0
set Riser = CreateGroup()
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
endfunction
endscope
//TESH.scrollpos=86
//TESH.alwaysfold=0
scope SwordAbyss initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A067' //Spell Sword of Abyss rawcode
private constant integer CAST_ID = 'A068' //Cast Sword of Abyss (Dummy) rawcode
private constant integer BUFF_ID = 'B01T' //Buff Sword of Abyss rawcode
private constant integer ITEM1_UPGRADE1 = 'I00Y' //Item Blight River
private constant integer ITEM1_UPGRADE2 = 'rugt' //Item Aphotical Scythe
private constant integer ITEM2_UPGRADE1 = 'I00R' //Item Aztez Spear
private constant integer ITEM2_UPGRADE2 = 'I00S' //Item Truepierce Lance
private constant integer ITEM2_UPGRADE3 = 'I002' //Item Amazon Meld
private constant real UPGRADE1_RESTORE_PERCENT1 = 0.01 //Upgrade 1 effect 1
private constant real UPGRADE1_RESTORE_PERCENT2 = 0.02 //Upgrade 1 effect 1
private constant real UPGRADE2_LIFE1 = 0.05 //Upgrade 1 effect
private constant real UPGRADE2_LIFE2 = 0.10 //Upgrade 1 effect
private constant real UPGRADE2_LIFE3 = 0.15 //Upgrade 1 effect
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_DEATH //Spell attack type
private constant string SPELL_EFFECT = "Abilities\\Spells\\Undead\\CarrionSwarm\\CarrionSwarmDamage.mdl" //Attack effect
endglobals
//Restoration percent when attack
private function Restore_Percent takes integer level returns real
if(level == 1) then
return 0.03
elseif(level == 2) then
return 0.06
elseif(level == 3) then
return 0.09
else
return 0.0
endif
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit attacker = GetAttacker()
local real attackerX = GetUnitX(attacker)
local real attackerY = GetUnitY(attacker)
local player owner = GetOwningPlayer(attacker)
local unit attacked = GetTriggerUnit()
local unit f = null
if(GetUnitAbilityLevel(attacked, BUFF_ID) <= 0) then
call SetUnitAnimationByIndex(attacker, 10)
call TargetCast(owner, attackerX, attackerY, 0.5, CAST_ID, 1, "curse", 0, attacked)
endif
set attacker = null
set owner = null
set attacked = null
set f = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit attacker = GetAttacker()
local boolean okey = GetUnitAbilityLevel(attacker, SPELL_ID) > 0
set attacker = null
return okey
endfunction
//----------------------------------------------------------------
function SwordAbyss_onDamage takes unit attacker, unit attacked, real amount returns nothing
local integer level = GetUnitAbilityLevel(attacker, SPELL_ID)
local real percent = Restore_Percent(level)
local real life = GetUnitState(attacker, UNIT_STATE_LIFE)
local real maxLife = GetUnitState(attacker, UNIT_STATE_MAX_LIFE)
local real heal = 0.0
local integer item1 = IsUnitHasItemType(attacker, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(attacker, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(attacker, ITEM2_UPGRADE1)
local integer item4 = IsUnitHasItemType(attacker, ITEM2_UPGRADE2)
local integer item5 = IsUnitHasItemType(attacker, ITEM2_UPGRADE3)
local real percentDamage = 0.0
local real damage = 0.0
call UnitRemoveAbility(attacked, BUFF_ID)
if(item1 > 0) then
set percent = percent + (UPGRADE1_RESTORE_PERCENT1 * item1)
endif
if(item2 > 0) then
set percent = percent + (UPGRADE1_RESTORE_PERCENT2 * item2)
endif
if(item3 > 0) then
set percentDamage = percentDamage + (UPGRADE2_LIFE1 * item3)
endif
if(item4 > 0) then
set percentDamage = percentDamage + (UPGRADE2_LIFE2 * item4)
endif
if(item5 > 0) then
set percentDamage = percentDamage + (UPGRADE2_LIFE3 * item5)
endif
set heal = (maxLife - life) * percent
set damage = (maxLife - life) * percentDamage
set heal = heal + (heal * LoadInteger(MagicDamage_Ht, GetUnitUserData(attacker), 0) * 0.01)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, attacker, "head"))
call SetUnitState(attacker, UNIT_STATE_LIFE, life + heal)
if(damage > 0) then
set damage = damage + (damage * LoadInteger(MagicDamage_Ht, GetUnitUserData(attacker), 0) * 0.01)
call UnitDamageTarget(attacker, attacked, damage, true, false, A_TYPE, D_TYPE, null)
endif
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(SwordAbyssTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(SwordAbyssTrg, Condition(function Conditions))
call TriggerAddAction(SwordAbyssTrg, function Actions)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=386
//TESH.alwaysfold=0
scope DeathPath initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A065' //Spell DeathPath Frenzy rawcode
private constant integer DUMMY_ID = 'n00Y' //Dummy (Infernal) rawcode
private constant integer ITEM1_UPGRADE1 = 'bgst' //Item Valor Front
private constant integer ITEM1_UPGRADE2 = 'I00F' //Item Tribal Headdress
private constant integer ITEM1_UPGRADE3 = 'I00G' //Item Guardian's Helm
private constant integer ITEM1_UPGRADE4 = 'I01F' //Item Ataraxia Sparta
private constant integer ITEM1_UPGRADE5 = 'I01G' //Item Throne of Emperor
private constant integer ITEM2_UPGRADE1 = 'brac' //Item Giant Belt
private constant integer ITEM2_UPGRADE2 = 'ward' //Item Drum of Horde
private constant integer ITEM2_UPGRADE3 = 'I01H' //Item Wrist of Hercules
private constant real UPGRADE1_LIFE_TIME1 = 1.0 //Upgrade 1 effect 1
private constant real UPGRADE1_LIFE_TIME2 = 2.0 //Upgrade 1 effect 2
private constant real UPGRADE1_LIFE_TIME3 = 3.0 //Upgrade 1 effect 3
private constant real UPGRADE1_LIFE_TIME4 = 4.0 //Upgrade 1 effect 4
private constant real UPGRADE1_LIFE_TIME5 = 5.0 //Upgrade 1 effect 5
private constant real UPGRADE1_DAMAGE4 = 5.0 //Upgrade 1 effect 4
private constant real UPGRADE1_DAMAGE5 = 10.0 //Upgrade 1 effect 5
private constant real UPGRADE2_DURATION1 = 3.0 //Upgrade 2 effect 1
private constant real UPGRADE2_DURATION2 = 6.0 //Upgrade 2 effect 2
private constant real UPGRADE2_DURATION3 = 9.0 //Upgrade 2 effect 3
private constant real UPGRADE2_MOVE_SPEED3 = 10.0 //Upgrade 2 effect 3
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\NightElf\\Immolation\\ImmolationTarget.mdl" //Effect to caster
private constant string TARGET_EFFECT = "Abilities\\Spells\\NightElf\\Immolation\\ImmolationDamage.mdl" //Effect burn to target
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_DEATH //Spell attack type
endglobals
//Damage deal
private function Damage takes integer level returns real
if(level == 1) then
return 10.0
elseif(level == 2) then
return 15.0
elseif(level == 3) then
return 25.0
else
return 0.0
endif
endfunction
//Damage to self by percentage
private function Sacrifice takes integer level returns real
if(level == 1) then
return 0.05
elseif(level == 2) then
return 0.05
elseif(level == 3) then
return 0.05
else
return 0.0
endif
endfunction
//Damage radius
private function Damage_Radius takes integer level returns real
return 200.0 + (0.0 * level)
endfunction
//Extra move speed
private function Move_Speed takes integer level returns integer
if(level == 1) then
return 30
elseif(level == 2) then
return 40
elseif(level == 3) then
return 60
else
return 0
endif
endfunction
//Move speed per damage
private function Move_Speed_Gain takes integer level returns integer
return 0 + (10 * level)
endfunction
//Time remain
private function Time_Remain takes integer level returns real
return 10.0 + (0.0 * level)
endfunction
//Dummy life time
private function Life_Time takes integer level returns real
return 5.0 + (0.0 * level)
endfunction
//Dummy summon interval
private function Summon_Interval takes integer level returns real
return 0.08 + (0.0 * level)
endfunction
//Dummy summon interval
private function Interval_Damage takes integer level returns real
return 1.0 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct DeathPath_Data
unit u //Unit caster
player o //Owner of caster
group g //Group of fire
real s //Sacrifice damage
real d //Damage fire
real dr //Damage radius
real id //Interval damage
real idm //Max interval damage
real x //X of caster
real y //Y of caster
integer mg //Move speed gain
real t //Time remain
effect e //Effect to caster
real lt //Life time of dummy
real i //Interval summon fire
real im //Max of interval summon fire
endstruct
//----------------------------------------------------------------
globals
private group all
private group copy
private boolexpr bexpr
private integer Total
private timer Tim
private DeathPath_Data array Ar[10]
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local DeathPath_Data sd
local integer i = 0
local unit summon = null
local unit f = null
local real cX = 0.0
local real cY = 0.0
local real fX = 0.0
local real fY = 0.0
local unit g = null
local real damage = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(not IsUnitDead(sd.u)) then
if(sd.t > 0) then
set sd.t = sd.t - Interval()
set cX = GetUnitX(sd.u)
set cY = GetUnitY(sd.u)
if(sd.i > 0) then
set sd.i = sd.i - Interval()
elseif(sd.x != cX or sd.y != cY) then
set sd.i = sd.im
set summon = CreateUnit(sd.o, DUMMY_ID, cX, cY, bj_UNIT_FACING)
call GroupAddUnit(sd.g, summon)
call UnitApplyTimedLife(summon, 'BTLF', sd.lt)
call SetUnitPathing(summon, false)
call SetUnitX(summon, cX)
call SetUnitY(summon, cY)
set summon = null
endif
if(sd.id > 0) then
set sd.id = sd.id - Interval()
else
set sd.id = sd.idm
call HitTree(cX, cY, sd.dr, 0, 2.0)
call GroupEnumUnitsInRange(all, cX, cY, sd.dr, bexpr)
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
if(IsUnitEnemy(g, sd.o)) then
call UnitDamageTarget(sd.u, g, sd.d, true, false, A_TYPE, D_TYPE, null)
call Timed_AddSpecialEffectTarget(TARGET_EFFECT, g, "head", 0.5)
endif
endloop
set copy = CopyGroup(sd.g)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not IsUnitDead(f)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
call GroupEnumUnitsInRange(all, fX, fY, sd.dr, bexpr)
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
if(IsUnitEnemy(g, sd.o)) then
if(IsUnitType(g, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, g, sd.d, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, g, sd.d, true, false, A_TYPE, D_TYPE, null)
endif
call Timed_AddSpecialEffectTarget(TARGET_EFFECT, g, "head", 0.5)
endif
endloop
else
call GroupRemoveUnit(sd.g, f)
endif
endloop
if(GetUnitState(sd.u, UNIT_STATE_LIFE) > 0.1 * GetUnitState(sd.u, UNIT_STATE_MAX_LIFE)) then
if(GetUnitMoveSpeed(sd.u) < 522.0) then
call SetUnitMoveSpeed(sd.u, GetUnitMoveSpeed(sd.u) + sd.mg)
endif
if(sd.x != cX or sd.y != cY) then
set damage = sd.s * GetUnitState(sd.u, UNIT_STATE_LIFE)
if(IsUnitType(g, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, sd.u, damage, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, sd.u, damage, true, false, A_TYPE, D_TYPE, null)
endif
endif
else
set sd.t = 0.0
endif
endif
set sd.x = cX
set sd.y = cY
else
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
call KillUnit(f)
endloop
call SetUnitMoveSpeed(sd.u, GetUnitDefaultMoveSpeed(sd.u))
call DestroyEffect(sd.e)
set sd.e = null
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
else
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
call KillUnit(f)
endloop
call SetUnitMoveSpeed(sd.u, GetUnitDefaultMoveSpeed(sd.u))
call DestroyEffect(sd.e)
set sd.e = null
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
set g = null
set summon = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local DeathPath_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local boolean isNull = (Ar[Total] == null)
local integer i = 0
local boolean exist = false
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM1_UPGRADE4)
local integer item5 = IsUnitHasItemType(caster, ITEM1_UPGRADE5)
local integer item6 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item7 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item8 = IsUnitHasItemType(caster, ITEM2_UPGRADE3)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_DL_DeathPath
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
set exist = false
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster and (not exist)) then
set i = Total
set exist = true
endif
set i = i + 1
endloop
if(not exist) then
if(isNull) then
set sd = DeathPath_Data.create()
set sd.g = CreateGroup()
else
set sd = Ar[Total]
endif
endif
set sd.u = caster
set sd.o = owner
set sd.s = Sacrifice(level)
set sd.d = Damage(level)
set sd.dr = Damage_Radius(level)
set sd.id = 0
set sd.idm = Interval_Damage(level)
set sd.x = 0.0
set sd.y = 0.0
set sd.mg = Move_Speed_Gain(level)
set sd.t = Time_Remain(level)
set sd.lt = Life_Time(level)
set sd.i = 0
set sd.im = Summon_Interval(level)
if(item1 > 0) then
set sd.lt = sd.lt + (UPGRADE1_LIFE_TIME1 * item1)
endif
if(item2 > 0) then
set sd.lt = sd.lt + (UPGRADE1_LIFE_TIME2 * item2)
endif
if(item3 > 0) then
set sd.lt = sd.lt + (UPGRADE1_LIFE_TIME3 * item3)
endif
if(item4 > 0) then
set sd.lt = sd.lt + (UPGRADE1_LIFE_TIME4 * item4)
set sd.d = sd.d + (UPGRADE1_DAMAGE4 * item4)
endif
if(item5 > 0) then
set sd.lt = sd.lt + (UPGRADE1_LIFE_TIME5 * item5)
set sd.d = sd.d + (UPGRADE1_DAMAGE5 * item5)
endif
if(item6 > 0) then
set sd.t = sd.t + (UPGRADE2_DURATION1 * item6)
endif
if(item7 > 0) then
set sd.t = sd.t + (UPGRADE2_DURATION2 * item7)
endif
if(item8 > 0) then
set sd.t = sd.t + (UPGRADE2_DURATION3 * item8)
endif
set sd.d = sd.d + (sd.d * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
if(not exist) then
set sd.e = AddSpecialEffectTarget(SPECIAL_EFFECT, sd.u, "origin")
call SetUnitMoveSpeed(caster, GetUnitDefaultMoveSpeed(caster) + Move_Speed(level))
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
endif
set caster = null
set owner = null
set s = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(DeathPathTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(DeathPathTrg, Condition(function Conditions))
call TriggerAddAction(DeathPathTrg, function Actions)
//Setting globals
set all = CreateGroup()
set copy = CreateGroup()
set Tim = CreateTimer()
set Total = 0
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPECIAL_EFFECT)
call Preload(TARGET_EFFECT)
endfunction
endscope
//TESH.scrollpos=149
//TESH.alwaysfold=0
scope EvilPact initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A066' //Spell Evil Pact rawcode
private constant integer DUMMY_ID = 'n010' //Dummy Evil Pact Mid rawcode
private constant integer ANIME = 3 //Animation spell
private constant attacktype A_TYPE = ATTACK_TYPE_CHAOS //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_DEATH //Spell attack type
private constant real ANIME_TIME = 0.7 //Animation time
private constant real ANIME_WAIT = 0.7 //Animation wait
private constant integer ITEM1_UPGRADE1 = 'modt' //Item Scourge Visor
private constant integer ITEM1_UPGRADE2 = 'I01E' //Item Devourer Maw
private constant integer ITEM1_UPGRADE3 = 'anfg' //Item Brutalic
private constant integer ITEM2_UPGRADE1 = 'I01O' //Item Bloodeye Lynch
private constant integer ITEM2_UPGRADE2 = 'I01S' //Item Havocrave Dissever
private constant real UPGRADE1_RADIUS1 = 100.0 //Upgrade 1 effect 1
private constant real UPGRADE1_RADIUS2 = 200.0 //Upgrade 1 effect 2
private constant real UPGRADE1_RADIUS3 = 300.0 //Upgrade 1 effect 3
private constant real UPGRADE1_SCALE1 = 5.0 //Upgrade 1 effect 1
private constant real UPGRADE1_SCALE2 = 4.0 //Upgrade 1 effect 2
private constant real UPGRADE1_SCALE3 = 3.0 //Upgrade 1 effect 3
private constant real UPGRADE2_PERCENT1 = 0.5 //Upgrade 2 effect 1
private constant real UPGRADE2_PERCENT2 = 1.0 //Upgrade 2 effect 2
private constant string SPELL_EFFECT = "Abilities\\Spells\\Undead\\AnimateDead\\AnimateDeadTarget.mdl" //Effect target
endglobals
//Life multiply
private function Life_Multiply takes integer level returns real
if(level == 1) then
return 1.0
elseif(level == 2) then
return 2.0
else
return 0.0
endif
endfunction
//Radius of target
private function Radius takes integer level returns real
return 600.0 + (0.0 * level)
endfunction
//Upgrade effect
private function Upgrade_Effect takes integer index returns string
if(index == 1 or index == 5 or index == 9) then
return "Doodads\\BlackCitadel\\Props\\RuneArt\\RuneArt3.mdl"
elseif(index == 2 or index == 6 or index == 10) then
return "Doodads\\BlackCitadel\\Props\\RuneArt\\RuneArt4.mdl"
elseif(index == 3 or index == 7 or index == 11) then
return "Doodads\\BlackCitadel\\Props\\RuneArt\\RuneArt5.mdl"
elseif(index == 4 or index == 8 or index == 12) then
return "Doodads\\BlackCitadel\\Props\\RuneArt\\RuneArt6.mdl"
else
return ""
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct EvilPact_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of spell
unit t //Unit target
unit dum //Dummy unit
real tX //Target x
real tY //Target y
real at //Animation time
real aw //Animation wait
boolean c //Check cast
boolean done //Done cast
real r //Radius
real life //Life remain
real de //Dead Rising units effect
effect array e[12] //Upgrade effect
endstruct
//----------------------------------------------------------------
globals
private integer Total
private timer Tim
private EvilPact_Data array Ar[10]
private group all
private group copy
private group temp
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local EvilPact_Data sd
local integer i = 0
local integer j = 0
local unit f = null
local integer count = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.c) then
if(sd.aw > 0) then
set sd.aw = sd.aw - Interval()
elseif(sd.aw == 0) then
set sd.aw = sd.aw - Interval()
call SetUnitTimeScale(sd.u, -1.5)
elseif(sd.at > 0) then
set sd.at = sd.at - Interval()
elseif(sd.at <= 0 and not sd.done) then
set sd.at = sd.at - Interval()
set sd.done = true
call SetUnitTimeScale(sd.u, 1.0)
call SetUnitAnimation(sd.u, "stand")
set sd.life = GetUnitState(sd.u, UNIT_STATE_MAX_LIFE) - GetUnitState(sd.u, UNIT_STATE_LIFE)
//set sd.life = sd.life + (sd.life * LoadInteger(MagicDamage_Ht, GetUnitUserData(sd.u), 0) * 0.01)
set sd.life = sd.life * Life_Multiply(sd.l)
if(sd.de > 0) then
set copy = CopyGroup(RisingDeadUnit)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(GetOwningPlayer(f) == sd.o) then
set sd.life = sd.life + (GetUnitState(f, UNIT_STATE_LIFE) * sd.de)
endif
endloop
endif
if(not IsUnitType(sd.t, UNIT_TYPE_MAGIC_IMMUNE)) then
call GroupAddUnit(temp, sd.t)
endif
set count = 1
call GroupEnumUnitsInRange(all, sd.tX, sd.tY, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o) and f != sd.t) then
if(IsUnitType(f, UNIT_TYPE_HERO)) then
call GroupAddUnit(temp, f)
set count = count + 1
else
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, f, "origin"))
call UnitDamageTarget(sd.u, f, sd.life, true, false, A_TYPE, D_TYPE, null)
endif
endif
endloop
loop
set f = FirstOfGroup(temp)
exitwhen(f == null)
call GroupRemoveUnit(temp, f)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, f, "origin"))
call UnitDamageTarget(sd.u, f, sd.life / count, false, false, A_TYPE, D_TYPE, null)
call SetUnitState(sd.u, UNIT_STATE_LIFE, GetUnitState(sd.u, UNIT_STATE_LIFE) + sd.life / count)
endloop
call IssueImmediateOrder(sd.u, "stop")
call RemoveUnit(sd.dum)
set sd.dum = null
else
set sd.c = false
endif
if(IsUnitDead(sd.u)) then
set sd.c = false
endif
else
call PauseUnit(sd.t, false)
call SetUnitInvulnerable(sd.u, false)
if(sd.dum != null) then
call RemoveUnit(sd.dum)
endif
call SetUnitTimeScale(sd.u, 1.0)
call SetUnitAnimation(sd.u, "stand")
set j = 0
loop
exitwhen(j >= 12)
if(sd.e[j] != null) then
call DestroyEffect(sd.e[j])
set sd.e[j] = null
endif
set j = j + 1
endloop
set sd.u = null
set sd.o = null
set sd.t = null
set sd.dum = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local EvilPact_Data sd = EvilPact_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local real face = GetUnitFacing(caster)
local unit target = GetSpellTargetUnit()
local real targetX = GetUnitX(target)
local real targetY = GetUnitY(target)
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer i = 0
local real rad = 0.0
local real x = 0.0
local real y = 0.0
local real scale = 6.0
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local real decreaseRadius = 0.0
local real percent = 0.0
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_DL_EvilPact
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
call SetUnitAnimationByIndex(caster, ANIME)
set sd.u = caster
set sd.o = GetOwningPlayer(caster)
set sd.l = level
set sd.t = target
set sd.dum = CreateUnit(owner, DUMMY_ID, targetX, targetY, face - 25.0)
call UnitAddAbility(sd.dum, 'Arav')
call UnitRemoveAbility(sd.dum, 'Arav')
call SetUnitPathing(sd.dum, false)
call SetUnitX(sd.dum, targetX)
call SetUnitY(sd.dum, targetY)
set sd.tX = targetX
set sd.tY = targetY
set sd.at = ANIME_TIME
set sd.aw = ANIME_WAIT
set sd.c = true
set sd.done = false
set sd.r = Radius(level)
set sd.de = 0.0
if(item1 > 0) then
set scale = UPGRADE1_SCALE1
set decreaseRadius = UPGRADE1_RADIUS1
endif
if(item2 > 0) then
set scale = UPGRADE1_SCALE2
set decreaseRadius = UPGRADE1_RADIUS2
endif
if(item3 > 0) then
set scale = UPGRADE1_SCALE3
set decreaseRadius = UPGRADE1_RADIUS3
endif
set sd.r = sd.r - decreaseRadius
if(item4 > 0) then
set percent = percent + (UPGRADE2_PERCENT1 * item4)
endif
if(item5 > 0) then
set percent = percent + (UPGRADE2_PERCENT2 * item5)
endif
set sd.de = percent
if(item3 > 0 or item5 > 0) then
set i = 0
loop
exitwhen(i >= 12)
set rad = ((360.0 / 12) * i) * bj_DEGTORAD
set x = targetX + (sd.r + 10.0) * Cos(rad)
set y = targetY + (sd.r + 10.0) * Sin(rad)
set sd.e[i] = AddSpecialEffect(Upgrade_Effect(i+1), x, y)
set i = i + 1
endloop
endif
call SetUnitScale(sd.dum, scale, scale, scale)
call PauseUnit(target, true)
call SetUnitInvulnerable(caster, true)
call SetUnitTimeScale(caster, 1.5)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
set target = null
set s = null
endfunction
//----------------------------------------------------------------
private function Stop_Actions takes nothing returns nothing
local EvilPact_Data sd
local unit caster = GetTriggerUnit()
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(caster == sd.u) then
if(not sd.done) then
set sd.c = false
endif
endif
set i = i + 1
endloop
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(EvilPactTrg, EVENT_PLAYER_UNIT_SPELL_CAST)
call TriggerAddCondition(EvilPactTrg, Condition(function Conditions))
call TriggerAddAction(EvilPactTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(EvilPactStopTrg, EVENT_PLAYER_UNIT_SPELL_ENDCAST)
call TriggerAddCondition(EvilPactStopTrg, Condition(function Conditions))
call TriggerAddAction(EvilPactStopTrg, function Stop_Actions)
//Setting globals
set Tim = CreateTimer()
set all = CreateGroup()
set copy = CreateGroup()
set temp = CreateGroup()
set bexpr = Condition(function Pick)
set Total = 0
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=462
//TESH.alwaysfold=0
globals
group FrostShattersAttacker = CreateGroup()
endglobals
scope FrostShatters initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A06A' //Spell Frost Shatters rawcode
private constant integer CAST1_ID = 'AUfn' //Cast Frost Shatters (Slow) rawcode
private constant integer CAST2_ID = 'A069' //Cast Frost Shatters (Freeze) rawcode
private constant integer BUFF_ID = 'B01U' //Buff Frost Shatter (Dummy) rawcode
private constant integer ABILITY_ID = 'A0BH' //Ability Frost Shatter (Dummy Ability) rawcode
private constant real MAX_INTERVAL = 0.5 //Max interval
private constant integer ITEM1_UPGRADE1 = 'rag1' //Item Walking Slippers
private constant integer ITEM1_UPGRADE2 = 'I017' //Item Platinum Sprinter
private constant integer ITEM1_UPGRADE3 = 'I00H' //Item Warmarcher
private constant integer ITEM1_UPGRADE4 = 'I018' //Item Porthole Jumper
private constant integer ITEM2_UPGRADE1 = 'I001' //Item Coral Spire
private constant integer ITEM2_UPGRADE2 = 'I00V' //Item Retiarius of Torrent
private constant integer ITEM2_UPGRADE3 = 'I00W' //Item Atlantic Darktrident
private constant real UPGRADE1_DISTANCE1 = 50.0 //Upgrade 1 effect 1
private constant real UPGRADE1_DISTANCE2 = 100.0 //Upgrade 1 effect 2
private constant real UPGRADE1_DISTANCE3 = 150.0 //Upgrade 1 effect 3
private constant real UPGRADE1_DISTANCE4 = 200.0 //Upgrade 1 effect 4
private constant real UPGRADE1_DAMAGE4 = 5.0 //Upgrade 1 effect 4
private constant real UPGRADE2_MANA_DRAIN1 = 5.0 //Upgrade 2 effect 1
private constant real UPGRADE2_MANA_DRAIN2 = 10.0 //Upgrade 2 effect 2
private constant real UPGRADE2_MANA_DRAIN3 = 15.0 //Upgrade 2 effect 3
private constant real UPGRADE2_PERCENT1 = 0.10 //Upgrade 2 effect 1
private constant real UPGRADE2_PERCENT2 = 0.20 //Upgrade 2 effect 2
private constant real UPGRADE2_PERCENT3 = 0.30 //Upgrade 2 effect 3
private constant real UPGRADE2_MANA1 = 5.0 //Upgrade 2 effect
private constant real UPGRADE2_MANA2 = 10.0 //Upgrade 2 effect
private constant real UPGRADE2_MANA3 = 15.0 //Upgrade 2 effect
private constant attacktype A_TYPE = ATTACK_TYPE_MAGIC //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_COLD //Spell damage type
private constant string SPELL_EFFECT = "Abilities\\Spells\\Undead\\FrostNova\\FrostNovaTarget.mdl" //Explode effect
private constant string SPECIAL_EFFECT1 = "Abilities\\Weapons\\ZigguratFrostMissile\\ZigguratFrostMissile.mdl" //Special effect no freeze
private constant string SPECIAL_EFFECT2 = "Abilities\\Weapons\\FrostWyrmMissile\\FrostWyrmMissile.mdl" //Special effect freeze
endglobals
//Mana drained
private function Mana_Drained takes integer level returns real
return 10.0 + (0.0 * level)
endfunction
//Damage per mana drained
private function Damage takes integer level returns real
if(level == 1) then
return 10.0
elseif(level == 2) then
return 20.0
elseif(level == 3) then
return 40.0
elseif(level == 4) then
return 60.0
else
return 0.0
endif
endfunction
//Freeze damage
private function Freeze_Damage takes integer level returns real
return 600.0 + (0.0 * level)
endfunction
//Radius
private function Radius takes integer level returns real
return 300.0 + (0.0 * level)
endfunction
//Distance
private function Distance takes integer level returns real
if(level == 1) then
return 10.0
elseif(level == 2) then
return 20.0
elseif(level == 3) then
return 30.0
elseif(level == 4) then
return 40.0
else
return 0.0
endif
endfunction
//Max distance
private function Max_Distance takes integer level returns real
return 300.0
endfunction
//Distance move
private function Distance_Move takes integer level returns real
return 80.0
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct FrostShatters_Data
unit u //Unit caster
integer uID //Caster id
player o //Player owner
integer l //Level of spell
group g //Group target
real m //Mana will be drained
real d //Damage will be stored
real dd //Damage stored
real fd //Freeze damage
boolean f //Freeze
real i //Interval
real im //Interval max
boolean e //End
real t //Distance
real tc //Distance per charge
real tm //Distance move duration
real mt //Max distance
real r //Radius
effect e1 //Effect hand1
effect e2 //Effect hand2
real ap //Attack percent
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private FrostShatters_Data array Ar[10]
private group all
private boolexpr bexpr
private hashtable ht
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Attack_Actions takes nothing returns nothing
local unit attacker = GetAttacker()
local unit attacked = GetTriggerUnit()
call UnitAddAbility(attacked, ABILITY_ID)
call BuffAttack(attacker, attacked, ABILITY_ID, 3.0)
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Attack_Conditions takes nothing returns boolean
local unit attacker = GetAttacker()
local boolean okey = GetUnitAbilityLevel(attacker, SPELL_ID) > 0 and /*
*/IsUnitInGroup(attacker, FrostShattersAttacker)
set attacker = null
return okey
endfunction
//----------------------------------------------------------------
function FrostShatters_onDamage takes unit attacker, unit attacked, real amount returns nothing
local integer level = GetUnitAbilityLevel(attacker, SPELL_ID)
local integer attackerID = GetUnitUserData(attacker)
local player owner = GetOwningPlayer(attacker)
local FrostShatters_Data sd
local integer i = 0
local real damage = 0.0
local string text = ""
call UnitRemoveAbility(attacked, ABILITY_ID)
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == attacker) then
set damage = sd.ap * sd.dd
set damage = damage + (damage * LoadInteger(MagicDamage_Ht, sd.uID, 0) * 0.01)
set text = I2S(R2I(damage))
if(IsUnitType(attacked, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, attacked, damage, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, attacked, damage, true, false, A_TYPE, D_TYPE, null)
endif
call TextTag_AttachUnit(text, 10.0 * 0.023 / 10.0, attacked, 30.0, /*
*/R2I(0.0 * 255.0 * 0.01), R2I(80.0 * 255.0 * 0.01), R2I(100.0 * 255.0 * 0.01), R2I(100.0 * 255.0 * 0.01), /*
*/50.0 * 0.071 / 128.0 * Cos(90.0 * bj_DEGTORAD), 50.0 * 0.071 / 128.0 * Sin(90.0 * bj_DEGTORAD), /*
*/false, 5.00, 1.75)
set i = Total
endif
set i = i + 1
endloop
set attacker = null
set attacked = null
set owner = null
set text = null
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local FrostShatters_Data sd
local integer i = 0
local real mana = 0.0
local real face = 0.0
local real rad = 0.0
local real x = 0.0
local real y = 0.0
local unit f = null
local real tX = 0.0
local real tY = 0.0
local real randomDistance = 0.0
local real randomAngle = 0.0
local string text = ""
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(GetUnitAbilityLevel(sd.u, BUFF_ID) > 0) then
set mana = GetUnitState(sd.u, UNIT_STATE_MANA)
if(mana - sd.m > 0) then
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
if(sd.dd < sd.fd - sd.d) then
set sd.dd = sd.dd + sd.d
else
set sd.dd = sd.fd
endif
if(sd.t < sd.mt - sd.tc) then
set sd.t = sd.t + sd.tc
else
set sd.t = sd.mt
endif
call SetUnitState(sd.u, UNIT_STATE_MANA, mana - sd.m)
if(sd.dd >= sd.fd and (not sd.f)) then
set sd.f = true
call DestroyEffect(sd.e1)
call DestroyEffect(sd.e2)
set sd.e1 = AddSpecialEffectTarget(SPECIAL_EFFECT2, sd.u, "hand, left")
set sd.e2 = AddSpecialEffectTarget(SPECIAL_EFFECT2, sd.u, "hand, right")
endif
endif
else
call SetUnitState(sd.u, UNIT_STATE_MANA, 0.0)
call IssueImmediateOrder(sd.u, "unimmolation")
endif
if(not IsUnitInGroup(sd.u, Wicking)) then
call GroupAddUnit(Wicking, sd.u)
endif
elseif(not sd.e) then
call DestroyEffect(sd.e1)
call DestroyEffect(sd.e2)
set sd.e1 = null
set sd.e2 = null
call SetUnitAnimation(sd.u, "spell")
call QueueUnitAnimation(sd.u, "stand")
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.u, "origin"))
set sd.e = true
if(sd.dd > 0) then
set sd.dd = sd.dd + (sd.dd * LoadInteger(MagicDamage_Ht, sd.uID, 0) * 0.01)
set text = I2S(R2I(sd.dd))
call TextTag_AttachUnit(text, 10.0 * 0.023 / 10.0, sd.u, 30.0, /*
*/R2I(0.0 * 255.0 * 0.01), R2I(80.0 * 255.0 * 0.01), R2I(100.0 * 255.0 * 0.01), R2I(100.0 * 255.0 * 0.01), /*
*/50.0 * 0.071 / 128.0 * Cos(90.0 * bj_DEGTORAD), 50.0 * 0.071 / 128.0 * Sin(90.0 * bj_DEGTORAD), /*
*/false, 5.00, 1.75)
endif
elseif(sd.t > 0.0) then
set sd.t = sd.t - sd.tm
if(not IsUnitDead(sd.u)) then
set face = GetUnitFacing(sd.u)
set rad = face * bj_DEGTORAD
set x = GetUnitX(sd.u) + sd.tm * Cos(rad)
set y = GetUnitY(sd.u) + sd.tm * Sin(rad)
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0)) and (not IsBarrel(sd.u, x, y, 100.0))) then
call SetUnitX(sd.u, x)
call SetUnitY(sd.u, y)
endif
set randomDistance = GetRandomReal(100.0, sd.r)
set randomAngle = GetRandomReal(0.0, 360.0)
set tX = x + randomDistance * Cos(randomAngle * bj_DEGTORAD)
set tY = y + randomDistance * Sin(randomAngle * bj_DEGTORAD)
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, tX, tY))
if(sd.dd > 0) then
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o) and (not IsUnitInGroup(f, sd.g))) then
call GroupAddUnit(sd.g, f)
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
call TargetCast(sd.o, x, y, 0.5, CAST1_ID, sd.l, "frostnova", 0, f)
if(sd.f) then
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT2, f, "origin"))
call TargetCast(sd.o, x, y, 0.5, CAST2_ID, sd.l, "thunderbolt", 0, f)
else
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT1, f, "origin"))
endif
endif
endloop
endif
endif
else
call Pather(sd.u, 1.5)
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
if(IsUnitInGroup(sd.u, Wicking)) then
call GroupRemoveUnit(Wicking, sd.u)
endif
call GroupRemoveUnit(FrostShattersAttacker, sd.u)
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
set text = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local FrostShatters_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local boolean isNull = (Ar[Total] == null)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM1_UPGRADE4)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item6 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item7 = IsUnitHasItemType(caster, ITEM2_UPGRADE3)
local real extraDistance = 0.0
local real manaDrain = 0.0
if(isNull) then
set sd = FrostShatters_Data.create()
set sd.g = CreateGroup()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.uID = casterID
set sd.o = owner
set sd.l = level
set sd.m = Mana_Drained(level)
set sd.d = Damage(level)
set sd.dd = 0.0
set sd.fd = Freeze_Damage(level)
set sd.f = false
set sd.i = 0.0
set sd.im = MAX_INTERVAL
set sd.e = false
set sd.t = 0.0
set sd.tc = Distance(level)
set sd.tm = Distance_Move(level)
set sd.mt = Max_Distance(level)
set sd.r = Radius(level)
set sd.e1 = AddSpecialEffectTarget(SPECIAL_EFFECT1, caster, "hand, left")
set sd.e2 = AddSpecialEffectTarget(SPECIAL_EFFECT1, caster, "hand, right")
set sd.ap = 0.0
if(item1 > 0) then
set extraDistance = UPGRADE1_DISTANCE1
endif
if(item2 > 0) then
set extraDistance = UPGRADE1_DISTANCE2
endif
if(item3 > 0) then
set extraDistance = UPGRADE1_DISTANCE3
endif
if(item4 > 0) then
set extraDistance = UPGRADE1_DISTANCE4
set sd.d = sd.d + (UPGRADE1_DAMAGE4 * item4)
endif
if(item5 > 0) then
set manaDrain = UPGRADE2_MANA1
set sd.ap = sd.ap + (UPGRADE2_PERCENT1 * item5)
endif
if(item6 > 0) then
set manaDrain = UPGRADE2_MANA2
set sd.ap = sd.ap + (UPGRADE2_PERCENT2 * item6)
endif
if(item7 > 0) then
set manaDrain = UPGRADE2_MANA3
set sd.ap = sd.ap + (UPGRADE2_PERCENT3 * item7)
endif
set sd.m = sd.m + manaDrain
if(sd.ap > 0.0) then
call GroupAddUnit(FrostShattersAttacker, caster)
endif
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(FrostShattersTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(FrostShattersTrg, Condition(function Conditions))
call TriggerAddAction(FrostShattersTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(FrostShattersAttackTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(FrostShattersAttackTrg, Condition(function Attack_Conditions))
call TriggerAddAction(FrostShattersAttackTrg, function Attack_Actions)
//setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
set ht = InitHashtable()
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST1_ID)
call AbilityPreload(CAST2_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT1)
call Preload(SPECIAL_EFFECT2)
endfunction
endscope
//TESH.scrollpos=309
//TESH.alwaysfold=0
scope EssenceDrain initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A06B' //Spell Essence Drain rawcode
private constant integer DUMMY_ID = 'n00Z' //Dummy missle rawcode
private constant integer ITEM1_UPGRADE1 = 'I00L' //Item Twinkle Rod
private constant integer ITEM1_UPGRADE2 = 'I01N' //Item Staff of Flamecurse
private constant integer ITEM1_UPGRADE3 = 'ssil' //Item Sunstalker
private constant integer ITEM2_UPGRADE1 = 'bgst' //Item Valor Front
private constant integer ITEM2_UPGRADE2 = 'I00F' //Item Tribal Headdress
private constant integer ITEM2_UPGRADE3 = 'I01Y' //Item Crown of Malediction
private constant real UPGRADE1_MOVE1 = 10.0 //Upgrade 1 effect 1
private constant real UPGRADE1_MOVE2 = 20.0 //Upgrade 1 effect 2
private constant real UPGRADE1_MOVE3 = 30.0 //Upgrade 1 effect 3
private constant real UPGRADE1_AMOUNT2 = 3.0 //Upgrade 1 effect 1
private constant real UPGRADE1_AMOUNT3 = 6.0 //Upgrade 1 effect 2
private constant real UPGRADE2_DISTANCE_FOLLOW1 = 100.0 //Upgrade 1 effect 1
private constant real UPGRADE2_DISTANCE_FOLLOW2 = 200.0 //Upgrade 1 effect 2
private constant real UPGRADE2_DISTANCE_FOLLOW3 = 300.0 //Upgrade 1 effect 3
private constant real UPGRADE2_SPAWN_INTERVAL3 = 0.1 //Upgrade 1 effect 3
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_DEATH //Spell attack type
private constant string SPELL_EFFECT1 = "Abilities\\Spells\\Undead\\FrostArmor\\FrostArmorTarget.mdl" //Effect absorb
private constant string SPELL_EFFECT2 = "Abilities\\Spells\\Undead\\FrostArmor\\FrostArmorTarget.mdl" //Effect spill
endglobals
//Spawn interval
private function Spawn_Interval takes integer level returns real
if(level == 1) then
return 0.6
elseif(level == 2) then
return 0.5
elseif(level == 3) then
return 0.3
else
return 0.0
endif
endfunction
//Dummy move
private function Sfx_Move takes integer level returns real
return 40.0 + (0.0 * level)
endfunction
//Amount heal or absorb
private function Amount takes integer level returns real
if(level == 1) then
return 12.0
elseif(level == 2) then
return 24.0
elseif(level == 3) then
return 48.0
else
return 0.0
endif
endfunction
//Max distance
private function Max_Distance takes integer level returns real
return 1500.0 + (0.0 * level)
endfunction
//Distance follow
private function Distance_Follow takes integer level returns real
return 400.0 + (0.0 * level)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct EssenceDrain_Data
unit u //Unit caster
integer uID //Caster user data
unit t //Unit target
player o //Owner of caster
real tX //Target x
real tY //Target y
boolean ally //Target ally or enemy
real md //Max distance
real df //Distance follow
real am //Amount
effect sfxC //Effect to caster
effect sfxT //Effect to target
real i //Interval spawn
real iM //Max interval spawn
real sfxM //Dummy move
boolean c //Check cast
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private EssenceDrain_Data array Ar[10]
private group sfx
private group copy
private hashtable ht
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local EssenceDrain_Data sd
local integer i = 0
local real casterX = 0.0
local real casterY = 0.0
local real targetX = 0.0
local real targetY = 0.0
local unit dummy = null
local real fX = 0.0
local real fY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local real face = 0.0
local real amount = 0.0
local unit f = null
local integer fID = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.c and /*
*/(not IsUnitDead(sd.u)) and /*
*/(not IsUnitDead(sd.t)) and /*
*/IsUnitType(sd.t, UNIT_TYPE_MAGIC_IMMUNE) == false and /*
*/sd.t != null) then
set casterX = GetUnitX(sd.u)
set casterY = GetUnitY(sd.u)
set targetX = GetUnitX(sd.t)
set targetY = GetUnitY(sd.t)
call QueueUnitAnimation(sd.u, "channel")
set face = Atan2(targetY - casterY, targetX - casterX)
call SetUnitFacing(sd.u, face * bj_RADTODEG)
set dx = casterX - targetX
set dy = casterY - targetY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance >= sd.md) then
set sd.c = false
elseif(distance >= sd.df) then
set dx = sd.tX - targetX
set dy = sd.tY - targetY
set distance = SquareRoot(dx * dx + dy * dy)
call SetUnitX(sd.u, casterX + distance * Cos(face))
call SetUnitY(sd.u, casterY + distance * Sin(face))
set casterX = GetUnitX(sd.u)
set casterY = GetUnitY(sd.u)
endif
set sd.tX = targetX
set sd.tY = targetY
set copy = CopyGroup(sfx)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set fID = GetUnitUserData(f)
if(LoadInteger(ht, fID, 0) == sd.uID) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
if(sd.ally) then
set face = Atan2(targetY - fY, targetX - fX)
set dx = targetX - fX
set dy = targetY - fY
else
set face = Atan2(casterY - fY, casterX - fX)
set dx = casterX - fX
set dy = casterY - fY
endif
set distance = SquareRoot(dx * dx + dy * dy)
if(distance > sd.sfxM) then
call SetUnitX(f, fX + sd.sfxM * Cos(face))
call SetUnitY(f, fY + sd.sfxM * Sin(face))
else
call KillUnit(f)
call FlushChildHashtable(ht, fID)
call GroupRemoveUnit(sfx, f)
if(sd.ally) then
if(IsUnitType(sd.t, UNIT_TYPE_ETHEREAL)) then
call SetUnitState(sd.t, UNIT_STATE_MANA, GetUnitState(sd.t, UNIT_STATE_MANA) + sd.am * ETHEREAL_BONUS)
call SetUnitState(sd.t, UNIT_STATE_LIFE, GetUnitState(sd.t, UNIT_STATE_LIFE) + sd.am * ETHEREAL_BONUS)
else
call SetUnitState(sd.t, UNIT_STATE_MANA, GetUnitState(sd.t, UNIT_STATE_MANA) + sd.am)
call SetUnitState(sd.t, UNIT_STATE_LIFE, GetUnitState(sd.t, UNIT_STATE_LIFE) + sd.am)
endif
else
if(IsUnitType(sd.u, UNIT_TYPE_ETHEREAL)) then
call SetUnitState(sd.u, UNIT_STATE_MANA, GetUnitState(sd.u, UNIT_STATE_MANA) + sd.am * ETHEREAL_BONUS)
call SetUnitState(sd.u, UNIT_STATE_LIFE, GetUnitState(sd.u, UNIT_STATE_LIFE) + sd.am * ETHEREAL_BONUS)
else
call SetUnitState(sd.u, UNIT_STATE_MANA, GetUnitState(sd.u, UNIT_STATE_MANA) + sd.am)
call SetUnitState(sd.u, UNIT_STATE_LIFE, GetUnitState(sd.u, UNIT_STATE_LIFE) + sd.am)
endif
endif
endif
endif
endloop
if(sd.i > 0) then
set sd.i = sd.i - Interval()
else
if(sd.ally) then
if(IsUnitType(sd.u, UNIT_TYPE_ETHEREAL)) then
call SetUnitState(sd.u, UNIT_STATE_MANA, GetUnitState(sd.u, UNIT_STATE_MANA) - ((sd.am * ETHEREAL_BONUS)/2))
call SetUnitState(sd.u, UNIT_STATE_LIFE, GetUnitState(sd.u, UNIT_STATE_LIFE) - sd.am * ETHEREAL_BONUS)
else
call SetUnitState(sd.u, UNIT_STATE_MANA, GetUnitState(sd.u, UNIT_STATE_MANA) - (sd.am/2))
call SetUnitState(sd.u, UNIT_STATE_LIFE, GetUnitState(sd.u, UNIT_STATE_LIFE) - sd.am)
endif
set dummy = CreateUnit(sd.o, DUMMY_ID, casterX, casterY, bj_UNIT_FACING )
else
if(IsUnitType(sd.t, UNIT_TYPE_ETHEREAL)) then
call SetUnitState(sd.t, UNIT_STATE_MANA, GetUnitState(sd.t, UNIT_STATE_MANA) - ((sd.am * ETHEREAL_BONUS)/2))
//call SetUnitState(sd.t, UNIT_STATE_LIFE, GetUnitState(sd.t, UNIT_STATE_LIFE) - sd.am)
call UnitDamageTarget(sd.u, sd.t, sd.am, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call SetUnitState(sd.t, UNIT_STATE_MANA, GetUnitState(sd.t, UNIT_STATE_MANA) - (sd.am/2))
//call SetUnitState(sd.t, UNIT_STATE_LIFE, GetUnitState(sd.t, UNIT_STATE_LIFE) - sd.am)
call UnitDamageTarget(sd.u, sd.t, sd.am, true, false, A_TYPE, D_TYPE, null)
endif
set dummy = CreateUnit(sd.o, DUMMY_ID, targetX, targetY, bj_UNIT_FACING)
endif
call UnitAddAbility(dummy, 'Arav')
call UnitRemoveAbility(dummy, 'Arav')
call SetUnitPathing(dummy, false)
call SetUnitFlyHeight(dummy, 100.0, 0.0)
if(sd.ally) then
call SetUnitX(dummy, casterX)
call SetUnitY(dummy, casterY)
else
call SetUnitX(dummy, targetX)
call SetUnitY(dummy, targetY)
endif
call GroupAddUnit(sfx, dummy)
call SaveInteger(ht, GetUnitUserData(dummy), 0, sd.uID)
set dummy = null
set sd.i = sd.iM
endif
if(not IsUnitInGroup(sd.u, Wicking)) then
call GroupAddUnit(Wicking, sd.u)
endif
else
set copy = CopyGroup(sfx)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set fID = GetUnitUserData(f)
if(LoadInteger(ht, fID, 0) == sd.uID) then
call KillUnit(f)
call FlushChildHashtable(ht, fID)
call GroupRemoveUnit(sfx, f)
endif
endloop
call DestroyEffect(sd.sfxC)
call DestroyEffect(sd.sfxT)
set sd.sfxC = null
set sd.sfxT = null
call IssueImmediateOrder(sd.u, "stop")
call SetUnitAnimation(sd.u, "stand")
if(IsUnitInGroup(sd.u, Wicking)) then
call GroupRemoveUnit(Wicking, sd.u)
endif
set sd.u = null
set sd.t = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set dummy = null
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local EssenceDrain_Data sd = EssenceDrain_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local unit target = GetSpellTargetUnit()
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item6 = IsUnitHasItemType(caster, ITEM2_UPGRADE3)
local real extraMove = 0.0
set sd.u = caster
set sd.uID = GetUnitUserData(caster)
set sd.t = target
set sd.o = GetOwningPlayer(caster)
set sd.tX = GetUnitX(target)
set sd.tY = GetUnitY(target)
set sd.md = Max_Distance(level)
set sd.df = Distance_Follow(level)
set sd.am = Amount(level)
set sd.c = true
if(IsUnitAlly(target, sd.o)) then
set sd.ally = true
set sd.sfxC = AddSpecialEffectTarget(SPELL_EFFECT2, caster, "chest")
set sd.sfxT = AddSpecialEffectTarget(SPELL_EFFECT1, target, "chest")
else
set sd.ally = false
set sd.sfxC = AddSpecialEffectTarget(SPELL_EFFECT1, caster, "chest")
set sd.sfxT = AddSpecialEffectTarget(SPELL_EFFECT2, target, "chest")
endif
set sd.i = Spawn_Interval(level)
set sd.iM = sd.i
set sd.sfxM = Sfx_Move(level)
if(item1 > 0) then
set extraMove = UPGRADE1_MOVE1
endif
if(item2 > 0) then
set extraMove = UPGRADE1_MOVE2
set sd.am = sd.am + (UPGRADE1_AMOUNT2 * item2)
endif
if(item3 > 0) then
set extraMove = UPGRADE1_MOVE3
set sd.am = sd.am + (UPGRADE1_AMOUNT3 * item3)
endif
set sd.sfxM = sd.sfxM + extraMove
set sd.am = sd.am + (sd.am * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
if(item4 > 0) then
set sd.df = sd.df + (UPGRADE2_DISTANCE_FOLLOW1 * item4)
endif
if(item5 > 0) then
set sd.df = sd.df + (UPGRADE2_DISTANCE_FOLLOW2 * item5)
endif
if(item6 > 0) then
set sd.df = sd.df + (UPGRADE2_DISTANCE_FOLLOW3 * item6)
set sd.iM = sd.iM - UPGRADE2_SPAWN_INTERVAL3
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set target = null
endfunction
//----------------------------------------------------------------
private function Stop_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local EssenceDrain_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(caster == sd.u) then
set sd.c = false
endif
set i = i + 1
endloop
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(EssenceDrainTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(EssenceDrainTrg, Condition(function Conditions))
call TriggerAddAction(EssenceDrainTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(EssenceDrainStopTrg, EVENT_PLAYER_UNIT_SPELL_ENDCAST)
call TriggerAddCondition(EssenceDrainStopTrg, Condition(function Conditions))
call TriggerAddAction(EssenceDrainStopTrg, function Stop_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set sfx = CreateGroup()
set copy = CreateGroup()
set ht = InitHashtable()
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT1)
call Preload(SPELL_EFFECT2)
endfunction
endscope
//TESH.scrollpos=96
//TESH.alwaysfold=0
globals
group Wicking = CreateGroup()
endglobals
scope WickedPresence initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'AHad' //Spell Wicked Presence rawcode
private constant integer ABILITY_ID = 'A0A7' //Ability Wicked Presence (Dummy) rawcode
private constant integer CAST_ID = 'AUfa' //Cast Wicked Presence (Dummy) rawcode
private constant integer CAST1_ID = 'AUfn' //Cast Frost Shatters (Slow) rawcode
private constant integer BUFF_ID = 'BUfa' //Buff Wicked Presence (Dummy) rawcode
private constant integer ITEM1_UPGRADE1 = 'I004' //Item Leather Armor
private constant integer ITEM1_UPGRADE2 = 'I005' //Item Elven Leafcoat
private constant integer ITEM1_UPGRADE3 = 'I024' //Item Deathshard
private constant integer ITEM2_UPGRADE1 = 'I020' //Item Elven Leafcoat
private constant integer ITEM2_UPGRADE2 = 'I022' //Item Meridian Stark
private constant integer ITEM2_UPGRADE3 = 'I021' //Item Dragon Frostscale
private constant real UPGRADE1_DAMAGE1 = 0.03 //Upgrade 1 effect 1
private constant real UPGRADE1_DAMAGE2 = 0.06 //Upgrade 1 effect 2
private constant real UPGRADE1_DAMAGE3 = 0.09 //Upgrade 1 effect 3
private constant real UPGRADE2_RADIUS1 = 200.0 //Upgrade 1 effect 1
private constant real UPGRADE2_RADIUS2 = 400.0 //Upgrade 1 effect 2
private constant real UPGRADE2_RADIUS3 = 600.0 //Upgrade 1 effect 3
private constant attacktype A_TYPE = ATTACK_TYPE_MAGIC //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_COLD //Spell damage type
endglobals
//Radius
private function Radius takes integer level returns real
return 300.0 + (300.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetOwningPlayer(target) != Player(PLAYER_NEUTRAL_PASSIVE)) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false)
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private trigger WickedPresenceTrg
private group Group
private group copy
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit f = null
local real fX = 0.0
local real fY = 0.0
local integer level = 0
local player owner = null
local integer total = 0
local unit g = null
local integer item4 = 0
local integer item5 = 0
local integer item6 = 0
local real radius = 0.0
local integer extraLevel = 0
set copy = CopyGroup(Group)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not IsUnitDead(f)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set level = GetUnitAbilityLevel(f, SPELL_ID)
if(level > 0) then
if(GetUnitAbilityLevel(f, ABILITY_ID) > 0) then
call SetUnitAbilityLevel(f, ABILITY_ID, level)
else
call UnitAddAbility(f, ABILITY_ID)
call SetUnitAbilityLevel(f, ABILITY_ID, level)
endif
set owner = GetOwningPlayer(f)
set total = 0
if(IsUnitInGroup(f, Wicking)) then
call GroupEnumUnitsInRange(all, fX, fY, Radius(level), bexpr)
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
if(IsUnitType(g, UNIT_TYPE_HERO) and IsUnitAlly(g, owner)) then
set total = total + 1
endif
endloop
endif
if(total > 0) then
set radius = Radius(level)
set item4 = IsUnitHasItemType(f, ITEM2_UPGRADE1)
set item5 = IsUnitHasItemType(f, ITEM2_UPGRADE2)
set item6 = IsUnitHasItemType(f, ITEM2_UPGRADE3)
if(item4 > 0) then
set radius = radius + (UPGRADE2_RADIUS1 * item4)
endif
if(item5 > 0) then
set radius = radius + (UPGRADE2_RADIUS2 * item5)
endif
if(item6 > 0) then
set radius = radius + (UPGRADE2_RADIUS3 * item6)
set extraLevel = 3
endif
call GroupEnumUnitsInRange(all, fX, fY, radius, bexpr)
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
//if(GetUnitAbilityLevel(g, BUFF2_ID) <= 0) then
if(IsUnitAlly(g, owner) and (GetOwningPlayer(g) != Player(PLAYER_NEUTRAL_PASSIVE)) and (IsUnitType(g, UNIT_TYPE_HERO) or GetOwningPlayer(g) == owner)) then
call TargetCast(owner, fX, fY, 1.0, CAST_ID, level + extraLevel, "frostarmor", 0, g)
endif
//endif
endloop
endif
else
if(GetUnitAbilityLevel(f, ABILITY_ID) > 0) then
call UnitRemoveAbility(f, ABILITY_ID)
endif
endif
endif
endloop
set f = null
set g = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local unit learner = GetLearningUnit()
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
if(GetUnitAbilityLevel(learner, SPELL_ID) <= 1 and (not IsUnitInGroup(learner, Group))) then
call GroupAddUnit(Group, learner)
if(not IsTriggerEnabled(WickedPresenceTrg)) then
call EnableTrigger(WickedPresenceTrg)
endif
endif
set learner = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
local unit learner = GetTriggerUnit()
local boolean okey = GetLearnedSkill() == SPELL_ID and (not IsUnitIllusion(learner))
set learner = null
return okey
endfunction
//----------------------------------------------------------------
function WickedPresence_onDamage takes unit attacker, unit attacked, real amount returns nothing
local player owner = GetOwningPlayer(attacked)
local real attackerX = GetUnitX(attacker)
local real attackerY = GetUnitY(attacker)
local boolean isCaster = (GetUnitAbilityLevel(attacked, SPELL_ID) > 0)
local integer item1 = IsUnitHasItemType(attacked, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(attacked, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(attacked, ITEM1_UPGRADE3)
local real percent = 0.0
if(item1 > 0) then
set percent = percent + (UPGRADE1_DAMAGE1 * item1)
endif
if(item2 > 0) then
set percent = percent + (UPGRADE1_DAMAGE2 * item2)
endif
if(item3 > 0) then
set percent = percent + (UPGRADE1_DAMAGE3 * item3)
endif
call TargetCast(owner, attackerX, attackerY, 0.5, CAST1_ID, 1, "frostnova", 0, attacker)
if(isCaster and item1 > 0) then
call UnitDamageTarget(attacked, attacker, amount * percent, true, false, A_TYPE, D_TYPE, null)
endif
set attacker = null
set attacked = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set WickedPresenceTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(WickedPresenceLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(WickedPresenceLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(WickedPresenceLearnTrg, function Learn_Actions)
call TriggerRegisterTimerEventPeriodic(WickedPresenceTrg, 1.0)
call DisableTrigger(WickedPresenceTrg)
call TriggerAddAction(WickedPresenceTrg, function Actions)
//Setting globals
set Group = CreateGroup()
set copy = CreateGroup()
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call AbilityPreload(CAST1_ID)
call AbilityPreload(ABILITY_ID)
endfunction
endscope
//TESH.scrollpos=91
//TESH.alwaysfold=0
scope DarkVeil initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A06D' //Spell Dark Veil rawcode
private constant integer CAST_ID = 'Aivs' //Cast Dark Veil (Invisibility) rawcode
private constant integer BUFF_ID = 'Binv' //Buff Dark Veil rawcode
private constant integer ITEM1_UPGRADE1 = 'I00D' //Item Assassin Hood
private constant integer ITEM1_UPGRADE2 = 'I01I' //Item Cloak of Shadow
private constant integer ITEM1_UPGRADE3 = 'I01W' //Item Ghost Veil
private constant integer ITEM2_UPGRADE1 = 'I01O' //Item Bloodeye Lynch
private constant integer ITEM2_UPGRADE2 = 'I01S' //Item Havocrave Dissever
private constant real UPGRADE1_DURATION1 = 4.0 //Upgrade 1 duration 1
private constant real UPGRADE1_DURATION2 = 8.0 //Upgrade 2 duration 2
private constant real UPGRADE1_DURATION3 = 12.0 //Upgrade 2 duration 2
private constant real UPGRADE2_DURATION_MAGIC = 2.0 //Upgrade 2 duration magic
private constant integer UPGRADE2_MAGIC1 = 5 //Upgrade 2 duration 1
private constant integer UPGRADE2_MAGIC2 = 10 //Upgrade 2 duration 1
private constant string SPELL_EFFECT = "war3mapImported\\WarpDarkTarget.mdx" //Target effect
endglobals
//Movement speed
private function Move_Speed takes integer level returns real
if(level == 1) then
return 50.0
elseif(level == 2) then
return 80.0
elseif(level == 3) then
return 120.0
else
return 0.0
endif
endfunction
//Duration
private function Duration takes integer level returns real
if(level == 1) then
return 15.0
elseif(level == 2) then
return 20.0
elseif(level == 3) then
return 25.0
else
return 0.0
endif
endfunction
//Interval
private function Interval takes nothing returns real
return 0.5
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct DarkVeil_Data
unit u //Unit caster
integer uId //Caster id
player o //Owner of caster
integer l //Level of spell
unit t //Unit target
real d //Duration
integer up //Item 1 upgrade
boolean ma //Magic added
integer m //Magic increase
real md //Magic duration
real dm //Magic duration max
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private DarkVeil_Data array Ar[10]
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local DarkVeil_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.d > 0) then
set sd.d = sd.d - Interval()
if(GetUnitAbilityLevel(sd.t, BUFF_ID) <= 0) then
if(sd.m > 0) then
if(not sd.ma) then
call SaveInteger(MagicDamage_Ht, sd.uId, 0, LoadInteger(MagicDamage_Ht, sd.uId, 0) + sd.m)
set sd.ma = true
endif
set sd.md = sd.dm
endif
if(sd.up > 0) then
call TargetCast(sd.o, GetUnitX(sd.t), GetUnitY(sd.t), 0.5, CAST_ID, sd.l + 3, "invisibility", 0, sd.t)
else
call TargetCast(sd.o, GetUnitX(sd.t), GetUnitY(sd.t), 0.5, CAST_ID, sd.l, "invisibility", 0, sd.t)
endif
endif
if(sd.m > 0) then
if(sd.ma) then
if(sd.md > 0.0) then
set sd.md = sd.md - Interval()
else
set sd.ma = false
endif
else
call SaveInteger(MagicDamage_Ht, sd.uId, 0, LoadInteger(MagicDamage_Ht, sd.uId, 0) - sd.m)
endif
endif
if(sd.u == sd.t) then
if(not IsUnitInGroup(sd.u, Wicking)) then
call GroupAddUnit(Wicking, sd.u)
endif
endif
else
call UnitRemoveAbility(sd.t, BUFF_ID)
call SetUnitMoveSpeed(sd.t, GetUnitDefaultMoveSpeed(sd.t))
if(sd.u == sd.t) then
if(IsUnitInGroup(sd.u, Wicking)) then
call GroupRemoveUnit(Wicking, sd.u)
endif
endif
set sd.u = null
set sd.o = null
set sd.t = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local DarkVeil_Data sd = DarkVeil_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local unit target = GetSpellTargetUnit()
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
set sd.u = caster
set sd.uId = casterID
set sd.o = owner
set sd.l = level
set sd.t = target
set sd.d = Duration(level)
set sd.up = 0
set sd.m = 0
set sd.ma = false
set sd.md = 0.0
set sd.dm = 0.0
call SetUnitMoveSpeed(target, GetUnitMoveSpeed(target) + Move_Speed(level))
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, target, "origin"))
if(item1 > 0) then
set sd.d = sd.d + (UPGRADE1_DURATION1 * item1)
endif
if(item2 > 0) then
set sd.d = sd.d + (UPGRADE1_DURATION2 * item2)
endif
if(item3 > 0) then
set sd.d = sd.d + (UPGRADE1_DURATION3 * item3)
set sd.up = item3
endif
if(item4 > 0) then
set sd.m = sd.m + (UPGRADE2_MAGIC1 * item4)
set sd.dm = UPGRADE2_DURATION_MAGIC
endif
if(item4 > 0) then
set sd.m = sd.m + (UPGRADE2_MAGIC2 * item4)
set sd.dm = UPGRADE2_DURATION_MAGIC
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set target = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(DarkVeilTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(DarkVeilTrg, Condition(function Conditions))
call TriggerAddAction(DarkVeilTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
endfunction
endscope
//TESH.scrollpos=453
//TESH.alwaysfold=0
globals
group AtropyRitualUnit = CreateGroup()
endglobals
scope AtropyRitual initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A06C' //Spell Atropy Ritual rawcode
private constant integer TOTAL_CHANNELER = 3 //Total unit to channel ritual
private constant real DISTANCE_OFFSET = 100.0 //Distance offset from caster
private constant real RADIUS = 9000.0 //Radius of whole map
private constant integer EFFECT_KEY = 0 //Effect key
private constant integer DAMAGE_KEY = 1 //Damage key
private constant real INTERVAL = 1.0 //Interval increase damage
private constant real PING_DURATION = 2.0 //Ping duration
private constant attacktype A_TYPE = ATTACK_TYPE_CHAOS //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_COLD //Spell damage type
private constant integer ITEM1_UPGRADE1 = 'I00Y' //Item Blight River
private constant integer ITEM1_UPGRADE2 = 'I021' //Item Aphotical Scythe
private constant integer ITEM2_UPGRADE1 = 'I027' //Item Acolyte Mantle
private constant integer ITEM2_UPGRADE2 = 'I027' //Item Mindseer of Ultimate
private constant integer UPGRADE1_ABILITY1 = 'A03K' //Upgrade item 1 increase armor 1
private constant integer UPGRADE1_ABILITY2 = 'AId5' //Upgrade item 1 increase armor 2
private constant real UPGRADE1_DAMAGE_INCREMENT2 = 1.0 //Upgrade 1 item 1
private constant real UPGRADE2_DAMAGE1 = 250.0 //Upgrade item 2 damage killer
private constant real UPGRADE2_DAMAGE2 = 500.0 //Upgrade item 2 damage killer
private constant real UPGRADE2_DURATION2 = 10.0 //Upgrade 2 item 2
private constant string SPELL_EFFECT = "war3mapImported\\UnsummonTargetBlue.mdx" //Special effect channel
private constant string GROUND_EFFECT = "war3mapImported\\FeastAura.mdx" //Ground effect
private constant string SPECIAL_EFFECT = "war3mapImported\\SoulArmor.mdx" //Special effect target
private constant string UPGRADE_EFFECT = "Abilities\\Spells\\Undead\\FrostArmor\\FrostArmorTarget.mdl" //Effect upgrade
endglobals
//Duration
private function Duration takes integer level returns real
if(level == 1) then
return 60.0
elseif(level == 2) then
return 60.0
else
return 0.0
endif
endfunction
//Damage
private function Damage takes integer level returns real
if(level == 1) then
return 0.1
elseif(level == 2) then
return 0.2
else
return 0.0
endif
endfunction
//Damage increment
private function Damage_Increment takes integer level returns real
if(level == 1) then
return 0.05
elseif(level == 2) then
return 0.1
else
return 0.0
endif
endfunction
//Dummy type
private function Dummy_Type takes integer level returns integer
if(level == 1) then
return 'uaco'
elseif(level == 2) then
return 'u005'
else
return 0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_HERO) == true) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct AtropyRitual_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of spell
group g //Group target
hashtable ht //Hashtable
integer t //Total channeler
real x //Cast x
real y //Cast y
real d //Duration
real dd //Damage
real i //Interval
real im //Interval max
real di //Damage increase per interval
unit array dum[5] //Dummies
effect e //Effect
effect sfx //Effect ground
real kd //Kill damage
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private AtropyRitual_Data array Ar[10]
private group all
private group copy
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local AtropyRitual_Data sd
local integer i = 0
local integer j = 0
local boolean exist = false
local unit f = null
local integer fId = 0
local integer total = 0
local real damage = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.d > 0) then
set sd.d = sd.d - Interval()
set exist = false
set total = 0
set j = 0
loop
exitwhen(j >= sd.t)
if(not IsUnitDead(sd.dum[j])) then
set exist = true
call QueueUnitAnimation(sd.dum[j], "stand, work, gold")
set total = total + 1
endif
set j = j + 1
endloop
if(not exist) then
set sd.d = 0.0
else
call GroupEnumUnitsInRange(all, sd.x, sd.y, RADIUS, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o) and (not IsUnitInGroup(f, sd.g))) then
set fId = GetUnitUserData(f)
call GroupAddUnit(sd.g, f)
set j = 0
loop
exitwhen(j >= sd.t)
if(not IsUnitDead(sd.dum[j])) then
call UnitShareVision(sd.dum[j], GetOwningPlayer(f), true)
endif
set j = j + 1
endloop
call SaveEffectHandle(sd.ht, fId, EFFECT_KEY, AddSpecialEffectTarget(SPECIAL_EFFECT, f, "chest"))
call SaveReal(sd.ht, fId, DAMAGE_KEY, sd.dd)
endif
endloop
set copy = CopyGroup(sd.g)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set fId = GetUnitUserData(f)
if(IsUnitDead(f) or IsUnitType(f, UNIT_TYPE_MAGIC_IMMUNE)) then
call GroupRemoveUnit(sd.g, f)
call DestroyEffect(LoadEffectHandle(sd.ht, fId, EFFECT_KEY))
call FlushChildHashtable(sd.ht, fId)
else
set damage = LoadReal(sd.ht, fId, DAMAGE_KEY)
call UnitDamageTarget(sd.u, f, damage, true, false, A_TYPE, D_TYPE, null)
endif
endloop
endif
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
set copy = CopyGroup(sd.g)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set fId = GetUnitUserData(f)
set damage = LoadReal(sd.ht, fId, DAMAGE_KEY)
call SaveReal(sd.ht, fId, DAMAGE_KEY, damage + sd.di)
endloop
endif
if(not IsUnitInGroup(sd.u, Wicking)) then
call GroupAddUnit(Wicking, sd.u)
endif
else
if(sd.e != null) then
call DestroyEffect(sd.e)
set sd.e = null
endif
if(sd.sfx != null) then
call DestroyEffect(sd.sfx)
set sd.sfx = null
endif
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
set fId = GetUnitUserData(f)
call GroupRemoveUnit(sd.g, f)
call DestroyEffect(LoadEffectHandle(sd.ht, fId, EFFECT_KEY))
call FlushChildHashtable(sd.ht, fId)
endloop
set j = 0
loop
exitwhen(j >= sd.t)
call KillUnit(sd.dum[j])
set sd.dum[j] = null
set j = j + 1
endloop
if(IsUnitInGroup(sd.u, Wicking)) then
call GroupRemoveUnit(Wicking, sd.u)
endif
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local AtropyRitual_Data sd = AtropyRitual_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local real angle = GetUnitFacing(caster)
local player owner = GetOwningPlayer(caster)
local real x = 0.0
local real y = 0.0
local real rad = angle * bj_DEGTORAD
local real face = 0.0
local integer i = 0
local boolean isNull = (Ar[Total] == null)
local unit f = null
local integer fId = 0
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_SW_AtropyRitual
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
if(isNull) then
set sd = AtropyRitual_Data.create()
set sd.g = CreateGroup()
set sd.ht = InitHashtable()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.t = TOTAL_CHANNELER
set sd.x = casterX
set sd.y = casterY
set sd.d = Duration(level)
set sd.dd = Damage(level)
set sd.dd = sd.dd + (sd.dd * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.i = INTERVAL
set sd.im = sd.i
set sd.di = Damage_Increment(level)
if(item2 > 0) then
set sd.di = sd.di + (UPGRADE1_DAMAGE_INCREMENT2 * item2)
endif
set sd.di = sd.di + (sd.dd * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
if(item3 > 0) then
set sd.kd = sd.kd + (UPGRADE2_DAMAGE1 * item3)
endif
if(item4 > 0) then
set sd.kd = sd.kd + (UPGRADE2_DAMAGE2 * item4)
set sd.d = sd.d + (UPGRADE2_DURATION2 * item4)
endif
loop
exitwhen(i >= sd.t)
set rad = angle * bj_DEGTORAD
set x = casterX + DISTANCE_OFFSET * Cos(rad)
set y = casterY + DISTANCE_OFFSET * Sin(rad)
set face = Atan2(casterY - y, casterX - x) * bj_RADTODEG
set sd.dum[i] = CreateUnit(owner, Dummy_Type(level), x, y, face)
if(item2 > 0) then
call UnitAddAbility(sd.dum[i], UPGRADE1_ABILITY2)
endif
if(item1 > 0) then
call UnitAddAbility(sd.dum[i], UPGRADE1_ABILITY1)
endif
call UnitAddAbility(sd.dum[i], 'Arav')
call UnitRemoveAbility(sd.dum[i], 'Arav')
call SetUnitPathing(sd.dum[i], false)
call SetUnitX(sd.dum[i], x)
call SetUnitY(sd.dum[i], y)
call GroupAddUnit(AtropyRitualUnit, sd.dum[i])
call SetUnitAnimation(sd.dum[i], "stand, work, gold")
if(item1 > 0 or item2 > 0) then
call AddSpecialEffectTarget(UPGRADE_EFFECT, sd.dum[i], "chest")
endif
set angle = angle + (360.0 / TOTAL_CHANNELER)
set i = i + 1
endloop
set sd.e = AddSpecialEffect(SPELL_EFFECT, casterX, casterY)
set sd.sfx = AddSpecialEffect(GROUND_EFFECT, casterX, casterY)
call GroupEnumUnitsInRange(all, casterX, casterY, RADIUS, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o) and (not IsUnitInGroup(f, sd.g))) then
set fId = GetUnitUserData(f)
call GroupAddUnit(sd.g, f)
call SaveEffectHandle(sd.ht, fId, EFFECT_KEY, AddSpecialEffectTarget(SPECIAL_EFFECT, f, "chest"))
call SaveReal(sd.ht, fId, DAMAGE_KEY, sd.dd)
endif
endloop
if(IsPlayerInForce(GetLocalPlayer(), Players)) then
call PingMinimap(casterX, casterY, PING_DURATION)
endif
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set owner = null
set s = null
set f = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Kill_Actions takes nothing returns nothing
local unit killed = GetDyingUnit()
local unit killer = GetKillingUnit()
local AtropyRitual_Data sd
local integer i = 0
local integer j = 0
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.kd > 0) then
set j = 0
loop
exitwhen(j >= 3)
if(sd.dum[j] == killed) then
call UnitDamageTarget(sd.u, killer, sd.kd, true, false, A_TYPE, D_TYPE, null)
set j = 3
endif
set j = j + 1
endloop
set i = Total
endif
set i = i + 1
endloop
set killed = null
set killer = null
endfunction
//----------------------------------------------------------------
private function Kill_Conditions takes nothing returns boolean
local unit dying = GetDyingUnit()
local boolean okey = (GetUnitTypeId(dying) == 'uaco' or GetUnitTypeId(dying) == 'u005')
set dying = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(AtropyRitualTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(AtropyRitualTrg, Condition(function Conditions))
call TriggerAddAction(AtropyRitualTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(AtropyRitualKillTrg, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(AtropyRitualKillTrg, Condition(function Kill_Conditions))
call TriggerAddAction(AtropyRitualKillTrg, function Kill_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set copy = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
call Preload(UPGRADE_EFFECT)
endfunction
endscope
//TESH.scrollpos=70
//TESH.alwaysfold=0
scope ClawAssault initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A06F' //Spell Claw Assault rawcode
private constant integer BUFF_ID = 'B01Z' //Buff Finger of Dread rawcode
private constant integer BUFF1_ID = 'BUsl' //Buff Sleep rawcode
private constant integer BUFF2_ID = 'BUsp' //Buff Sleep (Pause Unit) rawcode
private constant integer BUFF3_ID = 'BUst' //Buff Sleep (Stun) rawcode
private constant integer FLY_ID = 'Arav' //Spell Storm Crow Form rawcode
private constant real JUMP_TIME = 1.0 //Time of jump
private constant real JUMP_DURATION = JUMP_TIME * 0.7 //Duration of jump in jump time
private constant real FALL_DURATION = JUMP_TIME * 0.2 //Duration of fall in jump time
private constant real JUMP_DISTANCE = 0.1 //Percentage from distance to jump
private constant real FALL_DISTANCE = 1 - JUMP_DISTANCE //Percentage from distance to fall
private constant real MAX_HEIGHT = 100 //Maximum jump height
private constant integer ANIME = 9 //Animation attack index
private constant real DAMAGE_RANGE = 50.0 //Damage range deal
private constant integer EFFECT_DUMMY_ID = 'n011' //Effect dummy rawcode
private constant real DAMAGE_TO_TREES = 5.0 //Damage to trees
private constant integer ITEM1_UPGRADE1 = 'gcel' //Item Gauntlet of Brawler
private constant integer ITEM1_UPGRADE2 = 'rst1' //Item Hypergloves
private constant integer ITEM1_UPGRADE3 = 'crdt' //Item Armlet of Insanity
private constant integer ITEM2_UPGRADE1 = 'modt' //Item Scourge Visor
private constant integer ITEM2_UPGRADE2 = 'I01E' //Item Devourer Maw
private constant integer ITEM2_UPGRADE3 = 'anfg' //Item Brutalic
private constant real UPGRADE1_RADIUS1 = 50.0 //Upgrade 1 effect 1
private constant real UPGRADE1_RADIUS2 = 100.0 //Upgrade 1 effect 2
private constant real UPGRADE1_RADIUS3 = 150.0 //Upgrade 1 effect 3
private constant real UPGRADE1_DAMAGE3 = 50.0 //Upgrade 1 effect 3
private constant real UPGRADE2_LIFE_STEAL1 = 10.0 //Upgrade 1 effect 1
private constant real UPGRADE2_LIFE_STEAL2 = 20.0 //Upgrade 1 effect 2
private constant real UPGRADE2_LIFE_STEAL3 = 30.0 //Upgrade 1 effect 3
private constant real UPGRADE2_DAMAGE3 = 50.0 //Upgrade 1 effect 3
private constant attacktype A_TYPE = ATTACK_TYPE_HERO //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_DEATH //Spell damage type
endglobals
//Damage dealt to target
private function Damage takes integer level returns real
if(level == 1) then
return 100.0
elseif(level == 2) then
return 140.0
elseif(level == 3) then
return 210.0
elseif(level == 4) then
return 300.0
else
return 0.0
endif
endfunction
//Radius of damage deal
private function Radius takes integer level returns real
return 300.0 + (0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_FLYING) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct ClawAssault_Data
unit u //Unit caster
player p //Owner of caster
integer l //Level of ability
unit dum //Unit dummy
real t1 //Distance from caster position to jump max
real t2 //Distance from jump max to target position
real m1 //Distance move per interval of distance 1
real m2 //Distance move per interval of distance 2
real h1 //Height jump per interval
real h2 //Height fall per interval
real cos //Cos of angle
real sin //Sin of angle
real h //Caster height
real d //Damage deal
real r //Radius of damage
real ls //Life steal
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private ClawAssault_Data array Ar[10]
private integer Total
private group all
private boolexpr bexpr
private location loc
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local ClawAssault_Data sd
local integer i = 0
local real x = 0.0
local real y = 0.0
local unit f = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t1 > 0) then
set sd.h = sd.h + sd.h1
call SetUnitFlyHeight(sd.u, sd.h, 0.0)
call SetUnitFlyHeight(sd.dum, sd.h, 0.0)
set x = GetUnitX(sd.u) + sd.m1 * sd.cos
set y = GetUnitY(sd.u) + sd.m1 * sd.sin
//call SetUnitPosition(sd.u, sd.x, sd.y)
//call SetUnitX(sd.u, sd.x)
//call SetUnitY(sd.u, sd.y)
//call SetUnitPosition(sd.dum, sd.x, sd.y)
//if(IsWall(x, y, 100.0)) then
//set sd.t1 = 0
//else
if(x > WorldBounds.minX + 200.0 and /*
*/x < WorldBounds.maxX - 200.0 and /*
*/y > WorldBounds.minY + 200.0 and /*
*/y < WorldBounds.maxY - 200.0) then
call SetUnitX(sd.u, x)
call SetUnitY(sd.u, y)
call SetUnitPosition(sd.dum, x, y)
endif
set sd.t1 = sd.t1 - sd.m1
elseif(sd.t2 > 0) then
set sd.h = sd.h - sd.h2
call SetUnitFlyHeight(sd.u, sd.h, 0.0)
call SetUnitFlyHeight(sd.dum, sd.h, 0.0)
set x = GetUnitX(sd.u) + sd.m2 * sd.cos
set y = GetUnitY(sd.u) + sd.m2 * sd.sin
//call SetUnitPosition(sd.u, sd.x, sd.y)
//call SetUnitX(sd.u, sd.x)
//call SetUnitY(sd.u, sd.y)
//call SetUnitPosition(sd.dum, sd.x, sd.y)
//if(IsWall(x, y, 100.0)) then
//set sd.t2 = 0
//else
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0)) and (not IsBarrel(sd.u, x, y, 100.0))) then
call SetUnitX(sd.u, x)
call SetUnitY(sd.u, y)
call SetUnitPosition(sd.dum, x, y)
endif
set sd.t2 = sd.t2 - sd.m2
else
//call PauseUnit(sd.u, false)
call SetUnitPathing(sd.u, true)
//call SetUnitPosition(sd.u, sd.x - 50.0 * sd.cos, sd.y - 50.0 * sd.sin)
call SetUnitFlyHeight(sd.u, GetUnitDefaultFlyHeight(sd.u), 0.0)
//call SetUnitAnimation(sd.u, "stand")
call UnitApplyTimedLife(sd.dum, 'BTLF', 0.1)
set x = GetUnitX(sd.u) + DAMAGE_RANGE * sd.cos
set y = GetUnitY(sd.u) + DAMAGE_RANGE * sd.sin
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (IsUnitEnemy(f, sd.p)) then
if(GetUnitAbilityLevel(f, BUFF1_ID) > 0 or /*
*/GetUnitAbilityLevel(f, BUFF2_ID) > 0 or /*
*/GetUnitAbilityLevel(f, BUFF3_ID) > 0) then
if(GetUnitState(f, UNIT_STATE_LIFE) > sd.d + 50.0) then
call SetUnitState(f, UNIT_STATE_LIFE, GetUnitState(f, UNIT_STATE_LIFE) - sd.d)
else
call UnitDamageTarget(sd.u, f, sd.d, true, false, A_TYPE, D_TYPE, null)
endif
else
call UnitDamageTarget(sd.u, f, sd.d, true, false, A_TYPE, D_TYPE, null)
endif
call SetSoundPosition(gg_snd_WoodHeavyBashFlesh, x, y, 0)
call SetSoundVolume(gg_snd_WoodHeavyBashFlesh, 100)
call StartSound(gg_snd_WoodHeavyBashFlesh)
endif
endloop
if(sd.ls > 0.0) then
call SetUnitState(sd.u, UNIT_STATE_LIFE, GetUnitState(sd.u, UNIT_STATE_LIFE) + sd.d * sd.ls)
endif
call HitTree(x, y, sd.r, DAMAGE_TO_TREES, 0.0)
call Pather(sd.u, 1.5)
set sd.u = null
set sd.p = null
set sd.dum = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local ClawAssault_Data sd = ClawAssault_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local unit target = GetSpellTargetUnit()
local real targetX = 0.0
local real targetY = 0.0
local real dx = 0.0
local real dy = 0.0
local real angle = 0.0
local real distance = 0.0
local unit dummy = null
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item6 = IsUnitHasItemType(caster, ITEM2_UPGRADE3)
local real extraRadius = 0.0
if(target == null) then
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
else
set targetX = GetUnitX(target)
set targetY = GetUnitY(target)
endif
set dx = targetX - casterX
set dy = targetY - casterY
set angle = Atan2(targetY - casterY, targetX - casterX)
set distance = SquareRoot(dx * dx + dy * dy)
set dummy = CreateUnit(GetOwningPlayer(caster), EFFECT_DUMMY_ID, casterX, casterY, angle * bj_RADTODEG)
set sd.u = caster
set sd.p = GetOwningPlayer(caster)
set sd.l = level
set sd.dum = dummy
set sd.t1 = distance * JUMP_DISTANCE
set sd.t2 = distance * FALL_DISTANCE
set sd.m1 = (sd.t1 /(JUMP_DURATION / Interval())) * 2
set sd.m2 = (sd.t2 /(FALL_DURATION / Interval())) * 2
set sd.h1 = (MAX_HEIGHT / (JUMP_DURATION / Interval())) * 2
set sd.h2 = (MAX_HEIGHT / (FALL_DURATION / Interval())) * 2
set sd.cos = Cos(angle)
set sd.sin = Sin(angle)
set sd.h = GetUnitFlyHeight(caster)
set sd.d = Damage(level)
set sd.r = Radius(level)
set sd.ls = 0.0
if(GetUnitAbilityLevel(caster, BUFF_ID) > 0) then
set sd.d = sd.d + sd.d / 2
endif
call UnitAddAbility(caster, FLY_ID)
call UnitRemoveAbility(caster, FLY_ID)
call SetUnitAnimationByIndex(caster, ANIME)
//call PauseUnit(caster, true)
call SetUnitPathing(caster, false)
call UnitAddAbility(sd.dum, FLY_ID)
call UnitRemoveAbility(sd.dum, FLY_ID)
call SetUnitPathing(sd.dum, false)
if(item1 > 0) then
set extraRadius = UPGRADE1_RADIUS1
endif
if(item2 > 0) then
set extraRadius = UPGRADE1_RADIUS2
endif
if(item3 > 0) then
set extraRadius = UPGRADE1_RADIUS3
set sd.d = sd.d + UPGRADE1_DAMAGE3
endif
set sd.r = sd.r + extraRadius
set sd.d = sd.d + (sd.d * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
if(item4 > 0) then
set sd.ls = sd.ls + (UPGRADE2_LIFE_STEAL1 * item4)
endif
if(item5 > 0) then
set sd.ls = sd.ls + (UPGRADE2_LIFE_STEAL2 * item5)
endif
if(item6 > 0) then
set sd.ls = sd.ls + (UPGRADE2_LIFE_STEAL3 * item6)
set sd.d = sd.d + UPGRADE2_DAMAGE3
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set dummy = null
set target = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(ClawAssaultTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(ClawAssaultTrg, Condition(function Conditions))
call TriggerAddAction(ClawAssaultTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
set loc = Location(0, 0)
//Preload
call AbilityPreload(SPELL_ID)
endfunction
endscope
//TESH.scrollpos=289
//TESH.alwaysfold=0
scope Isolation initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'AUsl' //Spell Mind Isolation rawcode
private constant integer CAST1_ID = 'A06G' //Spell Mind Isolation (Illusion) rawcode
private constant integer CAST2_ID = 'AHbn' //Spell Isolation (Banish) rawcode
private constant integer ORDER_ID = 852274 //Order illusion number
private constant integer BUFF1_ID = 'BUsl' //Buff Sleep rawcode
private constant integer BUFF2_ID = 'BUsp' //Buff Sleep (Pause Unit) rawcode
private constant integer BUFF3_ID = 'BUst' //Buff Sleep (Stun) rawcode
private constant integer BUFF4_ID = 'BHbn' //Buff Soul Form (Banish) rawcode
private constant integer DUMMY_ID = 'n000' //Unit Dummy rawcode
private constant integer CASTER_KEY = 0 //Caster key
private constant integer TARGET_KEY = 1 //Target key
private constant integer ITEM1_UPGRADE1 = 'I006' //Item Baneriven Dagger
private constant integer ITEM1_UPGRADE2 = 'I010' //Item Venomwax Fang
private constant integer ITEM1_UPGRADE3 = 'I014' //Item Cinquedea Ivy
private constant integer ITEM2_UPGRADE1 = 'I01O' //Item Bloodeye Lynch
private constant integer ITEM2_UPGRADE2 = 'I01S' //Item Havocrave Dissever
private constant real UPGRADE1_DAMAGE1 = 5.0 //Upgrade 1 effect 1
private constant real UPGRADE1_DAMAGE2 = 10.0 //Upgrade 1 effect 2
private constant real UPGRADE1_DAMAGE3 = 15.0 //Upgrade 1 effect 3
private constant attacktype A_TYPE = ATTACK_TYPE_MAGIC //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_MAGIC //Spell damage type
private constant string DAMAGE_EFFECT = "Abilities\\Weapons\\SkeletalMageMissile\\SkeletalMageMissile.mdl" //Effect of damage
private constant string DEATH_EFFECT = "Abilities\\Weapons\\IllidanMissile\\IllidanMissile.mdl" //Effect death
endglobals
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Isolation_Data
unit u //Unit Caster
unit t //Unit Target
unit s //Unit summoned
real f //Life of target
real d //Damage
endstruct
//----------------------------------------------------------------
globals
private hashtable ht
private timer Tim
private Isolation_Data array Ar[10]
private integer Total
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Isolation_Data sd
local integer i = 0
local real summonLife = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if((not IsUnitDead(sd.s)) and /*
*/((not IsUnitDead(sd.t))) and /*
*/(GetUnitAbilityLevel(sd.t, BUFF1_ID) > 0 or /*
*/GetUnitAbilityLevel(sd.t, BUFF2_ID) > 0 or /*
*/GetUnitAbilityLevel(sd.t, BUFF3_ID) > 0)) then
if(GetUnitState(sd.t, UNIT_STATE_LIFE) < GetUnitState(sd.s, UNIT_STATE_LIFE)) then
call SetUnitState(sd.s, UNIT_STATE_LIFE, GetUnitState(sd.t, UNIT_STATE_LIFE))
endif
set summonLife = GetUnitState(sd.s, UNIT_STATE_LIFE)
call SetUnitState(sd.t, UNIT_STATE_LIFE, summonLife)
if(sd.f - summonLife > 10) then
if(sd.d > 0.0) then
call UnitDamageTarget(sd.u, sd.t, sd.d, true, false, A_TYPE, D_TYPE, null)
endif
call DestroyEffect(AddSpecialEffectTarget(DAMAGE_EFFECT, sd.t, "origin"))
endif
set sd.f = summonLife
else
if((not IsUnitDead(sd.s)) or /*
*/not (GetUnitAbilityLevel(sd.t, BUFF1_ID) > 0 or /*
*/GetUnitAbilityLevel(sd.t, BUFF2_ID) > 0 or /*
*/GetUnitAbilityLevel(sd.t, BUFF3_ID) > 0)) then
call DestroyEffect(AddSpecialEffect(DEATH_EFFECT, GetUnitX(sd.s), GetUnitY(sd.s)))
call RemoveUnit(sd.s)
endif
if((not IsUnitDead(sd.t))) then
call UnitRemoveAbility(sd.t, BUFF1_ID)
call UnitRemoveAbility(sd.t, BUFF2_ID)
call UnitRemoveAbility(sd.t, BUFF3_ID)
endif
set sd.u = null
set sd.t = null
set sd.s = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local unit target = GetSpellTargetUnit()
local player targetOwner = GetOwningPlayer(target)
local real targetX = GetUnitX(target)
local real targetY = GetUnitY(target)
local unit dummy = null
local integer dummyID = 0
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_MP_Isolation
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
if(not IsUnitIllusion(GetSpellTargetUnit()) and /*
*/not (GetUnitAbilityLevel(GetSpellTargetUnit(), BUFF1_ID) > 0) and /*
*/not (GetUnitAbilityLevel(GetSpellTargetUnit(), BUFF2_ID) > 0) and /*
*/not (GetUnitAbilityLevel(GetSpellTargetUnit(), BUFF3_ID) > 0)) then
set dummy = CreateUnit(targetOwner, DUMMY_ID, targetX, targetY, bj_UNIT_FACING)
set dummyID = GetUnitUserData(dummy)
call SaveUnitHandle(ht, dummyID, CASTER_KEY, caster)
call SaveUnitHandle(ht, dummyID, TARGET_KEY, target)
call UnitApplyTimedLife(dummy, 'BTLF', 1.0)
call UnitAddAbility(dummy, CAST1_ID)
if(item4 > 0) then
call SetUnitAbilityLevel(dummy, CAST1_ID, 2)
elseif(item5 > 0) then
call SetUnitAbilityLevel(dummy, CAST1_ID, 3)
else
call SetUnitAbilityLevel(dummy, CAST1_ID, 1)
endif
call IssueTargetOrderById(dummy, ORDER_ID, target)
else
call IssueImmediateOrder(caster, "stop")
endif
set caster = null
set target = null
set targetOwner = null
set dummy = null
set s = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Illusion_Actions takes nothing returns nothing
local Isolation_Data sd = Isolation_Data.create()
local unit summoner = GetSummoningUnit()
local integer summonerID = GetUnitUserData(summoner)
local unit summon = GetSummonedUnit()
local player owner = GetOwningPlayer(summon)
local real summonX = GetUnitX(summon)
local real summonY = GetUnitY(summon)
local unit dummy = null
local unit caster = LoadUnitHandle(ht, summonerID, CASTER_KEY)
local unit target = LoadUnitHandle(ht, summonerID, TARGET_KEY)
local real targetX = GetUnitX(target)
local real targetY = GetUnitY(target)
local real rad = GetUnitFacing(target) * bj_DEGTORAD
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
call FlushChildHashtable(ht, summonerID)
call TargetCast(owner, summonX, summonY, 0.5, CAST2_ID, 1, "banish", 0, summon)
//set dummy = CreateUnit(owner, DUMMY_ID, summonX, summonY, bj_UNIT_FACING )
//call UnitApplyTimedLife(dummy, 'BTLF', 0.5)
//call UnitAddAbility(dummy, CAST2_ID)
//call IssueTargetOrder(dummy, "banish", summon)
call SetUnitMoveSpeed(summon, 522)
call SetUnitPathing(summon, false)
call SetUnitX(summon, targetX + 50.0 * Cos(rad))
call SetUnitY(summon, targetY + 50.0 * Sin(rad))
set sd.u = caster
set sd.t = target
set sd.s = summon
set sd.f = GetUnitState(target, UNIT_STATE_LIFE)
set sd.d = 0.0
if(item1 > 0) then
set sd.d = sd.d + (UPGRADE1_DAMAGE1 * item1)
endif
if(item2 > 0) then
set sd.d = sd.d + (UPGRADE1_DAMAGE2 * item2)
endif
if(item3 > 0) then
set sd.d = sd.d + (UPGRADE1_DAMAGE3 * item3)
endif
if(GetLocalPlayer() == owner) then
call SelectUnit(summon, true)
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set summoner = null
set owner = null
set caster = null
set target = null
set summon = null
set dummy = null
endfunction
//----------------------------------------------------------------
private function Illusion_Conditions takes nothing returns boolean
return IsUnitIllusion(GetSummonedUnit()) and /*
*/ GetUnitTypeId(GetSummoningUnit()) == DUMMY_ID
endfunction
//----------------------------------------------------------------
private function Kill_Actions takes nothing returns nothing
local unit killer = GetKillingUnit()
local unit dying = GetDyingUnit()
local Isolation_Data sd
local integer i = 0
if(IsUnitIllusion(dying)) then
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.s == dying) then
call DestroyEffect(AddSpecialEffect(DEATH_EFFECT, GetUnitX(dying), GetUnitY(dying)))
call RemoveUnit(dying)
call UnitRemoveAbility(sd.t, BUFF1_ID)
call UnitRemoveAbility(sd.t, BUFF2_ID)
call UnitRemoveAbility(sd.t, BUFF3_ID)
call UnitDamageTarget(killer, sd.t, 100000.0, true, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL, null)
endif
set i = i + 1
endloop
endif
set killer = null
set dying = null
endfunction
//----------------------------------------------------------------
private function Kill_Conditions takes nothing returns boolean
return IsUnitIllusion(GetDyingUnit()) //and GetUnitAbilityLevel(GetDyingUnit(), BUFF4_ID) > 0
endfunction
//----------------------------------------------------------------
private function Kill_Actions2 takes nothing returns nothing
local unit killer = GetKillingUnit()
local unit dying = GetDyingUnit()
call SetUnitAnimation(dying, "stand")
set killer = null
set dying = null
endfunction
//----------------------------------------------------------------
private function Kill_Conditions2 takes nothing returns boolean
return IsUnitType(GetDyingUnit(), UNIT_TYPE_HERO) and GetUnitAbilityLevel(GetDyingUnit(), BUFF4_ID) > 0
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(IsolationTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(IsolationTrg, Condition(function Conditions))
call TriggerAddAction(IsolationTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(IsolationIlluTrg, EVENT_PLAYER_UNIT_SUMMON)
call TriggerAddCondition(IsolationIlluTrg, Condition(function Illusion_Conditions))
call TriggerAddAction(IsolationIlluTrg, function Illusion_Actions)
call TriggerRegisterAnyUnitEventBJ(IsolationKillTrg, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(IsolationKillTrg, Condition(function Kill_Conditions))
call TriggerAddAction(IsolationKillTrg, function Kill_Actions)
call TriggerRegisterAnyUnitEventBJ(IsolationKillTrg2, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(IsolationKillTrg2, Condition(function Kill_Conditions2))
call TriggerAddAction(IsolationKillTrg2, function Kill_Actions2)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set ht = InitHashtable()
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST1_ID)
call AbilityPreload(CAST2_ID)
call Preload(DAMAGE_EFFECT)
call Preload(DEATH_EFFECT)
endfunction
endscope
//TESH.scrollpos=55
//TESH.alwaysfold=0
scope SoulPrison initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A06H' //Spell Soul Prison rawcode
private constant integer ABILITY_ID = 'AOae' //Ability Soul Prison (Speed) rawcode
private constant integer DUMMY1_ID = 'n012' //Dummy aura rawcode
private constant integer DUMMY2_ID = 'n013' //Dummy orb rawcode
private constant integer BUFF1_ID = 'BUsl' //Buff Sleep rawcode
private constant integer BUFF2_ID = 'BUsp' //Buff Sleep (Pause Unit) rawcode
private constant integer BUFF3_ID = 'BUst' //Buff Sleep (Stun) rawcode
private constant integer ITEM1_UPGRADE1 = 'I008' //Item Mania Cestus
private constant integer ITEM1_UPGRADE2 = 'I011' //Item Fist of Firebringer
private constant integer ITEM2_UPGRADE1 = 'penr' //Item Gratify Rosary
private constant integer ITEM2_UPGRADE2 = 'pmna' //Item Pendant of Innerforce
private constant integer ITEM2_UPGRADE3 = 'I01V' //Item Power Fragment
private constant real UPGRADE1_DURATION1 = 5.0 //Upgrade 1 effect 1
private constant real UPGRADE1_DURATION2 = 10.0 //Upgrade 1 effect 2
private constant real UPGRADE2_MANA1 = 20.0 //Upgrade 2 effect 1
private constant real UPGRADE2_MANA2 = 40.0 //Upgrade 2 effect 2
private constant real UPGRADE2_MANA3 = 60.0 //Upgrade 2 effect 3
private constant real UPGRADE2_MANA_BURN3 = 0.4 //Upgrade 2 effect 3
private constant string UPGRADE_EFFECT1 = "Abilities\\Spells\\Undead\\Darksummoning\\DarkSummonTarget.mdl" //Upgrade effect 1
private constant string UPGRADE_EFFECT2 = "Abilities\\Spells\\NightElf\\ManaBurn\\ManaBurnTarget.mdl" //Upgrade effect 2
endglobals
//Radius effect
private function Radius takes integer level returns real
return 250.0 + (0 * level)
endfunction
//Duration
private function Duration takes integer level returns real
return 15.0 + (0.0 * level)
endfunction
//Heal amount
private function Life takes integer level returns real
return 20.0 + (20.0 * level)
endfunction
//Unit soul
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and /*
*/IsUnitType(target, UNIT_TYPE_ETHEREAL)
endfunction
//Unit dead
private function Targets_Dead takes unit target returns boolean
return (IsUnitDead(target))
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct SoulPrison_Data
unit u //Unit caster
integer uID //Caster id
player o //Owner of caster
integer l //Level of ability
unit d1 //Unit dummy 1
unit d2 //Unit dummy 2
real d //Duration
real x //Target x
real y //Target y
real r //Radius
real mb //Mana burn
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private SoulPrison_Data array Ar[10]
private group all
private boolexpr bexpr
private boolexpr bexprDead
private location target
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Pick_Dead takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local SoulPrison_Data sd
local integer i = 0
local real mana = 0.0
local unit f = null
local real fX = 0.0
local real fY = 0.0
local real fAngle = 0.0
local unit dummy = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.d > 0) then
set sd.d = sd.d - Interval()
call GroupEnumUnitsInRange(all, sd.x, sd.y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (IsUnitEnemy(f, sd.o)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set fAngle = Atan2(sd.y - fY, sd.x - fX)
if(SquareRoot((sd.x - fX) * (sd.x - fX) + (sd.y - fY) * (sd.y - fY)) > 200.0) then
call SetUnitPosition(f, fX + 30.0 * Cos(fAngle), fY + 30.0 * Sin(fAngle))
if(sd.mb > 0.0) then
call DestroyEffect(AddSpecialEffectTarget(UPGRADE_EFFECT2, f, "chest"))
endif
endif
endif
endloop
else
call KillUnit(sd.d1)
call RemoveUnit(sd.d2)
set sd.u = null
set sd.o = null
set sd.d1 = null
set sd.d2 = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
set dummy = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local SoulPrison_Data sd = SoulPrison_Data.create()
local unit caster = GetSpellAbilityUnit()
local integer casterID = GetUnitUserData(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local real targetX = 0.0
local real targetY = 0.0
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE3)
local boolean allowMana = false
local real mana = 0.0
local real manaGain = 0.0
local unit f = null
set target = GetSpellTargetLoc()
set targetX = GetLocationX(target)
set targetY = GetLocationY(target)
set sd.u = caster
set sd.uID = GetUnitUserData(caster)
set sd.o = owner
set sd.l = level
set sd.d1 = CreateUnit(owner, DUMMY1_ID, targetX, targetY, bj_UNIT_FACING)
call SetUnitPathing(sd.d1, false)
call SetUnitAbilityLevel(sd.d1, ABILITY_ID, level)
call SetUnitExploded(sd.d1, true)
set sd.d2 = CreateUnit(owner, DUMMY2_ID, targetX, targetY, bj_UNIT_FACING )
call SetUnitPathing(sd.d2, false)
set sd.d = Duration(level)
set sd.x = targetX
set sd.y = targetY
set sd.r = Radius(level)
set sd.mb = 0.0
if(item1 > 0) then
set sd.d = sd.d + (UPGRADE1_DURATION1 * item1)
endif
if(item2 > 0) then
set sd.d = sd.d + (UPGRADE1_DURATION2 * item2)
endif
if(item3 > 0) then
set allowMana = true
set mana = mana + (UPGRADE2_MANA1 * item3)
endif
if(item4 > 0) then
set allowMana = true
set mana = mana + (UPGRADE2_MANA2 * item4)
endif
if(item5 > 0) then
set allowMana = true
set mana = mana + (UPGRADE2_MANA3 * item5)
set sd.mb = sd.mb + (UPGRADE2_MANA_BURN3 * item5)
endif
if(allowMana) then
set mana = mana + (mana * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
call GroupEnumUnitsInRange(all, casterX, casterY, sd.r, bexprDead)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
set manaGain = manaGain + mana
call DestroyEffect(AddSpecialEffect(UPGRADE_EFFECT1, GetUnitX(f), GetUnitY(f)))
endloop
call SetUnitState(caster, UNIT_STATE_MANA, GetUnitState(caster, UNIT_STATE_MANA) + manaGain)
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
set f = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(SoulPrisonTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(SoulPrisonTrg, Condition(function Conditions))
call TriggerAddAction(SoulPrisonTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
set bexprDead = Condition(function Pick_Dead)
set target = Location(0, 0)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY_ID)
endfunction
endscope
//TESH.scrollpos=584
//TESH.alwaysfold=0
globals
group ImmortalCaster = CreateGroup()
group ImmortalRefresh = CreateGroup()
endglobals
scope Immortal initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A06K' //Spell Immortal rawcode
private constant integer CAST_ID = 'AHbn' //Spell Isolation (Banish) rawcode
private constant integer ABILITY_ID = 'A07U' //Ability Immortal rawcode
private constant integer DUMMY_ID = 'n015' //Dummy Immortal (Carrion) rawcode
private constant integer DUMMY1_ID = 'n014' //Dummy Immortal (Mortal Predator) rawcode
private constant integer BUFF_ID = 'BHbn' //Buff Isolation (Banish) rawcode
private constant integer BUFF1_ID = 'BUsl' //Buff Sleep rawcode
private constant integer BUFF2_ID = 'BUsp' //Buff Sleep (Pause Unit) rawcode
private constant integer BUFF3_ID = 'BUst' //Buff Sleep (Stun) rawcode
private constant integer TOTAL_BATS = 15 //Total bats per unit
private constant real MOVE_CHANGE = 10.0 //Move change
private constant real DAMAGE_TO_TREES = 30.0 //Damage to trees
private constant real INTERVAL = 1.0 //Interval damage
private constant integer ITEM1_UPGRADE1 = 'I00B' //Item Moth's Mouth
private constant integer ITEM1_UPGRADE2 = 'I01U' //Item Royaltouch
private constant integer ITEM1_UPGRADE3 = 'rnsp' //Item Ivory Halo
private constant integer ITEM2_UPGRADE1 = 'I00D' //Item Assassin Hood
private constant integer ITEM2_UPGRADE2 = 'I01I' //Item Cloak of Shadow
private constant integer ITEM2_UPGRADE3 = 'I01W' //Item Ghost Veil
private constant real UPGRADE1_MANA1 = 0.10 //Upgrade 1 effect life
private constant real UPGRADE1_LIFE2 = 0.10 //Upgrade 1 effect mana
private constant real UPGRADE1_MANA_LIFE3 = 0.15 //Upgrade 1 effect mana
private constant real UPGRADE2_DAMAGE1 = 10.0 //Upgrade 2 effect 1
private constant real UPGRADE2_DAMAGE2 = 15.0 //Upgrade 2 effect 2
private constant real UPGRADE2_DAMAGE3 = 20.0 //Upgrade 2 effect 3
private constant real UPGRADE2_COOLDOWN2 = 10.0 //Upgrade 2 effect 2
private constant real UPGRADE2_COOLDOWN3 = 20.0 //Upgrade 2 effect 3
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_DEATH //Spell damage type
private constant string SPELL_EFFECT = "war3mapImported\\Power_Orb.mdx" //"Abilities\\Spells\\Human\\Banish\\BanishTarget.mdl" //Effect cooldown
private constant string SPECIAL_EFFECT = "Abilities\\Weapons\\IllidanMissile\\IllidanMissile.mdl" //Effect cooldown
endglobals
//Radius
private function Radius takes integer level returns real
return 400.0 + (0.0 * level)
endfunction
//Damage
private function Damage takes integer level returns real
if(level == 1) then
return 40.0
elseif(level == 2) then
return 60.0
elseif(level == 3) then
return 80.0
else
return 0.0
endif
endfunction
//Move speed
private function Move_Speed takes integer level returns real
if(level == 1) then
return 60.0
elseif(level == 2) then
return 60.0
elseif(level == 3) then
return 60.0
else
return 0.0
endif
endfunction
//Interval
private function Duration takes integer level returns real
return 10.0 + (0.0 * level)
endfunction
//Revive cooldown
private function Revive_Cooldown takes integer level returns real
if(level == 1) then
return 120.0
elseif(level == 2) then
return 100.0
elseif(level == 3) then
return 80.0
else
return 0.0
endif
endfunction
//Life percent
private function Life takes integer level returns real
return 0.3 + (0.0 * level)
endfunction
//Mana percent
private function Mana takes integer level returns real
return 0.2 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Immortal_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level
group g //Group target
group gd //Group dummy
boolean h //Has cast for cooldown
integer c //Count bat
integer p //Phase
real x //Caster x
real y //Caster y
real d //Interval
real v //Revive cooldown
real i //Interval
real im //Interval max
real r //Radius
real dd //Damage
real mv //Move speed
unit dum //Dummy
effect e //Effect cooldown
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Immortal_Data array Ar[10]
private group all
private group copy
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
return Targets(GetFilterUnit())
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Immortal_Data sd
local integer i = 0
local integer j = 0
local real x = 0.0
local real y = 0.0
local real randomDistance = 0.0
local real randomAngle = 0.0
local real rad = 0.0
local real angle = 0.0
local real tX = 0.0
local real tY = 0.0
local unit f = null
local real fX = 0.0
local real fY = 0.0
local real face = 0.0
local unit dummy = null
local unit g = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.p != 4) then
set sd.v = sd.v - Interval()
endif
if(not sd.h) then
call IssueImmediateOrder(sd.u, "webon")
endif
if(sd.p == 0) then
if(IsUnitDead(sd.u)) then
call RemoveUnit(sd.dum)
call SetUnitMoveSpeed(sd.u, GetUnitDefaultMoveSpeed(sd.u))
call UnitRemoveAbility(sd.u, BUFF_ID)
call SetUnitPathing(sd.u, true)
loop
set f = FirstOfGroup(sd.gd)
exitwhen(f == null)
call GroupRemoveUnit(sd.gd, f)
call RemoveUnit(f)
endloop
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
set sd.p = 4
endif
if(sd.d > 0) then
set sd.d = sd.d - Interval()
else
set sd.p = 1
set sd.d = Duration(sd.l)
call SetUnitTimeScale(sd.dum, 0.0)
call SetUnitVertexColor(sd.dum, 255, 255, 255, 0)
endif
elseif(sd.p == 1) then
if(sd.d > 0) then
set sd.d = sd.d - Interval()
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
if(sd.c < TOTAL_BATS) then
set sd.c = sd.c + 1
set randomDistance = GetRandomReal(0.0, sd.r)
set randomAngle = GetRandomReal(0.0, 360.0)
set rad = randomAngle * bj_DEGTORAD
set tX = x + randomDistance * Cos(rad)
set tY = y + randomDistance * Sin(rad)
set dummy = CreateUnit(sd.o, DUMMY_ID, tX, tY, randomAngle)
call GroupAddUnit(sd.gd, dummy)
endif
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
set copy = CopyGroup(sd.gd)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(IsUnitDead(f)) then
call GroupRemoveUnit(sd.gd, f)
else
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set face = GetUnitFacing(f)
set rad = Atan2(y - fY, x - fX)
set angle = rad * bj_RADTODEG
call SetUnitFacing(f, angle)
set randomDistance = GetRandomReal(sd.mv - MOVE_CHANGE, sd.mv + MOVE_CHANGE)
set tX = fX + randomDistance * Cos(face * bj_DEGTORAD)
set tY = fY + randomDistance * Sin(face * bj_DEGTORAD)
if(tX > WorldBounds.minX + 300.0 and /*
*/tX < WorldBounds.maxX - 300.0 and /*
*/tY > WorldBounds.minY + 300.0 and /*
*/tY < WorldBounds.maxY - 300.0 and (not IsWall(tX, tY, 100.0))) then
call SetUnitX(f, tX)
call SetUnitY(f, tY)
endif
endif
endloop
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
if(GetUnitAbilityLevel(f, BUFF1_ID) > 0 or /*
*/GetUnitAbilityLevel(f, BUFF2_ID) > 0 or /*
*/GetUnitAbilityLevel(f, BUFF3_ID) > 0) then
if(GetUnitState(f, UNIT_STATE_LIFE) > sd.dd + 50.0) then
call SetUnitState(f, UNIT_STATE_LIFE, GetUnitState(f, UNIT_STATE_LIFE) - sd.dd)
else
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
else
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
endif
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, f, "head"))
endif
endloop
endif
if(GetUnitAbilityLevel(sd.u, BUFF_ID) <= 0) then
set sd.d = 0.0
else
call SetUnitMoveSpeed(sd.u, 1000)
endif
if(IsUnitDead(sd.u)) then
call RemoveUnit(sd.dum)
call SetUnitMoveSpeed(sd.u, GetUnitDefaultMoveSpeed(sd.u))
call UnitRemoveAbility(sd.u, BUFF_ID)
call SetUnitPathing(sd.u, true)
loop
set f = FirstOfGroup(sd.gd)
exitwhen(f == null)
call GroupRemoveUnit(sd.gd, f)
call RemoveUnit(f)
endloop
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
set sd.p = 4
endif
else
set sd.p = 2
set sd.d = 1.0
call SetUnitX(sd.dum, GetUnitX(sd.u))
call SetUnitY(sd.dum, GetUnitY(sd.u))
call SetUnitFacing(sd.dum, GetUnitFacing(sd.u))
call SetUnitVertexColor(sd.dum, 255, 255, 255, 255)
call SetUnitTimeScale(sd.dum, -2.0)
call SetUnitFlyHeight(sd.dum, 0.0, 0.0)
loop
set f = FirstOfGroup(sd.gd)
exitwhen(f == null)
call GroupRemoveUnit(sd.gd, f)
call RemoveUnit(f)
endloop
endif
elseif(sd.p == 2) then
if(sd.d > 0) then
set sd.d = sd.d - Interval()
call SetUnitX(sd.dum, GetUnitX(sd.u))
call SetUnitY(sd.dum, GetUnitY(sd.u))
call SetUnitFacing(sd.dum, GetUnitFacing(sd.u))
else
set sd.p = 3
endif
elseif(sd.p == 3) then
call RemoveUnit(sd.dum)
call SetUnitMoveSpeed(sd.u, GetUnitDefaultMoveSpeed(sd.u))
call UnitRemoveAbility(sd.u, BUFF_ID)
call SetUnitPathing(sd.u, true)
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
set sd.p = 4
elseif(sd.p == 4) then
if(sd.v > 0.0) then
set sd.v = sd.v - Interval()
if(IsUnitInGroup(sd.u, ImmortalRefresh)) then
call GroupRemoveUnit(ImmortalRefresh, sd.u)
set sd.v = 0
endif
else
call GroupRemoveUnit(ImmortalCaster, sd.u)
call SetPlayerAbilityAvailable(sd.o, SPELL_ID, true)
call UnitRemoveAbility(sd.u, ABILITY_ID)
call DestroyEffect(sd.e)
set sd.e = null
loop
set f = FirstOfGroup(sd.gd)
exitwhen(f == null)
call GroupRemoveUnit(sd.gd, f)
call RemoveUnit(f)
endloop
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
if(sd.dum != null) then
call KillUnit(sd.dum)
endif
set sd.u = null
set sd.o = null
set sd.dum = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set dummy = null
set f = null
set g = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Immortal_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
local boolean isNull = (Ar[Total] == null)
local real life = Life(level)
local real mana = Mana(level)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item6 = IsUnitHasItemType(caster, ITEM2_UPGRADE3)
local real extraDamage = 0.0
local integer extraLevel = 0
local real extraCooldown = 0.0
if(item1 > 0) then
set mana = mana + UPGRADE1_MANA1
endif
if(item2 > 0) then
set life = life + UPGRADE1_LIFE2
endif
if(item3 > 0) then
set mana = mana + UPGRADE1_MANA_LIFE3
set life = life + UPGRADE1_MANA_LIFE3
endif
if(isNull) then
set sd = Immortal_Data.create()
set sd.g = CreateGroup()
set sd.gd = CreateGroup()
else
set sd = Ar[Total]
endif
if(item4 > 0) then
set extraDamage = extraDamage + (UPGRADE2_DAMAGE1 * item4)
endif
if(item5 > 0) then
set extraDamage = extraDamage + (UPGRADE2_DAMAGE2 * item5)
set extraLevel = 3
set extraCooldown = UPGRADE2_COOLDOWN2
endif
if(item6 > 0) then
set extraDamage = extraDamage + (UPGRADE2_DAMAGE3 * item6)
set extraLevel = 6
set extraCooldown = UPGRADE2_COOLDOWN3
endif
call ReviveHero(caster, casterX, casterY, false)
call SetUnitState(caster, UNIT_STATE_LIFE, GetUnitState(caster, UNIT_STATE_MAX_LIFE) * life)
call SetUnitState(caster, UNIT_STATE_MANA, GetUnitState(caster, UNIT_STATE_MAX_MANA) * mana)
call SetPlayerAbilityAvailable(owner, SPELL_ID, false)
if(GetUnitAbilityLevel(caster, ABILITY_ID) <= 0) then
call UnitAddAbility(caster, ABILITY_ID)
call UnitMakeAbilityPermanent(caster, true, ABILITY_ID)
endif
call SetUnitAbilityLevel(caster, ABILITY_ID, level + extraLevel)
call IssueImmediateOrder(caster, "webon")
call TargetCast(owner, casterX, casterY, 0.5, CAST_ID, 1, "banish", 0, caster)
call SetUnitMoveSpeed(caster, 1000)
call UnitAddAbility(caster, 'Arav')
call UnitRemoveAbility(caster, 'Arav')
//call SetUnitPathing(caster, false)
call GroupAddUnit(ImmortalCaster, caster)
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.h = false
set sd.c = 0
set sd.p = 0
set sd.x = casterX
set sd.y = casterY
set sd.d = 1.0
set sd.v = Revive_Cooldown(level)
set sd.i = 0.0
set sd.im = INTERVAL
set sd.r = Radius(level)
set sd.dd = Damage(level) + extraDamage
set sd.dd = sd.dd + (sd.dd * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.mv = Move_Speed(level)
set sd.dum = CreateUnit(owner, DUMMY1_ID, casterX, casterY, GetUnitFacing(caster))
set sd.e = AddSpecialEffectTarget(SPELL_EFFECT, caster, "chest")
//call PauseUnit(sd.dum, true)
call SetUnitAnimation(sd.dum, "death")
call SetUnitTimeScale(sd.dum, 2.0)
call SetUnitX(sd.dum, casterX)
call SetUnitY(sd.dum, casterY)
call UnitAddAbility(sd.dum, 'Arav')
call UnitRemoveAbility(sd.dum, 'Arav')
call SetUnitPathing(sd.dum, false)
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit dying = GetTriggerUnit()
local boolean okey = GetUnitAbilityLevel(dying, SPELL_ID) > 0 and (not IsUnitInGroup(dying, ImmortalCaster))
set dying = null
return okey
endfunction
//----------------------------------------------------------------
private function Cast_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local Immortal_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
if(not sd.h) then
set sd.h = true
endif
set i = Total
endif
set i = i + 1
endloop
set caster = null
endfunction
//----------------------------------------------------------------
private function Cast_Conditions takes nothing returns boolean
return GetSpellAbilityId() == ABILITY_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(ImmortalTrg, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(ImmortalTrg, Condition(function Conditions))
call TriggerAddAction(ImmortalTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(ImmortalCastTrg, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(ImmortalCastTrg, Condition(function Cast_Conditions))
call TriggerAddAction(ImmortalCastTrg, function Cast_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set copy = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call AbilityPreload(ABILITY_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope FingerDread initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'Aroa' //Spell Finger of Dread rawcode
private constant integer ABILITY1_ID = 'A06I' //Ability Finger of Dread (Dread Form) rawcode
private constant integer ABILITY2_ID = 'A06J' //Ability Finger of Dread (Normal Form) rawcode
private constant integer ABILITY3_ID = 'A09W' //Ability Finger of Dread (Dread Form) rawcode
private constant integer ABILITY4_ID = 'A09X' //Ability Finger of Dread (Normal Form) rawcode
private constant integer BUFF_ID = 'B01Z' //Buff Finger of Dread rawcode
private constant integer ITEM1_UPGRADE1 = 'I00R' //Item Aztez Spear
private constant integer ITEM1_UPGRADE2 = 'I00S' //Item Truepierce Lance
private constant integer ITEM1_UPGRADE3 = 'I002' //Item Amazon Meld
private constant integer ITEM2_UPGRADE1 = 'I01J' //Item Lightning Gripper
private constant integer ITEM2_UPGRADE2 = 'I028' //Item Stormanifer
private constant integer UPGRADE1_CAST = 'A09Y' //Upgrade item 1 more damage
private constant integer UPGRADE1_LEVEL1 = 0 //Upgrade 1 effect 1
private constant integer UPGRADE1_LEVEL2 = 2 //Upgrade 1 effect 1
private constant integer UPGRADE1_LEVEL3 = 4 //Upgrade 1 effect 1
private constant real UPGRADE2_RESTORE_LIFE1 = 0.15 //Upgrade 2 effect 1
private constant real UPGRADE2_RESTORE_LIFE2 = 0.30 //Upgrade 2 effect 2
private constant string UPGRADE_EFFECT = "Abilities\\Spells\\Human\\ManaFlare\\ManaFlareBase.mdl" //Upgrade effect
endglobals
//Interval
private function Interval takes nothing returns real
return 0.5
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct FingerDread_Data
unit u //Unit caster
integer it2 //Item 2 upgrade
effect e1 //Effect hand 1
effect e2 //Effect hand 2
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private FingerDread_Data array Ar[10]
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local FingerDread_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(not IsUnitDead(sd.u)) then
if(GetUnitAbilityLevel(sd.u, BUFF_ID) <= 0) then
if(sd.it2 > 0) then
call UnitAddAbility(sd.u, ABILITY4_ID)
call UnitRemoveAbility(sd.u, ABILITY4_ID)
else
call UnitAddAbility(sd.u, ABILITY2_ID)
call UnitRemoveAbility(sd.u, ABILITY2_ID)
endif
if(sd.e1 != null) then
call DestroyEffect(sd.e1)
set sd.e1 = null
endif
if(sd.e2 != null) then
call DestroyEffect(sd.e2)
set sd.e2 = null
endif
set sd.u = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local FingerDread_Data sd = FingerDread_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local boolean allowAdd = false
local integer extraLevel = 0
local boolean allowRestore = false
local real extraRestore = 0.0
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_MP_FingerDread
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
set sd.u = caster
set sd.it2 = item2
if(item1 > 0) then
set allowAdd = true
set extraLevel = UPGRADE1_LEVEL1
endif
if(item2 > 0) then
set allowAdd = true
set extraLevel = UPGRADE1_LEVEL2
endif
if(item3 > 0) then
set allowAdd = true
set extraLevel = UPGRADE1_LEVEL3
endif
if(item4 > 0) then
set allowRestore = true
set extraRestore = UPGRADE2_RESTORE_LIFE1
endif
if(item5 > 0) then
set allowRestore = true
set extraRestore = UPGRADE2_RESTORE_LIFE2
call UnitAddAbility(sd.u, ABILITY3_ID)
call UnitRemoveAbility(sd.u, ABILITY3_ID)
else
call UnitAddAbility(sd.u, ABILITY1_ID)
call UnitRemoveAbility(sd.u, ABILITY1_ID)
endif
if(allowAdd) then
call ImmediateCast(owner, casterX, casterY, 0.5, UPGRADE1_CAST, level + extraLevel, "roar", 0)
endif
if(allowRestore) then
call SetUnitState(caster, UNIT_STATE_LIFE, GetUnitState(caster, UNIT_STATE_LIFE) + (GetUnitState(caster, UNIT_STATE_MAX_LIFE) * extraRestore))
endif
if(allowAdd or allowRestore) then
set sd.e1 = AddSpecialEffectTarget(UPGRADE_EFFECT, caster, "hand, left")
set sd.e2 = AddSpecialEffectTarget(UPGRADE_EFFECT, caster, "hand, right")
endif
call SetUnitAnimation(caster, "third")
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
set s = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(FingerDreadTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(FingerDreadTrg, Condition(function Conditions))
call TriggerAddAction(FingerDreadTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY1_ID)
call AbilityPreload(ABILITY2_ID)
call AbilityPreload(ABILITY3_ID)
call AbilityPreload(ABILITY4_ID)
call Preload(UPGRADE_EFFECT)
endfunction
endscope
//TESH.scrollpos=93
//TESH.alwaysfold=0
scope MassImpale initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A06L' //Spell Mass Impale rawcode
private constant integer DUMMY_ID = 'n016' //Dummy Mass Impale rawcode
private constant real EARLY_DISTANCE_MOVE = 300.0 //Early distance move
private constant real DISTANCE_MOVE = 120.0 //Distance move area target
private constant real MINIMUM_DISTANCE_MOVE = 50.0 //Minimum distance move dummy
private constant integer DUMMY_KEY = 0 //Dummy of target key
private constant integer COUNT_KEY = 1 //Count attack target key
private constant real TIMER_END = 5.0 //Timer end
private constant integer ITEM1_UPGRADE1 = 'I000' //Item Sharpend Javelin
private constant integer ITEM1_UPGRADE2 = 'I001' //Item Coral Spire
private constant integer ITEM1_UPGRADE3 = 'I00S' //Item Truepierce Lance
private constant integer ITEM1_UPGRADE4 = 'I002' //Item Amazon Meld
private constant integer ITEM2_UPGRADE1 = 'I00N' //Item Mortise Timbercutter
private constant integer ITEM2_UPGRADE2 = 'mlst' //Item Vehemence
private constant integer ITEM2_UPGRADE3 = 'I00O' //Item Arcanite Reaver
private constant real UPGRADE1_DAMAGE1 = 2 //Upgrade 1 effect 1
private constant real UPGRADE1_DAMAGE2 = 4 //Upgrade 1 effect 2
private constant real UPGRADE1_DAMAGE3 = 6 //Upgrade 1 effect 3
private constant real UPGRADE1_DAMAGE4 = 8 //Upgrade 1 effect 4
private constant integer UPGRADE1_TOTAL_IMPALE2 = 1 //Upgrade 1 effect 2
private constant integer UPGRADE1_TOTAL_IMPALE3 = 2 //Upgrade 1 effect 2
private constant integer UPGRADE1_TOTAL_IMPALE4 = 3 //Upgrade 1 effect 2
private constant real UPGRADE2_RADIUS1 = 40.0 //Upgrade 2 effect 1
private constant real UPGRADE2_RADIUS2 = 80.0 //Upgrade 2 effect 2
private constant real UPGRADE2_RADIUS3 = 120.0 //Upgrade 2 effect 3
private constant integer UPGRADE2_COUNT2 = 1 //Upgrade 2 effect 2
private constant integer UPGRADE2_COUNT3 = 2 //Upgrade 2 effect 3
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_DEATH //Spell attack type
private constant string SPELL_EFFECT = "Abilities\\Spells\\Undead\\Impale\\ImpaleMissTarget.mdl" //Effect dummy
private constant string SPECIAL_EFFECT = "Abilities\\Weapons\\AncientProtectorMissile\\AncientProtectorMissile.mdl" //Effect dummy
endglobals
//Targets total
private function Total_Impale takes integer level returns integer
if(level == 1) then
return 2
elseif(level == 2) then
return 2
elseif(level == 3) then
return 3
elseif(level == 4) then
return 4
else
return 0
endif
endfunction
//Damage
private function Damage takes integer level returns real
if(level == 1) then
return 18.0
elseif(level == 2) then
return 24.0
elseif(level == 3) then
return 28.0
elseif(level == 4) then
return 34.0
else
return 0.0
endif
endfunction
//Radius
private function Radius takes integer level returns real
return 450.0 + (0.0 * level)
endfunction
//Radius damage
private function Radius_Damage takes integer level returns real
return 120.0 + (0.0 * level)
endfunction
//Amount base
private function Amount takes integer level returns integer
return 1 + (0 * level)
endfunction
//Attack count
private function Count takes integer level returns integer
return 3 + (0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct MassImpale_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of spell
group g //Group target
group dg //Group dummy
hashtable ht //Hashtable
real t //Timer
real ed //Early distance
real dm //Distance move
real d //Damage deal
real r //Radius damage
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private MassImpale_Data array Ar[10]
private group all
private group copy
private boolexpr bexpr
private location loc
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local MassImpale_Data sd
local integer i = 0
local unit f = null
local integer fId = 0
local unit dummy = null
local real tX = 0.0
local real tY = 0.0
local real cX = 0.0
local real cY = 0.0
local real face = 0.0
local real rad = 0.0
local real cos = 0.0
local real sin = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local real x = 0.0
local real y = 0.0
local unit g = null
local integer count = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.ed > 0 and FirstOfGroup(sd.g) != null) then
set sd.ed = sd.ed - DISTANCE_MOVE
set copy = CopyGroup(sd.g)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set fId = GetUnitUserData(f)
set dummy = LoadUnitHandle(sd.ht, fId, DUMMY_KEY)
if(IsUnitDead(f)) then
call RemoveUnit(dummy)
call GroupRemoveUnit(sd.dg, dummy)
call FlushChildHashtable(sd.ht, fId)
call GroupRemoveUnit(sd.g, f)
else
set cX = GetUnitX(dummy)
set cY = GetUnitY(dummy)
set face = GetUnitFacing(dummy)
set rad = face * bj_DEGTORAD
set cos = Cos(rad)
set sin = Sin(rad)
set x = cX + sd.dm * cos
set y = cY + sd.dm * sin
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
call SetUnitX(dummy, x)
call SetUnitY(dummy, y)
endif
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, x, y))
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
if(IsUnitEnemy(g, sd.o)) then
if(IsUnitType(g, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, g, sd.d, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, g, sd.d, true, false, A_TYPE, D_TYPE, null)
endif
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, g, "chest"))
endif
endloop
if(sd.dm > MINIMUM_DISTANCE_MOVE) then
set sd.dm = sd.dm - 1
endif
endif
endloop
elseif(sd.t > 0.0 and FirstOfGroup(sd.g) != null) then
set sd.t = sd.t - Interval()
set copy = CopyGroup(sd.g)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set fId = GetUnitUserData(f)
set dummy = LoadUnitHandle(sd.ht, fId, DUMMY_KEY)
set count = LoadInteger(sd.ht, fId, COUNT_KEY)
if(IsUnitDead(f)) then
call RemoveUnit(dummy)
call GroupRemoveUnit(sd.dg, dummy)
call FlushChildHashtable(sd.ht, fId)
call GroupRemoveUnit(sd.g, f)
if(GetUnitTypeId(f) == DUMMY_ID) then
call RemoveUnit(dummy)
endif
else
set tX = GetUnitX(f)
set tY = GetUnitY(f)
set cX = GetUnitX(dummy)
set cY = GetUnitY(dummy)
set face = GetUnitFacing(dummy)
set rad = face * bj_DEGTORAD
set cos = Cos(rad)
set sin = Sin(rad)
set dx = tX - cX
set dy = tY - cY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance > DISTANCE_MOVE) then
call IssuePointOrder(dummy, "move", tX, tY)
set x = cX + sd.dm * cos
set y = cY + sd.dm * sin
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
call SetUnitX(dummy, x)
call SetUnitY(dummy, y)
endif
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, x, y))
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
if(IsUnitEnemy(g, sd.o)) then
if(IsUnitType(g, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, g, sd.d, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, g, sd.d, true, false, A_TYPE, D_TYPE, null)
endif
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, g, "chest"))
endif
endloop
else
if(count > 0) then
set count = count - 1
call SaveInteger(sd.ht, fId, COUNT_KEY, count)
set x = cX + (sd.dm + sd.dm / 2) * cos
set y = cY + (sd.dm + sd.dm / 2) * sin
call SetUnitX(dummy, x)
call SetUnitY(dummy, y)
call IssuePointOrder(dummy, "move", tX, tY)
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, x, y))
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
if(IsUnitEnemy(g, sd.o)) then
if(IsUnitType(g, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, g, sd.d, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, g, sd.d, true, false, A_TYPE, D_TYPE, null)
endif
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, g, "chest"))
endif
endloop
else
call RemoveUnit(dummy)
call GroupRemoveUnit(sd.dg, dummy)
call FlushChildHashtable(sd.ht, fId)
call GroupRemoveUnit(sd.g, f)
if(GetUnitTypeId(f) == DUMMY_ID) then
call RemoveUnit(dummy)
endif
endif
endif
if(sd.dm > MINIMUM_DISTANCE_MOVE) then
set sd.dm = sd.dm - 1
endif
endif
endloop
else
loop
set f = FirstOfGroup(sd.dg)
exitwhen(f == null)
call GroupRemoveUnit(sd.dg, f)
call RemoveUnit(f)
endloop
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
set g = null
set dummy = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local MassImpale_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local real facing = GetUnitFacing(caster)
local player owner = GetOwningPlayer(caster)
local real targetX = 0.0
local real targetY = 0.0
local unit f = null
local integer fId = 0
local unit dummy = null
local integer random = 0
local integer random2 = 0
local boolean isNull = (Ar[Total] == null)
local integer i = 0
local integer count = Count(level)
local integer total = 0
local integer max = 0
local real x = 0.0
local real y = 0.0
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM1_UPGRADE4)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item6 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item7 = IsUnitHasItemType(caster, ITEM2_UPGRADE3)
local real extraDamage = 0.0
local integer extraImpale = 0
local real extraRadius = 0.0
local integer extraCount = 0
if(item1 > 0) then
set extraDamage = extraDamage + (UPGRADE1_DAMAGE1 * item1)
endif
if(item2 > 0) then
set extraDamage = extraDamage + (UPGRADE1_DAMAGE2 * item2)
set extraImpale = extraImpale + (UPGRADE1_TOTAL_IMPALE2 * item2)
endif
if(item3 > 0) then
set extraDamage = extraDamage + (UPGRADE1_DAMAGE3 * item3)
set extraImpale = extraImpale + (UPGRADE1_TOTAL_IMPALE3 * item3)
endif
if(item4 > 0) then
set extraDamage = extraDamage + (UPGRADE1_DAMAGE4 * item4)
set extraImpale = extraImpale + (UPGRADE1_TOTAL_IMPALE4 * item4)
endif
if(item5 > 0) then
set extraRadius = UPGRADE2_RADIUS1
endif
if(item6 > 0) then
set extraRadius = UPGRADE2_RADIUS2
set extraCount = extraCount + (UPGRADE2_COUNT2 * item6)
endif
if(item7 > 0) then
set extraRadius = UPGRADE2_RADIUS2
set extraCount = extraCount + (UPGRADE2_COUNT2 * item6)
endif
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
if(isNull) then
set sd = MassImpale_Data.create()
set sd.g = CreateGroup()
set sd.dg = CreateGroup()
set sd.ht = InitHashtable()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.t = TIMER_END
set sd.ed = EARLY_DISTANCE_MOVE
set sd.dm = DISTANCE_MOVE
set sd.d = Damage(level) + extraDamage // + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.r = Radius_Damage(level) + extraRadius
set i = 0
loop
exitwhen(i >= Amount(level))
set dummy = CreateUnit(owner, DUMMY_ID, targetX, targetY, facing)
call UnitApplyTimedLife(dummy, 'BTLF', TIMER_END)
call GroupAddUnit(sd.g, dummy)
set fId = GetUnitUserData(dummy)
set random = GetRandomInt(-20, 20)
set dummy = CreateUnit(owner, DUMMY_ID, casterX, casterY, facing + random)
call SaveUnitHandle(sd.ht, fId, DUMMY_KEY, dummy)
call SaveInteger(sd.ht, fId, COUNT_KEY, count + extraCount)
set i = i + 1
endloop
set total = 0
set max = Total_Impale(level) + extraImpale
set random2 = 1
call GroupEnumUnitsInRange(all, targetX, targetY, Radius(level), bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o) and (not IsUnitInGroup(f, sd.g)) and total < max) then
call GroupAddUnit(sd.g, f)
set total = total + 1
set fId = GetUnitUserData(f)
set random = GetRandomInt(random2 * 20, random2 * 20)
set dummy = CreateUnit(owner, DUMMY_ID, casterX, casterY, facing + random)
call SaveUnitHandle(sd.ht, fId, DUMMY_KEY, dummy)
call SaveInteger(sd.ht, fId, COUNT_KEY, count + extraCount)
set random2 = random2 * -1
endif
endloop
set copy = CopyGroup(SpawnDeceasedUnit)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == owner) then
set random = GetRandomInt(0, R2I(Radius(level)))
set random2 = GetRandomInt(0, 360)
set x = targetX + random * Cos(random2 * bj_DEGTORAD)
set y = targetY + random * Sin(random2 * bj_DEGTORAD)
//call SetUnitX(f, x)
//call SetUnitY(f, y)
call IssuePointOrder(f, "move", x, y)
endif
endloop
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set owner = null
set dummy = null
set f = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(MassImpaleTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(MassImpaleTrg, Condition(function Conditions))
call TriggerAddAction(MassImpaleTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set copy = CreateGroup()
set bexpr = Condition(function Pick)
set loc = Location(0, 0)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=305
//TESH.alwaysfold=0
scope SpikingCarapace initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A06N' //Spell Spiking Carapace rawcode
private constant real DISTANCE_PULL = 10.0 //Distance pull enemy units
private constant real MIN_DISTANCE = 120.0 //Minimum distance from caster
private constant integer ITEM1_UPGRADE1 = 'I004' //Item Leather Armor
private constant integer ITEM1_UPGRADE2 = 'I005' //Item Plate Mail
private constant integer ITEM1_UPGRADE3 = 'I024' //Item Deathshard
private constant integer ITEM2_UPGRADE1 = 'I01A' //Item Fatal Cleaver
private constant integer ITEM2_UPGRADE2 = 'I01C' //Item Sagaris Carnage
private constant real UPGRADE1_DURATION1 = 3.0 //Upgrade 1 effect 1
private constant real UPGRADE1_DURATION2 = 6.0 //Upgrade 1 effect 2
private constant real UPGRADE1_DURATION3 = 9.0 //Upgrade 1 effect 3
private constant real UPGRADE1_RADIUS3 = 100.0 //Upgrade 1 effect 3
private constant real UPGRADE2_DAMAGE1 = 0.5 //Upgrade 2 effect 1
private constant real UPGRADE2_DAMAGE2 = 1.0 //Upgrade 2 effect 2
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_DEATH //Spell attack type
private constant string LEFT_EFFECT = "Abilities\\Spells\\Undead\\ThornyShield\\ThornyShieldTargetChestLeft.mdl" //Effect spike at left
private constant string RIGHT_EFFECT = "Abilities\\Spells\\Undead\\ThornyShield\\ThornyShieldTargetChestRight.mdl" //Effect spike at right
private constant string LEFT_MOVE_EFFECT = "Abilities\\Spells\\Undead\\ThornyShield\\ThornyShieldTargetChestMountLeft.mdl" //Effect spike at left
private constant string RIGHT_MOVE_EFFECT = "Abilities\\Spells\\Undead\\ThornyShield\\ThornyShieldTargetChestMountRight.mdl" //Effect spike at right
endglobals
//Duration
private function Duration takes integer level returns real
return 15.0 + (0.0 * level)
endfunction
//Radius
private function Radius takes integer level returns real
return 200.0 + (0.0 * level)
endfunction
//Enhance radius
private function Enhance_Radius takes integer level returns real
return 100.0 + (0.0 * level)
endfunction
//Damage
private function Damage takes integer level returns real
if(level == 1) then
return 0.5
elseif(level == 2) then
return 1.0
elseif(level == 3) then
return 2.0
else
return 0.0
endif
endfunction
//Enhance radius
private function Enhance_Damage takes integer level returns real
if(level == 1) then
return 0.5
elseif(level == 2) then
return 1.0
elseif(level == 3) then
return 2.0
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_FLYING) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct SpikingCarapace_Data
unit u //Unit caster
player o //Owner of caster
real d //Duration
real x //X of caster
real y //Y of caster
real p //Distance pull
real r //Radius
real er //Enhance radius
real dd //Damage
real ed //Enhance damage
effect e1 //Effect left spike
effect e2 //Effect right spike
effect e3 //Effect left spike move
effect e4 //Effect right spike move
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private SpikingCarapace_Data array Ar[10]
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local SpikingCarapace_Data sd
local integer i = 0
local real cX = 0.0
local real cY = 0.0
local unit f = null
local real fX = 0.0
local real fY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local real rad = 0.0
local real x = 0.0
local real y = 0.0
local boolean full = false
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.d > 0 and (not IsUnitDead(sd.u))) then
set sd.d = sd.d - Interval()
set cX = GetUnitX(sd.u)
set cY = GetUnitY(sd.u)
if(sd.x != cX or sd.y != cY) then
if(sd.e3 == null) then
set sd.e3 = AddSpecialEffectTarget(LEFT_MOVE_EFFECT, sd.u, "mount,left")
endif
if(sd.e4 == null) then
set sd.e4 = AddSpecialEffectTarget(RIGHT_MOVE_EFFECT, sd.u, "mount,right")
endif
set full = IsUnitInGroup(sd.u, GroundBreakerCaster)
if(not IsUnitInGroup(sd.u, GroundBreaking)) then
call GroupEnumUnitsInRange(all, cX, cY, sd.r + sd.er, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
call UnitDamageTarget(sd.u, f, sd.dd + sd.ed, true, false, A_TYPE, D_TYPE, null)
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = cX - fX
set dy = cY - fY
set distance = SquareRoot(dx * dx + dy * dy)
set rad = Atan2(cY - fY, cX - fX)
if(distance > MIN_DISTANCE) then
if(full) then
set x = fX + (distance - MIN_DISTANCE) * Cos(rad)
set y = fY + (distance - MIN_DISTANCE) * Sin(rad)
else
set x = fX + sd.p * Cos(rad)
set y = fY + sd.p * Sin(rad)
endif
call SetUnitX(f, x)
call SetUnitY(f, y)
endif
endif
endloop
else
call GroupEnumUnitsInRange(all, cX, cY, sd.r + sd.er, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
call DamageCast(sd.o, cX, cY, 1.0, f, sd.dd + sd.ed, true, false, A_TYPE, D_TYPE, null)
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = cX - fX
set dy = cY - fY
set distance = SquareRoot(dx * dx + dy * dy)
set rad = Atan2(cY - fY, cX - fX)
if(distance > MIN_DISTANCE) then
if(full) then
set x = fX + (distance - MIN_DISTANCE) * Cos(rad)
set y = fY + (distance - MIN_DISTANCE) * Sin(rad)
else
set x = fX + sd.p * Cos(rad)
set y = fY + sd.p * Sin(rad)
endif
call SetUnitX(f, x)
call SetUnitY(f, y)
endif
endif
endloop
endif
set sd.x = cX
set sd.y = cY
else
if(sd.e3 != null) then
call DestroyEffect(sd.e3)
set sd.e3 = null
endif
if(sd.e4 != null) then
call DestroyEffect(sd.e4)
set sd.e4 = null
endif
set full = IsUnitInGroup(sd.u, GroundBreakerCaster)
if(not IsUnitInGroup(sd.u, GroundBreaking)) then
call GroupEnumUnitsInRange(all, cX, cY, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = cX - fX
set dy = cY - fY
set distance = SquareRoot(dx * dx + dy * dy)
set rad = Atan2(cY - fY, cX - fX)
if(distance > MIN_DISTANCE) then
if(full) then
set x = fX + (distance - MIN_DISTANCE) * Cos(rad)
set y = fY + (distance - MIN_DISTANCE) * Sin(rad)
else
set x = fX + sd.p * Cos(rad)
set y = fY + sd.p * Sin(rad)
endif
call SetUnitX(f, x)
call SetUnitY(f, y)
endif
endif
endloop
else
call GroupEnumUnitsInRange(all, cX, cY, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
call DamageCast(sd.o, cX, cY, 1.0, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = cX - fX
set dy = cY - fY
set distance = SquareRoot(dx * dx + dy * dy)
set rad = Atan2(cY - fY, cX - fX)
if(distance > MIN_DISTANCE) then
if(full) then
set x = fX + (distance - MIN_DISTANCE) * Cos(rad)
set y = fY + (distance - MIN_DISTANCE) * Sin(rad)
else
set x = fX + sd.p * Cos(rad)
set y = fY + sd.p * Sin(rad)
endif
call SetUnitX(f, x)
call SetUnitY(f, y)
endif
endif
endloop
endif
endif
else
if(sd.e1 != null) then
call DestroyEffect(sd.e1)
set sd.e1 = null
endif
if(sd.e2 != null) then
call DestroyEffect(sd.e2)
set sd.e2 = null
endif
if(sd.e3 != null) then
call DestroyEffect(sd.e3)
set sd.e3 = null
endif
if(sd.e4 != null) then
call DestroyEffect(sd.e4)
set sd.e4 = null
endif
call SetUnitPathing(sd.u, true)
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local SpikingCarapace_Data sd = SpikingCarapace_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
set sd.u = caster
set sd.o = owner
set sd.d = Duration(level)
set sd.x = casterX
set sd.y = casterY
set sd.p = DISTANCE_PULL
set sd.r = Radius(level)
set sd.er = Enhance_Radius(level)
set sd.dd = Damage(level)// + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.ed = Enhance_Damage(level)// + (Enhance_Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.e1 = AddSpecialEffectTarget(LEFT_EFFECT, sd.u, "chest, left")
set sd.e2 = AddSpecialEffectTarget(RIGHT_EFFECT, sd.u, "chest, right")
set sd.e3 = null
set sd.e4 = null
call UnitAddAbility(sd.u, 'Arav')
call UnitRemoveAbility(sd.u, 'Arav')
call SetUnitPathing(sd.u, false)
if(item1 > 0) then
set sd.d = sd.d + (UPGRADE1_DURATION1 * item1)
endif
if(item2 > 0) then
set sd.d = sd.d + (UPGRADE1_DURATION2 * item2)
endif
if(item3 > 0) then
set sd.d = sd.d + (UPGRADE1_DURATION3 * item3)
set sd.er = sd.er + UPGRADE1_RADIUS3
endif
if(item4 > 0) then
set sd.dd = sd.dd + (UPGRADE2_DAMAGE1 * item4)
endif
if(item5 > 0) then
set sd.dd = sd.dd + (UPGRADE2_DAMAGE2 * item5)
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(SpikingCarapaceTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(SpikingCarapaceTrg, Condition(function Conditions))
call TriggerAddAction(SpikingCarapaceTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(LEFT_EFFECT)
call Preload(RIGHT_EFFECT)
call Preload(LEFT_MOVE_EFFECT)
call Preload(RIGHT_MOVE_EFFECT)
endfunction
endscope
//TESH.scrollpos=428
//TESH.alwaysfold=0
globals
group SpawnDeceasedUnit = CreateGroup()
endglobals
scope SpawnDeceased initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A06R' //Spell SpawnDeceased rawcode
private constant integer CAST_ID = 'A05G' //Cast Stun rawcode
private constant real RADIUS_DETECT_HERO = 900.0 //Radius detect hero
private constant integer ITEM1_UPGRADE1 = 'I00P' //Item Razorpoint Blade
private constant integer ITEM1_UPGRADE2 = 'I00Q' //Item Edge of Blaze
private constant integer ITEM1_UPGRADE3 = 'frgd' //Item Heaven Rapier
private constant integer ITEM2_UPGRADE1 = 'I00Y' //Item Blight River
private constant integer ITEM2_UPGRADE2 = 'rugt' //Item Aphotical Scythe
private constant integer UPGRADE1_ABILITY_ID = 'A0BI' //Upgrade 1 ability
private constant integer UPGRADE2_TOTAL1 = 1 //Upgrade 1 effect 1
private constant integer UPGRADE2_TOTAL2 = 2 //Upgrade 1 effect 2
private constant string SPELL_EFFECT = "Abilities\\Spells\\Undead\\Impale\\ImpaleHitTarget.mdl" //Effect dummy
endglobals
//Total spawn beetle
private function Total_Unit takes integer level returns integer
if(level == 1) then
return 5
elseif(level == 2) then
return 7
elseif(level == 3) then
return 10
else
return 0
endif
endfunction
//Summon types
private function Summon_Type takes integer level returns integer
if(level == 1) then
return 'ucs1'
elseif(level == 2) then
return 'ucs2'
elseif(level == 3) then
return 'ucs3'
else
return 0
endif
endfunction
//Duration
private function Duration takes integer level returns real
return 4.0 - (1.0 * level)
endfunction
//Check summon types
private function Check_Summon_Type takes integer unit_type returns boolean
if(unit_type == 'ucs1') then
return true
elseif(unit_type == 'ucs2') then
return true
elseif(unit_type == 'ucs3') then
return true
else
return false
endif
endfunction
//Check summon types
private function Check_Summon_Burrow_Type takes integer unit_type returns boolean
if(unit_type == 'ucsB') then
return true
elseif(unit_type == 'ucsC') then
return true
elseif(unit_type == 'ucrm') then
return true
else
return false
endif
endfunction
//Check level by summon type
private function Level_Summon_Burrow_Type takes integer unit_type returns integer
if(unit_type == 'ucsB') then
return 2
elseif(unit_type == 'ucsC') then
return 3
elseif(unit_type == 'ucrm') then
return 1
else
return 0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_HERO) == true) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 1.0
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct SpawnDeceased_Data
unit u //Unit caster
real d //Real duration
endstruct
//----------------------------------------------------------------
struct Spawner_Data
unit u //Unit caster
group g //Group spawn
integer c //Current spawn
integer t //Total spawn
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private SpawnDeceased_Data array Ar[20]
private integer Total2
private Spawner_Data array Ar2[10]
private group all
private boolexpr bexpr
private group copy
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Time_Actions takes nothing returns nothing
local unit f = null
local real fX = 0.0
local real fY = 0.0
local real radius = 0.0
local boolean exist = false
local unit target = null
set copy = CopyGroup(SpawnDeceasedUnit)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set radius = RADIUS_DETECT_HERO
set exist = false
set target = null
call GroupEnumUnitsInRange(all, fX, fY, radius, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(not exist) then
set target = f
set exist = true
endif
endloop
if(exist) then
call IssueTargetOrder(f, "attack", target)
endif
endloop
set target = null
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local SpawnDeceased_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.d > 0 and (not IsUnitDead(sd.u))) then
set sd.d = sd.d - Interval()
call SetUnitAnimation(sd.u, "attack")
else
call PauseUnit(sd.u, false)
if(not IsUnitDead(sd.u)) then
call IssueImmediateOrder(sd.u, "burrow")
endif
set sd.u = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local SpawnDeceased_Data sd
local unit killer = GetKillingUnit()
local integer killerType = GetUnitTypeId( killer)
local player owner = GetOwningPlayer(killer)
local unit hero = GetHero(owner)
local integer level = GetUnitAbilityLevel(killer, SPELL_ID)
local unit dying = GetTriggerUnit()
local real dyingX = GetUnitX(dying)
local real dyingY = GetUnitY(dying)
local real face = GetUnitFacing(dying)
local Spawner_Data pd
local integer i = 0
local unit dummy = null
local integer item1 = IsUnitHasItemType(hero, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(hero, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(hero, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(hero, ITEM2_UPGRADE1)
local integer item5 = IsUnitHasItemType(hero, ITEM2_UPGRADE2)
local integer extraTotal = 0
set i = 0
loop
exitwhen(i >= Total2)
set pd = Ar2[i]
if(item4 > 0) then
set extraTotal = extraTotal + (UPGRADE2_TOTAL1 * item4)
endif
if(item5 > 0) then
set extraTotal = extraTotal + (UPGRADE2_TOTAL2 * item5)
endif
if(killer == pd.u and pd.c < pd.t + extraTotal) then
set pd.c = pd.c + 1
set dummy = CreateUnit(owner, Summon_Type(level), dyingX, dyingY, face)
call PauseUnit(dummy, true)
call SetUnitAnimation(dummy, "birth")
call GroupAddUnit(pd.g, dummy)
call GroupAddUnit(SpawnDeceasedUnit, dummy)
if(item1 > 0) then
call UnitAddAbility(dummy, UPGRADE1_ABILITY_ID)
call SetUnitAbilityLevel(dummy, UPGRADE1_ABILITY_ID, 1)
endif
if(item2 > 0) then
call UnitAddAbility(dummy, UPGRADE1_ABILITY_ID)
call SetUnitAbilityLevel(dummy, UPGRADE1_ABILITY_ID, 2)
endif
if(item3 > 0) then
call UnitAddAbility(dummy, UPGRADE1_ABILITY_ID)
call SetUnitAbilityLevel(dummy, UPGRADE1_ABILITY_ID, 3)
call UnitAddAbility(dummy, SPELL_ID)
call SetUnitAbilityLevel(dummy, SPELL_ID, level)
endif
set sd = SpawnDeceased_Data.create()
set sd.u = dummy
set sd.d = Duration(level)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
set i = i + 1
endloop
set killer = null
set owner = null
set dying = null
set dummy = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit killer = GetKillingUnit()
local unit dying = GetDyingUnit()
local boolean okey = GetUnitAbilityLevel(killer, SPELL_ID) > 0 and /*
*/(IsUnitType(dying, UNIT_TYPE_STRUCTURE) == false) and /*
*/(IsUnitType(dying, UNIT_TYPE_ANCIENT) == false) and /*
*/(IsUnitType(dying, UNIT_TYPE_MECHANICAL) == false)
set killer = null
set dying = null
return okey
endfunction
//----------------------------------------------------------------
private function Attack_Actions takes nothing returns nothing
local unit attacker = GetAttacker()
local integer attackerType = GetUnitTypeId(attacker)
local real attackerX = GetUnitX(attacker)
local real attackerY = GetUnitY(attacker)
local integer level = Level_Summon_Burrow_Type(attackerType)
local unit attacked = GetTriggerUnit()
call TargetCast(GetOwningPlayer(attacker), attackerX, attackerY, 0.5, CAST_ID, level, "thunderbolt", 0, attacked)
call SetUnitAnimation(attacker, "stand, alternate")
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, attackerX, attackerY))
if(IsUnitType(attacked, UNIT_TYPE_HERO)) then
call UnitApplyTimedLife(attacker, 'Brai', 1.0)
endif
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Attack_Conditions takes nothing returns boolean
return (Check_Summon_Type(GetUnitTypeId(GetAttacker())) or Check_Summon_Burrow_Type(GetUnitTypeId(GetAttacker())))
endfunction
//----------------------------------------------------------------
private function Kill_Actions takes nothing returns nothing
local unit killed = GetTriggerUnit()
local Spawner_Data pd
local integer i = 0
set i = 0
loop
exitwhen(i >= Total2)
set pd = Ar2[i]
if(IsUnitInGroup(killed, pd.g)) then
call GroupRemoveUnit(pd.g, killed)
set pd.c = pd.c - 1
endif
set i = i + 1
endloop
call GroupRemoveUnit(SpawnDeceasedUnit, killed)
call RemoveUnit(killed)
set killed = null
endfunction
//----------------------------------------------------------------
private function Kill_Conditions takes nothing returns boolean
local unit dying = GetDyingUnit()
local boolean okey = Check_Summon_Type(GetUnitTypeId(dying)) or Check_Summon_Burrow_Type(GetUnitTypeId(dying))
set dying = null
return okey
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local Spawner_Data pd
local unit learner = GetLearningUnit()
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
local integer i = 0
local boolean exist = false
if(GetUnitAbilityLevel(learner, SPELL_ID) <= 1) then
set i = 0
loop
exitwhen(i >= Total2)
set pd = Ar2[i]
if(pd.u == learner) then
set exist = true
set pd.t = Total_Unit(level)
endif
set i = i + 1
endloop
if(not exist) then
set pd = Spawner_Data.create()
set pd.u = learner
set pd.g = CreateGroup()
set pd.c = 0
set pd.t = Total_Unit(level)
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = pd
endif
else
set i = 0
loop
exitwhen(i >= Total2)
set pd = Ar2[i]
if(pd.u == learner) then
set pd.t = Total_Unit(level)
endif
set i = i + 1
endloop
endif
set learner = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
local unit learner = GetTriggerUnit()
local boolean okey = GetLearnedSkill() == SPELL_ID and (not IsUnitIllusion(learner))
set learner = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(SpawnDeceasedTrg, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(SpawnDeceasedTrg, Condition(function Conditions))
call TriggerAddAction(SpawnDeceasedTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(SpawnDeceasedAttackTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(SpawnDeceasedAttackTrg, Condition(function Attack_Conditions))
call TriggerAddAction(SpawnDeceasedAttackTrg, function Attack_Actions)
call TriggerRegisterAnyUnitEventBJ(SpawnDeceasedKillTrg, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(SpawnDeceasedKillTrg, Condition(function Kill_Conditions))
call TriggerAddAction(SpawnDeceasedKillTrg, function Kill_Actions)
call TriggerRegisterAnyUnitEventBJ(SpawnDeceasedLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(SpawnDeceasedLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(SpawnDeceasedLearnTrg, function Learn_Actions)
call TriggerRegisterTimerEventPeriodic(SpawnDeceasedTimeTrg, 1.0)
call TriggerAddAction(SpawnDeceasedTimeTrg, function Time_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set Total2 = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
set copy = CreateGroup()
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=99
//TESH.alwaysfold=0
scope Locusts initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A06Q' //Spell Locusts Attack rawcode
private constant integer ABILITY_ID = 'A06R' //Ability Infestation rawcode
private constant real MAX_HEIGHT = 150.0 //Max height reachable
private constant real SPAWN_INTERVAL = 0.0 //Spawning interval
private constant integer DUMMY1_ID = 'n017' //Dummy locust rawcode
private constant integer DUMMY2_ID = 'u002' //Dummy locust rawcode
private constant integer DUMMY3_ID = 'u003' //Dummy locust rawcode
private constant integer LOCUST_AMOUNT_KEY = 0 //Locust amount key for target
private constant integer TARGET_KEY = 0 //Dummy unit key
private constant integer MODE_KEY = 1 //Mode attack or return key
private constant integer AMOUNT_KEY = 2 //Amount return key
private constant integer HOLD_KEY = 3 //Hold position key
private constant integer ATTACK_MODE = 0 //Attack mode
private constant integer RETURN_MODE = 1 //Return mode
private constant integer ITEM1_UPGRADE1 = 'I022' //Item Meridian Stark
private constant integer ITEM1_UPGRADE2 = 'I007' //Item Macabre Crowfort
private constant integer ITEM2_UPGRADE1 = 'I0)C' //Item Amulet of Dexterity
private constant integer ITEM2_UPGRADE2 = 'evtl' //Item Talisman of Evasion
private constant integer ITEM2_UPGRADE3 = 'I01K' //Item Void Artifice
private constant integer ITEM2_UPGRADE4 = 'clfm' //Item Diamond Escutcheon
private constant real UPGRADE1_DURATION1 = 5.0 //Upgrade 1 effect 1
private constant real UPGRADE1_DURATION2 = 10.0 //Upgrade 1 effect 2
private constant real UPGRADE1_DISTANCE_MOVE2 = 40.0 //Upgrade 1 effect 2
private constant integer UPGRADE2_TOTAL_LOCUST1 = 3 //Upgrade 2 effect 1
private constant integer UPGRADE2_TOTAL_LOCUST2 = 6 //Upgrade 2 effect 2
private constant integer UPGRADE2_TOTAL_LOCUST3 = 9 //Upgrade 2 effect 3
private constant integer UPGRADE2_TOTAL_LOCUST4 = 12 //Upgrade 2 effect 4
private constant integer UPGRADE2_LOCUST_AMOUNT2 = 1 //Upgrade 2 effect 2
private constant integer UPGRADE2_LOCUST_AMOUNT3 = 2 //Upgrade 2 effect 3
private constant integer UPGRADE2_LOCUST_AMOUNT4 = 3 //Upgrade 2 effect 4
private constant damagetype D_TYPE = DAMAGE_TYPE_DEATH //Spell attack type
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
endglobals
//Total locust
private function Total_Locust takes integer level returns integer
if(level == 1) then
return 12
elseif(level == 2) then
return 15
elseif(level == 3) then
return 18
else
return 0
endif
endfunction
//Number of locust per target
private function Locust_Amount takes integer level returns integer
if(level == 1) then
return 3
elseif(level == 2) then
return 3
elseif(level == 3) then
return 3
else
return 0
endif
endfunction
//Distance move
private function Distance_Move takes integer level returns real
return 40.0 + (0.0 * level)
endfunction
//Height move
private function Height_Move takes integer level returns real
return 30.0 + (0.0 * level)
endfunction
//Duration
private function Duration takes integer level returns real
return 20.0 + (0.0 * level)
endfunction
//Radius attack
private function Radius takes integer level returns real
return 500.0 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct LocustsAttack_Data
unit u //Unit caster
player o //Owner of caster
group t //Group target
group g //Dummy locust
hashtable ht //Hashtable
integer tp //Dummy type
real d //Distance
real dm //Distance move
real cos //Cos of caster to target
real sin //Sin of caster to target
real h //Height
real hm //Height move
boolean f //Finish
integer cl //Current locust
integer tl //Total locust
integer la //Locust amount max per unit
real dr //Duration
real i //Interval
real im //Interval max
real r //Radius
integer in //Level infestation
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private LocustsAttack_Data array Ar[10]
private group all
private group copy
private boolexpr bexpr
private location loc
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local LocustsAttack_Data sd
local integer i = 0
local real x = 0.0
local real y = 0.0
local unit dummy = null
local integer dummyId = 0
local unit f = null
local integer fId = 0
local real fX = 0.0
local real fY = 0.0
local integer mode = 0
local real cX = 0.0
local real cY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local real amount = 0.0
local real hold = 0.0
local integer j = 0
local integer locustAmount = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(IsUnitDead(sd.u)) then
set sd.d = 0
set sd.h = 0
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
call KillUnit(f)
endloop
endif
if(sd.d > 0) then
set sd.d = sd.d - sd.dm
set x = GetUnitX(sd.u) + sd.dm * sd.cos
set y = GetUnitY(sd.u) + sd.dm * sd.sin
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0)) and (not IsBarrel(sd.u, x, y, 100.0))) then
call SetUnitX(sd.u, x)
call SetUnitY(sd.u, y)
endif
if(sd.h < MAX_HEIGHT) then
set sd.h = sd.h + sd.hm
call SetUnitFlyHeight(sd.u, sd.h, 0.0)
else
call SetUnitFlyHeight(sd.u, MAX_HEIGHT, 0.0)
endif
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o) and sd.cl < sd.tl) then
if(not IsUnitInGroup(f, sd.t)) then
set sd.cl = sd.cl + 1
call GroupAddUnit(sd.t, f)
set fId = GetUnitUserData(f)
set dummy = CreateUnit(sd.o, sd.tp, x, y, 0.0)
set dummyId = GetUnitUserData(dummy)
call UnitApplyTimedLife(dummy, 'BTLF', sd.dr)
call SetUnitTimeScale(dummy, 0.5)
call UnitAddAbility(dummy, 'Arav')
call UnitRemoveAbility(dummy, 'Arav')
call SetUnitPathing(dummy, false)
call IssueTargetOrder(dummy, "attack", f)
call GroupAddUnit(sd.g, dummy)
if(sd.in > 0) then
call UnitAddAbility(dummy, ABILITY_ID)
call SetUnitAbilityLevel(dummy, ABILITY_ID, sd.in)
endif
call SaveInteger(sd.ht, fId, LOCUST_AMOUNT_KEY, 1)
call SaveUnitHandle(sd.ht, fId, 1, dummy)
call SaveUnitHandle(sd.ht, dummyId, TARGET_KEY, f)
call SaveInteger(sd.ht, dummyId, MODE_KEY, ATTACK_MODE)
call SaveReal(sd.ht, dummyId, AMOUNT_KEY, 0.0)
call SaveReal(sd.ht, dummyId, HOLD_KEY, 0.0)
endif
endif
endloop
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o) and sd.cl < sd.tl) then
if(IsUnitInGroup(f, sd.t)) then
set fId = GetUnitUserData(f)
set locustAmount = LoadInteger(sd.ht, fId, LOCUST_AMOUNT_KEY)
if(locustAmount < sd.la) then
set sd.cl = sd.cl + 1
set dummy = CreateUnit(sd.o, sd.tp, x, y, 0.0)
set dummyId = GetUnitUserData(dummy)
call UnitApplyTimedLife(dummy, 'BTLF', sd.dr)
call SetUnitTimeScale(dummy, 0.5)
call UnitAddAbility(dummy, 'Arav')
call UnitRemoveAbility(dummy, 'Arav')
call SetUnitPathing(dummy, false)
call IssueTargetOrder(dummy, "smart", sd.u)
call GroupAddUnit(sd.g, dummy)
if(sd.in > 0) then
call UnitAddAbility(dummy, ABILITY_ID)
call SetUnitAbilityLevel(dummy, ABILITY_ID, sd.in)
endif
call SaveInteger(sd.ht, fId, LOCUST_AMOUNT_KEY, locustAmount + 1)
call SaveUnitHandle(sd.ht, fId, locustAmount + 1, dummy)
call SaveUnitHandle(sd.ht, dummyId, TARGET_KEY, f)
call SaveInteger(sd.ht, dummyId, MODE_KEY, ATTACK_MODE)
call SaveReal(sd.ht, dummyId, AMOUNT_KEY, 0.0)
call SaveReal(sd.ht, dummyId, HOLD_KEY, GetRandomReal(0.0, 1.0))
endif
endif
endif
endloop
elseif(sd.h > 0.0) then
set sd.h = sd.h - sd.hm
call SetUnitFlyHeight(sd.u, sd.h, 0.0)
set x = GetUnitX(sd.u) + sd.dm * sd.cos
set y = GetUnitY(sd.u) + sd.dm * sd.sin
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0)) and (not IsBarrel(sd.u, x, y, 100.0))) then
call SetUnitX(sd.u, x)
call SetUnitY(sd.u, y)
endif
elseif(not sd.f) then
set sd.f = true
call SetUnitFlyHeight(sd.u, 0.0, 0.0)
call PauseUnit(sd.u, false)
call UnitRemoveAbility(sd.u, 'Arav')
call SetUnitAnimation(sd.u, "stand, alternate")
call Pather(sd.u, 2.0)
elseif(FirstOfGroup(sd.g) != null) then
set cX = GetUnitX(sd.u)
set cY = GetUnitY(sd.u)
set copy = CopyGroup(sd.g)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set fId = GetUnitUserData(f)
if(IsUnitDead(f)) then
call GroupRemoveUnit(sd.g, f)
call FlushChildHashtable(sd.ht, fId)
else
set dummy = LoadUnitHandle(sd.ht, fId, TARGET_KEY)
set mode = LoadInteger(sd.ht, fId, MODE_KEY)
set hold = LoadInteger(sd.ht, fId, HOLD_KEY)
if(hold > 0.0) then
set hold = hold - Interval()
call SaveReal(sd.ht, fId, HOLD_KEY, hold)
else
if(mode == ATTACK_MODE) then
call IssueTargetOrder(f, "attack", dummy)
else
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = cX - fX
set dy = cY - fY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance < 100.0) then
set amount = LoadReal(sd.ht, fId, AMOUNT_KEY)
if(IsUnitType(sd.u, UNIT_TYPE_ETHEREAL)) then
call SetUnitState(sd.u, UNIT_STATE_LIFE, GetUnitState(sd.u, UNIT_STATE_LIFE) + amount * ETHEREAL_BONUS)
else
call SetUnitState(sd.u, UNIT_STATE_LIFE, GetUnitState(sd.u, UNIT_STATE_LIFE) + amount)
endif
call SaveInteger(sd.ht, fId, MODE_KEY, ATTACK_MODE)
call SaveReal(sd.ht, fId, AMOUNT_KEY, 0.0)
else
call IssuePointOrder(f, "move", cX, cY)
endif
endif
endif
endif
endloop
set copy = CopyGroup(sd.t)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(IsUnitDead(f)) then
set fId = GetUnitUserData(f)
call GroupRemoveUnit(sd.t, f)
set locustAmount = LoadInteger(sd.ht, fId, LOCUST_AMOUNT_KEY)
set j = 0
loop
exitwhen(j >= locustAmount)
set dummy = LoadUnitHandle(sd.ht, fId, j+1)
if(dummy != null) then
call KillUnit(dummy)
set amount = LoadReal(sd.ht, GetUnitUserData(dummy), AMOUNT_KEY)
if(IsUnitType(sd.u, UNIT_TYPE_ETHEREAL)) then
call SetUnitState(sd.u, UNIT_STATE_LIFE, GetUnitState(sd.u, UNIT_STATE_LIFE) + amount * ETHEREAL_BONUS)
else
call SetUnitState(sd.u, UNIT_STATE_LIFE, GetUnitState(sd.u, UNIT_STATE_LIFE) + amount)
endif
endif
set j = j + 1
endloop
call FlushChildHashtable(sd.ht, fId)
endif
endloop
else
call AddUnitAnimationProperties(sd.u, "alternate", false)
loop
set f = FirstOfGroup(sd.t)
exitwhen(f == null)
call GroupRemoveUnit(sd.t, f)
endloop
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
call KillUnit(f)
endloop
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set dummy = null
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local LocustsAttack_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
local real targetX = 0.0
local real targetY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local real rad = 0.0
local boolean isNull = (Ar[Total] == null)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE3)
local integer item6 = IsUnitHasItemType(caster, ITEM2_UPGRADE4)
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
set dx = casterX - targetX
set dy = casterY - targetY
set distance = SquareRoot(dx * dx + dy * dy)
set rad = Atan2(targetY - casterY, targetX - casterX)
if(isNull) then
set sd = LocustsAttack_Data.create()
set sd.t = CreateGroup()
set sd.g = CreateGroup()
set sd.ht = InitHashtable()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.o = owner
if(level == 1) then
set sd.tp = DUMMY1_ID
elseif(level == 2) then
set sd.tp = DUMMY2_ID
elseif(level == 3) then
set sd.tp = DUMMY3_ID
else
set sd.tp = DUMMY1_ID
endif
set sd.d = distance
set sd.dm = Distance_Move(level)
set sd.cos = Cos(rad)
set sd.sin = Sin(rad)
set sd.h = 0.0
set sd.hm = Height_Move(level)
set sd.f = false
set sd.cl = 0
set sd.tl = Total_Locust(level)
set sd.la = Locust_Amount(level)
set sd.dr = Duration(level)
set sd.i = 0.0
set sd.im = SPAWN_INTERVAL
set sd.r = Radius(level)
set sd.in = GetUnitAbilityLevel(caster, ABILITY_ID)
call PauseUnit(sd.u, true)
call UnitAddAbility(sd.u, 'Arav')
call AddUnitAnimationProperties(sd.u, "alternate", true)
call SetUnitAnimationByIndex(sd.u, 6)
if(item1 > 0) then
set sd.d = sd.d + (UPGRADE1_DURATION1 * item1)
endif
if(item2 > 0) then
set sd.d = sd.d + (UPGRADE1_DURATION2 * item2)
set sd.dm = sd.dm + UPGRADE1_DISTANCE_MOVE2
endif
if(item3 > 0) then
set sd.tl = sd.tl + (UPGRADE2_TOTAL_LOCUST1 * item3)
endif
if(item4 > 0) then
set sd.tl = sd.tl + (UPGRADE2_TOTAL_LOCUST2 * item4)
set sd.la = sd.la + (UPGRADE2_LOCUST_AMOUNT2 * item4)
endif
if(item5 > 0) then
set sd.tl = sd.tl + (UPGRADE2_TOTAL_LOCUST3 * item5)
set sd.la = sd.la + (UPGRADE2_LOCUST_AMOUNT3 * item5)
endif
if(item6 > 0) then
set sd.tl = sd.tl + (UPGRADE2_TOTAL_LOCUST4 * item6)
set sd.la = sd.la + (UPGRADE2_LOCUST_AMOUNT4 * item6)
endif
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
function LocustsAttack_onDamage takes unit attacker, unit attacked, real amount returns nothing
local integer attackerId = GetUnitUserData(attacker)
local player owner = GetOwningPlayer(attacker)
local LocustsAttack_Data sd
local integer i = 0
local integer mode = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(IsUnitInGroup(attacker, sd.g)) then
set mode = LoadInteger(sd.ht, attackerId, MODE_KEY)
if(mode == ATTACK_MODE) then
call SaveInteger(sd.ht, attackerId, MODE_KEY, RETURN_MODE)
call SaveReal(sd.ht, attackerId, AMOUNT_KEY, amount)
endif
endif
set i = i + 1
endloop
set attacker = null
set attacked = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(LocustsAttackTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(LocustsAttackTrg, Condition(function Conditions))
call TriggerAddAction(LocustsAttackTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set copy = CreateGroup()
set bexpr = Condition(function Pick)
set loc = Location(0, 0)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY_ID)
endfunction
endscope
//TESH.scrollpos=397
//TESH.alwaysfold=0
globals
group GroundBreakerCaster = CreateGroup()
group GroundBreaking = CreateGroup()
endglobals
scope GroundBreaker initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A06O' //Spell Ground Breaker rawcode
private constant integer CAST_ID = 'A06P' //Spell Ground Breaker (Dummy) rawcode
private constant integer BUFF_ID = 'B021' //Buff Impale (Silence) rawcode
private constant real MORPH_TIME = 1.0 //Morph time
private constant real MORPH_MOVE = 5.0 //Morph move time
private constant real RADIUS_HIT_TREE = 150.0 //Radius that kill trees
private constant integer EFFECT_INTERVAL = 2 //Interval between effects
private constant real KNOCKBACK_DURATION = 0.4 //Duration knock
private constant real HEIGHT_ATTACK = 500.0 //Height increase per hit
private constant real HEIGHT_MOVE = 100.0 //Height increase per hit
private constant real HEIGHT_CHANGE = 10.0 //Height increase per hit
private constant integer ITEM1_UPGRADE1 = 'I01O' //Item Bloodeye Lynch
private constant integer ITEM1_UPGRADE2 = 'I01S' //Item Havocrave Dissever
private constant integer ITEM2_UPGRADE1 = 'I002' //Item Warmarcher
private constant integer ITEM2_UPGRADE2 = 'I019' //Item Skypath Strider
private constant integer UPGRADE1_ATTACK_COUNT1 = 1 //Upgrade 1 effect 1
private constant integer UPGRADE1_ATTACK_COUNT2 = 2 //Upgrade 1 effect 1
private constant real UPGRADE2_MULTIPLY1 = 1.0 //Upgrade 2 multiply increase
private constant real UPGRADE2_MULTIPLY2 = 2.0 //Upgrade 2 multiply increase
private constant real UPGRADE2_DURATION2 = 30.0 //Upgrade 2 duration increase
private constant attacktype A_TYPE = ATTACK_TYPE_CHAOS //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_UNIVERSAL //Spell damage type
private constant string SPELL_EFFECT = "Abilities\\Weapons\\AncientProtectorMissile\\AncientProtectorMissile.mdl" //Effect dummy
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Undead\\Cripple\\CrippleTarget.mdl" //Effect dummy
private constant string UPGRADE_EFFECT = "abilities\\weapons\\catapult\\catapultmissile.mdl" //Effect upgrade
endglobals
//Move per interval
private function Move takes integer level returns real
return 10.0 + (0.0 * level)
endfunction
//Move increase per interval
private function Move_Increase takes integer level returns real
return 1.0 + (0.0 * level)
endfunction
//Duration to attack
private function Delay takes integer level returns real
return 0.0 + (0.5 * level)
endfunction
//Radius effect
private function Radius takes integer level returns real
return 500.0 + (0 * level)
endfunction
//Duration for attack
private function Duration takes integer level returns real
return 3.0 + (0.0 * level)
endfunction
//Multiply damage
private function Multiply takes integer level returns real
if(level == 1) then
return 2.0
elseif(level == 2) then
return 3.0
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_FLYING) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct GroundBreaker_Data
unit u //Unit caster
player o //Owner of caster
integer l //Spell level
unit t //Unit target
real x //Target x
real y //Target y
integer p //Phase
real m //Move per interval
real mi //Move increase
real i //Interval
real im //Interval max
integer hc //Hit count
integer hm //Hit max
real mul //Multiply damage
real d //Damage
real r //Radius
real du //Duration
boolean up //Upgrade
effect e //Effect
endstruct
//----------------------------------------------------------------
struct GroundBreakerHit_Data
unit u //Unit caster
player o //Owner of caster
unit t //Unit target
boolean p //Up or down
real h //Height
real hm //Height move
real hmc //Height move change
real m //Multipler
real d //Damage
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private GroundBreaker_Data array Ar[10]
private integer Total
private timer Tim2
private GroundBreakerHit_Data array Ar2[20]
private integer Total2
private group all
private boolexpr bexpr
private location loc
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute2 takes nothing returns nothing
local GroundBreakerHit_Data sd
local integer i = 0
loop
exitwhen(i >= Total2)
set sd = Ar2[i]
if(IsUnitDead(sd.t)) then
call UnitRemoveAbility(sd.t, 'Arav')
call SetUnitFlyHeight(sd.t, GetUnitDefaultFlyHeight(sd.t), 0.0)
call PauseUnit(sd.t, false)
set sd.u = null
set sd.o = null
set sd.t = null
set Ar2[i] = Ar2[Total2 - 1]
set Total2 = Total2 - 1
call sd.destroy()
set i = i - 1
else
if(sd.p) then
if(sd.h > 0.0) then
set sd.h = sd.h - sd.hm
if(sd.hm - sd.hmc > 0.0) then
set sd.hm = sd.hm - sd.hmc
endif
call SetUnitFlyHeight(sd.t, GetUnitFlyHeight(sd.t) + sd.hm, 0.0)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.t, "origin"))
else
set sd.h = HEIGHT_ATTACK
set sd.hm = HEIGHT_MOVE
set sd.p = false
endif
else
if(sd.h > 0.0) then
set sd.h = sd.h - sd.hm
if(sd.hm - sd.hmc > 0.0) then
set sd.hm = sd.hm - sd.hmc
endif
call SetUnitFlyHeight(sd.t, GetUnitFlyHeight(sd.t) - sd.hm, 0.0)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.t, "origin"))
else
call UnitDamageTarget(sd.u, sd.t, sd.d * sd.m, true, false, A_TYPE, D_TYPE, null)
call SetUnitFlyHeight(sd.t, GetUnitDefaultFlyHeight(sd.t), 0.0)
call UnitRemoveAbility(sd.t, 'Arav')
call PauseUnit(sd.t, false)
set sd.u = null
set sd.o = null
set sd.t = null
set Ar2[i] = Ar2[Total2 - 1]
set Total2 = Total2 - 1
call sd.destroy()
set i = i - 1
endif
endif
endif
set i = i + 1
endloop
if Total2 == 0 then
call PauseTimer(Tim2)
endif
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local GroundBreaker_Data sd
local integer i = 0
local real cX = 0.0
local real cY = 0.0
local real tX = 0.0
local real tY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local real rad = 0.0
local real x = 0.0
local real y = 0.0
local unit f = null
local real fAngle = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.p != 4 and IsUnitDead(sd.u)) then
call PauseUnit(sd.u, false)
if(sd.t != null) then
call PauseUnit(sd.t, false)
endif
if(IsUnitInGroup(sd.u, GroundBreaking)) then
call GroupRemoveUnit(GroundBreaking, sd.u)
endif
if(IsUnitInGroup(sd.u, GroundBreakerCaster)) then
call GroupRemoveUnit(GroundBreakerCaster, sd.u)
endif
call DestroyEffect(sd.e)
set sd.e = null
set sd.u = null
set sd.o = null
set sd.t = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
if(sd.p == 0) then
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
set rad = GetUnitFacing(sd.u) * bj_DEGTORAD
set x = GetUnitX(sd.u) + MORPH_MOVE * Cos(rad)
set y = GetUnitY(sd.u) + MORPH_MOVE * Sin(rad)
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0)) and (not IsBarrel(sd.u, x, y, 100.0))) then
call SetUnitX(sd.u, x)
call SetUnitY(sd.u, y)
else
set sd.i = 0.0
endif
else
set sd.p = 1
endif
elseif(sd.p == 1) then
set cX = GetUnitX(sd.u)
set cY = GetUnitY(sd.u)
if(sd.t != null) then
set tX = GetUnitX(sd.t)
set tY = GetUnitY(sd.t)
else
set tX = sd.x
set tY = sd.y
endif
set dx = cX - tX
set dy = cY - tY
set distance = SquareRoot(dx * dx + dy * dy)
set rad = Atan2(tY - cY, tX - cX)
if(distance > 100.0) then
set x = GetUnitX(sd.u) + sd.m * Cos(rad)
set y = GetUnitY(sd.u) + sd.m * Sin(rad)
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0)) and (not IsBarrel(sd.u, x, y, 100.0))) then
call SetUnitX(sd.u, x)
call SetUnitY(sd.u, y)
else
set sd.i = MORPH_TIME
set sd.m = Move(sd.l)
call GroupRemoveUnit(GroundBreakerCaster, sd.u)
call SetUnitAnimation(sd.u, "defend")
call PauseUnit(sd.t, true)
set sd.p = 2
endif
call SetUnitFacing(sd.u, rad * bj_RADTODEG)
if(sd.up) then
call DestroyEffect(AddSpecialEffect(UPGRADE_EFFECT, x, y))
else
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, x, y))
endif
set sd.m = sd.m + sd.mi
else
set sd.i = MORPH_TIME
set sd.m = Move(sd.l)
call GroupRemoveUnit(GroundBreakerCaster, sd.u)
call SetUnitAnimation(sd.u, "defend")
call PauseUnit(sd.t, true)
set sd.p = 2
endif
elseif(sd.p == 2) then
if(sd.i > 0) then
set sd.i = sd.i - Interval()
set cX = GetUnitX(sd.u)
set cY = GetUnitY(sd.u)
if(sd.t != null) then
set tX = GetUnitX(sd.t)
set tY = GetUnitY(sd.t)
else
set tX = sd.x
set tY = sd.y
endif
set rad = Atan2(tY - cY, tX - cX)
set x = GetUnitX(sd.u) + sd.m * Cos(rad)
set y = GetUnitY(sd.u) + sd.m * Sin(rad)
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0)) and (not IsBarrel(sd.u, x, y, 100.0))) then
call SetUnitX(sd.u, x)
call SetUnitY(sd.u, y)
else
set sd.i = 0.0
endif
call SetUnitFacing(sd.u, rad * bj_RADTODEG)
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, x, y))
set x = x + 100.0 * Cos(rad)
set y = y + 100.0 * Sin(rad)
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0)) and (not IsBarrel(sd.t, x, y, 100.0))) then
call SetUnitX(sd.t, x)
call SetUnitY(sd.t, y)
else
set sd.i = 0.0
endif
else
set sd.p = 3
call PauseUnit(sd.u, false)
call SetUnitInvulnerable(sd.u, false)
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
if(sd.t != null) then
call PauseUnit(sd.t, false)
call IssueTargetOrder(sd.u, "attack", sd.t)
endif
call GroupAddUnit(GroundBreaking, sd.u)
set sd.i = sd.du
set sd.im = Delay(sd.l)
endif
elseif(sd.p == 3) then
if(sd.i > 0) then
set sd.i = sd.i - Interval()
else
set sd.hc = sd.hm
endif
if(sd.hc >= sd.hm) then
call GroupRemoveUnit(GroundBreaking, sd.u)
call DestroyEffect(sd.e)
set sd.e = null
set sd.u = null
set sd.o = null
set sd.t = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local GroundBreaker_Data sd = GroundBreaker_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local unit target = GetSpellTargetUnit()
local real targetX = 0.0
local real targetY = 0.0
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_ST_GroundBreaker
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
if(target == null) then
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
else
set targetX = GetUnitX(target)
set targetY = GetUnitY(target)
endif
set sd.u = caster
set sd.t = target
set sd.o = GetOwningPlayer(caster)
set sd.l = level
set sd.x = targetX
set sd.y = targetY
set sd.p = 0
set sd.m = Move(level)
set sd.mi = Move_Increase(level)
set sd.i = MORPH_TIME
set sd.im = Delay(level)
set sd.hc = 0
set sd.hm = 1
set sd.d = 0.0
set sd.r = Radius(level)
set sd.mul = Multiply(level)
set sd.du = Duration(level)
set sd.up = false
set sd.e = AddSpecialEffectTarget(SPECIAL_EFFECT, caster, "head")
if(item1 > 0) then
set sd.hm = sd.hm + (UPGRADE1_ATTACK_COUNT1 * item1)
endif
if(item2 > 0) then
set sd.hm = sd.hm + (UPGRADE1_ATTACK_COUNT2 * item2)
set sd.up = true
endif
if(item3 > 0) then
set sd.mul = sd.mul + (UPGRADE2_MULTIPLY1 * item3)
endif
if(item4 > 0) then
set sd.mul = sd.mul + (UPGRADE2_MULTIPLY2 * item4)
set sd.du = sd.du + (UPGRADE2_DURATION2 * item4)
set sd.up = true
endif
call PauseUnit(caster, true)
call SetUnitInvulnerable(caster, true)
call SetUnitAnimation(caster, "morph")
call GroupAddUnit(GroundBreakerCaster, sd.u)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set target = null
set s = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Attack_Actions takes nothing returns nothing
local unit attacker = GetAttacker()
local unit attacked = GetTriggerUnit()
local real attackedX = GetUnitX(attacked)
local real attackedY = GetUnitY(attacked)
local GroundBreaker_Data sd
local integer i = 0
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == attacker and (sd.hc < sd.hm)) then
call SetUnitAnimation(attacker, "throw")
call TargetCast(sd.o, attackedX, attackedY, 0.5, CAST_ID, sd.l, "curse", 0, attacked)
set i = Total
endif
set i = i + 1
endloop
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Attack_Conditions takes nothing returns boolean
local unit attacker = GetAttacker()
local boolean okey = GetUnitAbilityLevel(attacker, SPELL_ID) > 0 and IsUnitInGroup(attacker, GroundBreaking)
set attacker = null
return okey
endfunction
//----------------------------------------------------------------
function GroundBreaker_onDamage takes unit attacker, unit attacked, real amount returns nothing
local GroundBreaker_Data sd
local GroundBreakerHit_Data hd
local integer i = 0
call UnitRemoveAbility(attacked, BUFF_ID)
call SetUnitState(attacked, UNIT_STATE_LIFE, GetUnitState(attacked, UNIT_STATE_LIFE) + amount)
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == attacker) then
if(not IsUnitDead(attacked)) then
set sd.hc = sd.hc + 1
set sd.i = sd.du
set hd = GroundBreakerHit_Data.create()
set hd.u = sd.u
set hd.t = attacked
set hd.o = sd.o
set hd.p = true
set hd.h = HEIGHT_ATTACK
set hd.hm = HEIGHT_MOVE
set hd.hmc = HEIGHT_CHANGE
set hd.m = sd.mul
set hd.d = amount
call UnitAddAbility(attacked, 'Arav')
call PauseUnit(attacked, true)
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = hd
else
//call UnitDamageTarget(sd.u, attacked, sd.d * sd.mul, true, false, A_TYPE, D_TYPE, null)
endif
set i = Total
endif
set i = i + 1
endloop
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(GroundBreakerTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(GroundBreakerTrg, Condition(function Conditions))
call TriggerAddAction(GroundBreakerTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(GroundBreakerAttackTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(GroundBreakerAttackTrg, Condition(function Attack_Conditions))
call TriggerAddAction(GroundBreakerAttackTrg, function Attack_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set Tim2 = CreateTimer()
set Total2 = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
set loc = Location(0, 0)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call Preload(SPELL_EFFECT)
call Preload(UPGRADE_EFFECT)
endfunction
endscope
//TESH.scrollpos=109
//TESH.alwaysfold=0
globals
hashtable BlendNatureHt = InitHashtable()
group BlendNatureDummy = CreateGroup()
constant real BLEND_NATURE_COOLDOWN = 2.0 //Cooldown
constant integer BLEND_NATURE_COOLDOWN_KEY = 0 //Cooldown key
constant integer BLEND_NATURE_BLENDING_KEY = 1 //Blending key
constant integer BLEND_NATURE_PATHING_KEY = 2 //Pathing key
constant integer BLEND_NATURE_DEFENSE_KEY = 3 //Defense key
constant integer BLEND_NATURE_DEFENSE_COUNT_KEY = 4 //Defense count key
endglobals
scope BlendNature initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A06V' //Spell Blend in Nature rawcode
private constant integer ABILITY_ID = 'Assk' //Ability Blend rawcode
private constant integer ABILITY1_ID = 'A098' //Ability Teleport rawcode
private constant integer ABILITY2_ID = 'A0BL' //Ability Fast Speed rawcode
private constant integer ABILITY3_ID = 'A0BM' //Ability Bash rawcode
private constant integer TREE_ID = 'ATtr' //Tree rawcode
private constant real RADIUS = 600.0 //Radius area of effect
private constant real DURATION_REVIVE = 5.0 //Duration tree revive
private constant real DISTANCE_NEAR = 1000.0 //Distance near
private constant integer ITEM1_UPGRADE1 = 'I01Q' //Item Book of Spirit
private constant integer ITEM1_UPGRADE2 = 'I01R' //Item Shadow Grimoire
private constant integer ITEM2_UPGRADE1 = 'bspd' //Item Boots of Speed
private constant integer ITEM2_UPGRADE2 = 'I016' //Item Jungle Runner
private constant integer ITEM3_UPGRADE1 = 'I01J' //Item Lightning Gripper
private constant integer ITEM3_UPGRADE2 = 'I028' //Item Stormanifer
private constant real UPGRADE1_RADIUS1 = 75.0 //Upgrade 1 effect
private constant real UPGRADE1_RADIUS2 = 150.0 //Upgrade 1 effect
private constant integer UPGRADE2_DEFENSE_COUNT1 = 10 //Upgrade 2 effect 1
private constant integer UPGRADE2_DEFENSE_COUNT2 = 6 //Upgrade 2 effect 1
private constant string SPELL_EFFECT = "war3mapImported\\EarthRender.mdx" //Abilities\\Spells\\Items\\TomeOfRetraining\\TomeOfRetrainingCaster.mdl" //Spell effect
endglobals
//Radius blend
private function Radius takes integer level returns real
return 300.0 + (0.0 * level)
endfunction
//Type of spirit summon
private function Spirit_Type takes integer level returns integer
if(level == 1) then
return 'e000'
elseif(level == 2) then
return 'e001'
elseif(level == 3) then
return 'e002'
else
return 'e000'
endif
endfunction
//Duration of spirit summon
private function Duration takes integer level returns real
if(level == 1) then
return 60.0
elseif(level == 2) then
return 60.0
elseif(level == 3) then
return 60.0
else
return 1.0
endif
endfunction
//Unit affected
private function Targets takes destructable target returns boolean
local integer targetID = GetDestructableTypeId(target)
return (GetDestructableLife(target) > 0 and /*
*/ (targetID == TREE1_ID or/*
*/ targetID == TREE2_ID or/*
*/ targetID == TREE3_ID))
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private trigger BlendNatureTrg = CreateTrigger()
private group Group
private group copy
private group copy2
private group all
private boolexpr bexpr
private integer count
private rect rct
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local destructable filtered = GetFilterDestructable()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Count takes nothing returns nothing
set count = count + 1
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit f = null
local integer fId = 0
local real fX = 0.0
local real fY = 0.0
local integer level = 0
local player owner = null
local real radius = 0.0
local integer total = 0
local real cd = 0.0
local unit g = null
local boolean hasSkill = false
local boolean hasNoPathing = false
local boolean hasDefense = false
local integer item1 = 0
local integer item2 = 0
local integer item3 = 0
local integer item4 = 0
local integer item5 = 0
local integer item6 = 0
set copy = CopyGroup(Group)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not IsUnitDead(f)) then
set owner = GetOwningPlayer(f)
set fId = GetUnitUserData(f)
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set level = GetUnitAbilityLevel(f, SPELL_ID)
set hasSkill = LoadBoolean(BlendNatureHt, fId, BLEND_NATURE_BLENDING_KEY)
set hasNoPathing = LoadBoolean(BlendNatureHt, fId, BLEND_NATURE_PATHING_KEY)
set hasDefense = LoadBoolean(BlendNatureHt, fId, BLEND_NATURE_DEFENSE_KEY)
set item1 = IsUnitHasItemType(f, ITEM1_UPGRADE1)
set item2 = IsUnitHasItemType(f, ITEM1_UPGRADE2)
set item3 = IsUnitHasItemType(f, ITEM2_UPGRADE1)
set item4 = IsUnitHasItemType(f, ITEM2_UPGRADE2)
set item5 = IsUnitHasItemType(f, ITEM3_UPGRADE1)
set item6 = IsUnitHasItemType(f, ITEM3_UPGRADE2)
if(level > 0) then
if(GetUnitAbilityLevel(f, ABILITY_ID) <= 0) then
call UnitAddAbility(f, ABILITY_ID)
call SetUnitAbilityLevel(f, ABILITY_ID, level)
endif
if(hasSkill) then
call UnitAddAbility(f, ABILITY2_ID)
call SetUnitAbilityLevel(f, ABILITY2_ID, level)
else
call UnitRemoveAbility(f, ABILITY2_ID)
endif
if(GetUnitAbilityLevel(f, ABILITY2_ID) > 0) then
call UnitAddAbility(f, 'Arav')
call UnitRemoveAbility(f, 'Arav')
call SetUnitPathing(f, false)
call SaveBoolean(BlendNatureHt, fId, BLEND_NATURE_PATHING_KEY, true)
elseif(hasNoPathing) then
call Pather(f, 1.0)
call SaveBoolean(BlendNatureHt, fId, BLEND_NATURE_PATHING_KEY, false)
endif
set radius = Radius(level)
set cd = LoadReal(BlendNatureHt, fId, BLEND_NATURE_COOLDOWN_KEY)
if(item1 > 0) then
set radius = radius + (UPGRADE1_RADIUS1 * item1)
endif
if(item2 > 0) then
set radius = radius + (UPGRADE1_RADIUS2 * item2)
endif
if(item3 > 0) then
if(GetUnitAbilityLevel(f, ABILITY2_ID) > 0) then
call SetUnitAbilityLevel(f, ABILITY2_ID, level + 3)
endif
endif
if(item4 > 0) then
if(GetUnitAbilityLevel(f, ABILITY2_ID) > 0) then
call SetUnitAbilityLevel(f, ABILITY2_ID, level + 6)
endif
endif
if(item5 > 0) then
if(GetUnitAbilityLevel(f, ABILITY2_ID) > 0) then
call UnitAddAbility(f, ABILITY3_ID)
call SetUnitAbilityLevel(f, ABILITY3_ID, item5)
endif
endif
if(item6 > 0) then
if(GetUnitAbilityLevel(f, ABILITY2_ID) > 0) then
call UnitAddAbility(f, ABILITY3_ID)
call SetUnitAbilityLevel(f, ABILITY3_ID, item6 * 2)
endif
endif
if(item5 <= 0 and item6 <= 0) then
if(GetUnitAbilityLevel(f, ABILITY3_ID) > 0) then
call UnitRemoveAbility(f, ABILITY3_ID)
endif
endif
set rct = Rect(fX - radius, fY - radius, fX + radius, fY + radius)
set count = 0
call EnumDestructablesInRect(rct, bexpr, function Count)
if(count > 0) then
if(not IsUnitDead(f)) then
call SetPlayerAbilityAvailable(owner, ABILITY_ID, true)
call SaveBoolean(BlendNatureHt, fId, BLEND_NATURE_BLENDING_KEY, true)
endif
else
if(cd > 0) then
call SaveReal(BlendNatureHt, fId, BLEND_NATURE_COOLDOWN_KEY, cd - 0.5)
else
call SetPlayerAbilityAvailable(owner, ABILITY_ID, false)
call SaveBoolean(BlendNatureHt, fId, BLEND_NATURE_BLENDING_KEY, false)
endif
endif
else
call UnitRemoveAbility(f, ABILITY_ID)
endif
else
set owner = GetOwningPlayer(f)
set copy2 = CopyGroup(BlendNatureDummy)
loop
set g = FirstOfGroup(copy2)
exitwhen(g == null)
call GroupRemoveUnit(copy2, g)
if(GetOwningPlayer(g) == owner) then
call KillUnit(g)
call GroupRemoveUnit(BlendNatureDummy, g)
endif
endloop
endif
endloop
set f = null
set owner = null
set g = null
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local unit learner = GetLearningUnit()
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
local integer learnerId = GetUnitUserData(learner)
if(GetUnitAbilityLevel(learner, SPELL_ID) <= 1 and (not IsUnitInGroup(learner, Group))) then
call GroupAddUnit(Group, learner)
if(not IsTriggerEnabled(BlendNatureTrg)) then
call EnableTrigger(BlendNatureTrg)
endif
call UnitAddAbility(learner, ABILITY_ID)
call SetPlayerAbilityAvailable(GetOwningPlayer(learner), ABILITY_ID, false)
call SaveReal(BlendNatureHt, learnerId, BLEND_NATURE_COOLDOWN_KEY, 0.0)
call SaveBoolean(BlendNatureHt, learnerId, BLEND_NATURE_BLENDING_KEY, false)
call SaveBoolean(BlendNatureHt, learnerId, BLEND_NATURE_PATHING_KEY, false)
call SaveBoolean(BlendNatureHt, learnerId, BLEND_NATURE_DEFENSE_KEY, false)
call SaveInteger(BlendNatureHt, learnerId, BLEND_NATURE_DEFENSE_COUNT_KEY, 0)
else
call SetUnitAbilityLevel(learner, ABILITY_ID, level)
endif
set learner = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
local unit learner = GetTriggerUnit()
local boolean okey = GetLearnedSkill() == SPELL_ID and (not IsUnitIllusion(learner))
set learner = null
return okey
endfunction
//----------------------------------------------------------------
private function Attacked_Actions takes nothing returns nothing
local unit attacked = GetTriggerUnit()
local integer attackedId = GetUnitUserData(attacked)
local boolean hasDefense = LoadBoolean(BlendNatureHt, attackedId, BLEND_NATURE_DEFENSE_KEY)
local integer countDefense = LoadInteger(BlendNatureHt, attackedId, BLEND_NATURE_DEFENSE_COUNT_KEY)
local integer item3 = 0
local integer item4 = 0
local real attackedX = GetUnitX(attacked)
local real attackedY = GetUnitY(attacked)
local real targetX = 0.0
local real targetY = 0.0
local real face = GetUnitFacing(attacked)
local real rad = 0.0
local destructable dest = null
if(hasDefense) then
if(countDefense > 0) then
call SaveInteger(BlendNatureHt, attackedId, BLEND_NATURE_DEFENSE_COUNT_KEY, countDefense - 1)
else
set item3 = IsUnitHasItemType(attacked, ITEM2_UPGRADE1)
set item4 = IsUnitHasItemType(attacked, ITEM2_UPGRADE2)
if(item3 > 0) then
call SaveInteger(BlendNatureHt, attackedId, BLEND_NATURE_DEFENSE_COUNT_KEY, UPGRADE2_DEFENSE_COUNT1 - (item3 - 1))
endif
if(item4 > 0) then
call SaveInteger(BlendNatureHt, attackedId, BLEND_NATURE_DEFENSE_COUNT_KEY, UPGRADE2_DEFENSE_COUNT2 - (item4 - 1))
endif
set rad = (face + 180.0) * bj_DEGTORAD
set targetX = attackedX + 100.0 * Sin(rad)
set targetY = attackedY + 100.0 * Cos(rad)
set dest = CreateDestructable(TREE_ID, targetX, targetY, GetRandomReal(0.0, 360.0), 0.8, GetRandomInt(0, 5))
call SetDestructableAnimation(dest, "birth")
set dest = null
endif
endif
set attacked = null
endfunction
//----------------------------------------------------------------
private function Attacked_Conditions takes nothing returns boolean
local unit attacked = GetTriggerUnit()
local integer attackedId = GetUnitUserData(attacked)
local boolean hasDefense = LoadBoolean(BlendNatureHt, attackedId, BLEND_NATURE_DEFENSE_KEY)
return GetUnitAbilityLevel(attacked, ABILITY_ID) > 0 and hasDefense
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(BlendNatureLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(BlendNatureLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(BlendNatureLearnTrg, function Learn_Actions)
call TriggerRegisterAnyUnitEventBJ(BlendNatureAttackedTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(BlendNatureAttackedTrg, Condition(function Attacked_Conditions))
call TriggerAddAction(BlendNatureAttackedTrg, function Attacked_Actions)
call TriggerRegisterTimerEventPeriodic(BlendNatureTrg, 0.5)
call DisableTrigger(BlendNatureTrg)
call TriggerAddAction(BlendNatureTrg, function Actions)
//Setting globals
set Group = CreateGroup()
set copy = CreateGroup()
set copy2 = CreateGroup()
set all = CreateGroup()
set bexpr = Condition(function Pick)
set count = 0
set rct = Rect(0.0, 0.0, 0.0, 0.0)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY_ID)
call AbilityPreload(ABILITY1_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=206
//TESH.alwaysfold=0
scope VinesRoot initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A06S' //Spell Vines Root rawcode
private constant integer CAST_ID = 'AEer' //Cast Vines Root (Dummy) rawcode
private constant integer BUFF_ID = 'BEer' //Buff Vines Root rawcode
private constant integer DUMMY_ID = 'n018' //Dummy Vines Root rawcode
private constant integer ABILITY1_ID = 'A06V' //Spell Blend in Nature rawcode
private constant integer ABILITY2_ID = 'Assk' //Ability Blend rawcode
private constant integer TREE_ID = 'ATtr' //Tree rawcode
private constant integer ITEM1_UPGRADE1 = 'cnob' //Item Horn of Prominence
private constant integer ITEM1_UPGRADE2 = 'mcou' //Item Ankh of Virtue
private constant integer ITEM1_UPGRADE3 = 'kpin' //Item Medallion of Talent
private constant integer ITEM1_UPGRADE4 = 'spsh' //Item Dream Sphere
private constant integer ITEM1_UPGRADE5 = 'I009' //Item Prime Lucent
private constant integer ITEM2_UPGRADE1 = 'I010' //Item Venomwax Fang
private constant integer ITEM2_UPGRADE2 = 'I00X' //Item Laksamana Keris
private constant integer ITEM2_UPGRADE3 = 'hval' //Item Nine Curves
private constant real UPGRADE1_DISTANCE1 = 50.0 //Upgrade 1 effect 1
private constant real UPGRADE1_DISTANCE2 = 100.0 //Upgrade 1 effect 2
private constant real UPGRADE1_DISTANCE3 = 150.0 //Upgrade 1 effect 3
private constant real UPGRADE1_DISTANCE4 = 200.0 //Upgrade 1 effect 4
private constant real UPGRADE1_DISTANCE5 = 250.0 //Upgrade 1 effect 5
private constant real UPGRADE1_DECELERATION4 = 1.0 //Upgrade 1 effect 4
private constant real UPGRADE1_DECELERATION5 = 2.0 //Upgrade 1 effect 5
private constant real UPGRADE2_TIME_LIFE1 = 2.0 //Upgrade 2 effect 1
private constant real UPGRADE2_TIME_LIFE2 = 4.0 //Upgrade 2 effect 2
private constant real UPGRADE2_TIME_LIFE3 = 6.0 //Upgrade 2 effect 3
private constant real UPGRADE2_DAMAGE3 = 0.5 //Upgrade 2 effect 2
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_PLANT //Spell attack type
endglobals
//Distance
private function Distance takes integer level returns real
return 1600.0 + (0.0 * level)
endfunction
//Distance move
private function Distance_Move takes integer level returns real
return 100.0 + (0.0 * level)
endfunction
//Minimum distance move
private function Minimum_Distance_Move takes integer level returns real
return 50.0 + (0.0 * level)
endfunction
//Deceleration
private function Deceleration takes integer level returns real
return 1.0 + (0.0 * level)
endfunction
//Size decrease
private function Size_Decrease takes integer level returns real
return 0.01 + (0.0 * level)
endfunction
//Radius
private function Radius takes integer level returns real
return 150.0 + (0.0 * level)
endfunction
//Time life
private function Time_Life takes integer level returns real
return 8.0 + (0.0 * level)
endfunction
//Damage
private function Damage takes integer level returns real
if(level == 1) then
return 1.5
elseif(level == 2) then
return 2.0
elseif(level == 3) then
return 2.5
elseif(level == 4) then
return 3.5
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_FLYING) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct VinesRoot_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of spell
group g //Group dummy
group t //Group target
group tt //Group temporary target
group dt //Group damaged target
integer tds //Total destructable
integer cds //Current destructable
destructable array ds[10] //Destructable
real x //Target x
real y //Target y
real d //Distance
real dm //Distance move
real md //Minimum distance move
real dc //Deceleration
real a //Angle
real s //Size
real sm //Size decrease
real ms //Minimum size
real sin //Sin mover
real r //Radius
real tl //Time life
real dd //Damage
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private VinesRoot_Data array Ar[10]
private location loc
private group all
private group copy
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local VinesRoot_Data sd
local integer i = 0
local integer j = 0
local real x = 0.0
local real y = 0.0
local real offset = 0.0
local real angle = 0.0
local real rad = 0.0
local unit dummy = null
local unit f = null
local unit g = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.d > 0) then
set sd.d = sd.d - sd.dm
set offset = 30.0 * Sin(sd.sin)
set angle = sd.a + offset
set rad = angle * bj_DEGTORAD
set x = sd.x + sd.dm * Cos(rad)
set y = sd.y + sd.dm * Sin(rad)
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
set sd.x = x
set sd.y = y
else
set sd.x = sd.x
set sd.y = sd.y
endif
set dummy = CreateUnit(sd.o, DUMMY_ID, sd.x, sd.y, GetRandomReal(0.0, 360.0))
call UnitApplyTimedLife(dummy, 'BTLF', sd.tl)
call SetUnitScale(dummy, sd.s, sd.s, sd.s)
call UnitAddAbility(dummy, 'Arav')
call UnitRemoveAbility(dummy, 'Arav')
call SetUnitPathing(dummy, false)
call SetUnitX(dummy, sd.x)
call SetUnitY(dummy, sd.y)
call GroupAddUnit(sd.g, dummy)
call GroupEnumUnitsInRange(all, sd.x, sd.y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
if(GetUnitAbilityLevel(f, BUFF_ID) <= 0 and (not IsUnitInGroup(f, sd.tt)) and (not IsUnitInGroup(f, sd.dt))) then
call GroupAddUnit(sd.tt, f)
call GroupAddUnit(sd.dt, f)
call TargetCast(sd.o, GetUnitX(f), GetUnitY(f), 0.5, CAST_ID, sd.l, "entanglingroots", 0, f)
endif
endif
endloop
set copy = CopyGroup(sd.tt)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not IsUnitDead(f)) then
if(GetUnitAbilityLevel(f, BUFF_ID) > 0) then
call GroupAddUnit(sd.t, f)
endif
else
call GroupRemoveUnit(sd.tt, f)
endif
endloop
set copy = CopyGroup(sd.t)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not IsUnitDead(f)) then
if(GetUnitAbilityLevel(f, BUFF_ID) > 0) then
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
else
call GroupRemoveUnit(sd.t, f)
endif
else
call GroupRemoveUnit(sd.t, f)
call GroupRemoveUnit(sd.dt, f)
endif
endloop
if(sd.dm > sd.md) then
set sd.dm = sd.dm - sd.dc
endif
if(sd.s > sd.ms) then
set sd.s = sd.s - sd.sm
endif
set sd.sin = sd.sin + 1.0
if(ModuloInteger(R2I(sd.sin), 2) == 0 and sd.d <= 100.0) then
if(sd.tds < 10) then
set sd.ds[sd.tds] = CreateDestructable(TREE_ID, sd.x, sd.y, GetRandomReal(0.0, 360.0), 0.8, GetRandomInt(0, 5))
call SetDestructableAnimation(sd.ds[sd.tds], "birth")
set sd.tds = sd.tds + 1
endif
endif
elseif(FirstOfGroup(sd.g) != null) then
set copy = CopyGroup(sd.g)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(IsUnitDead(f)) then
call GroupRemoveUnit(sd.g, f)
else
set sd.x = GetUnitX(f)
set sd.y = GetUnitY(f)
call GroupEnumUnitsInRange(all, sd.x, sd.y, sd.r, bexpr)
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
if(IsUnitEnemy(g, sd.o)) then
if(GetUnitAbilityLevel(g, BUFF_ID) <= 0 and (not IsUnitInGroup(g, sd.tt)) and (not IsUnitInGroup(g, sd.dt))) then
call GroupAddUnit(sd.tt, g)
call GroupAddUnit(sd.dt, g)
call TargetCast(sd.o, GetUnitX(g), GetUnitY(g), 0.5, CAST_ID, sd.l, "entanglingroots", 0, g)
endif
endif
endloop
endif
endloop
set copy = CopyGroup(sd.tt)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not IsUnitDead(f)) then
if(GetUnitAbilityLevel(f, BUFF_ID) > 0) then
call GroupAddUnit(sd.t, f)
endif
else
call GroupRemoveUnit(sd.tt, f)
endif
endloop
set copy = CopyGroup(sd.t)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not IsUnitDead(f)) then
if(GetUnitAbilityLevel(f, BUFF_ID) > 0) then
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
else
call GroupRemoveUnit(sd.t, f)
endif
else
call GroupRemoveUnit(sd.t, f)
call GroupRemoveUnit(sd.dt, f)
endif
endloop
elseif(FirstOfGroup(sd.t) != null) then
set copy = CopyGroup(sd.t)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not IsUnitDead(f)) then
if(GetUnitAbilityLevel(f, BUFF_ID) > 0) then
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
else
call GroupRemoveUnit(sd.t, f)
endif
else
call GroupRemoveUnit(sd.t, f)
call GroupRemoveUnit(sd.dt, f)
endif
endloop
elseif(sd.cds < sd.tds) then
call KillDestructable(sd.ds[sd.cds])
set sd.cds = sd.cds + 1
else
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call KillUnit(f)
call GroupRemoveUnit(sd.g, f)
endloop
loop
set f = FirstOfGroup(sd.t)
exitwhen(f == null)
call GroupRemoveUnit(sd.t, f)
endloop
loop
set f = FirstOfGroup(sd.tt)
exitwhen(f == null)
call GroupRemoveUnit(sd.tt, f)
endloop
loop
set f = FirstOfGroup(sd.dt)
exitwhen(f == null)
call GroupRemoveUnit(sd.dt, f)
endloop
set j = 0
loop
exitwhen(j >= sd.tds)
call KillDestructable(sd.ds[j])
call RemoveDestructable(sd.ds[j])
set sd.ds[j] = null
set j = j + 1
endloop
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set dummy = null
set f = null
set g = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local VinesRoot_Data sd = VinesRoot_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
local real targetX = 0.0
local real targetY = 0.0
local real rad = 0.0
local boolean isNull = (Ar[Total] == null)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM1_UPGRADE4)
local integer item5 = IsUnitHasItemType(caster, ITEM1_UPGRADE5)
local integer item6 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item7 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item8 = IsUnitHasItemType(caster, ITEM2_UPGRADE3)
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
set rad = Atan2(targetY - casterY, targetX - casterX)
if(isNull) then
set sd = VinesRoot_Data.create()
set sd.g = CreateGroup()
set sd.t = CreateGroup()
set sd.tt = CreateGroup()
set sd.dt = CreateGroup()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.tds = 0
set sd.cds = 0
set sd.x = casterX
set sd.y = casterY
set sd.d = Distance(level)
set sd.dm = Distance_Move(level)
set sd.md = Minimum_Distance_Move(level)
set sd.dc = Deceleration(level)
set sd.a = rad * bj_RADTODEG
set sd.s = 1.0
set sd.sm = Size_Decrease(level)
set sd.ms = 0.6
set sd.sin = 0.0
set sd.r = Radius(level)
set sd.tl = Time_Life(level)
set sd.dd = Damage(level) + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
if(GetUnitAbilityLevel(caster, ABILITY1_ID) > 0) then
call SetPlayerAbilityAvailable(owner, ABILITY2_ID, true)
call SaveReal(BlendNatureHt, casterID, BLEND_NATURE_COOLDOWN_KEY, BLEND_NATURE_COOLDOWN)
call SaveBoolean(BlendNatureHt, casterID, BLEND_NATURE_BLENDING_KEY, true)
endif
if(item1 > 0) then
set sd.d = sd.d + (UPGRADE1_DISTANCE1 * item1)
endif
if(item2 > 0) then
set sd.d = sd.d + (UPGRADE1_DISTANCE2 * item2)
endif
if(item3 > 0) then
set sd.d = sd.d + (UPGRADE1_DISTANCE3 * item3)
endif
if(item4 > 0) then
set sd.d = sd.d + (UPGRADE1_DISTANCE4 * item4)
set sd.dc = sd.dc + (UPGRADE1_DECELERATION4 * item4)
endif
if(item5 > 0) then
set sd.d = sd.d + (UPGRADE1_DISTANCE5 * item5)
set sd.dc = sd.dc + (UPGRADE1_DECELERATION5 * item5)
endif
if(item6 > 0) then
set sd.tl = sd.tl + (UPGRADE2_TIME_LIFE1 * item6)
endif
if(item7 > 0) then
set sd.tl = sd.tl + (UPGRADE2_TIME_LIFE2 * item7)
endif
if(item8 > 0) then
set sd.tl = sd.tl + (UPGRADE2_TIME_LIFE3 * item8)
set sd.dd = sd.dd + (UPGRADE2_DAMAGE3 * item8)
endif
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(VinesRootTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(VinesRootTrg, Condition(function Conditions))
call TriggerAddAction(VinesRootTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set loc = Location(0, 0)
set all = CreateGroup()
set copy = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call AbilityPreload(ABILITY1_ID)
call AbilityPreload(ABILITY2_ID)
endfunction
endscope
//TESH.scrollpos=251
//TESH.alwaysfold=0
globals
group PollenRecipient = CreateGroup()
endglobals
scope PollensDisperse initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A06T' //Spell Pollen Disperse rawcode
private constant integer CAST_ID = 'A06M' //Cast Pollen Disperse (Silence) rawcode
private constant integer BUFF_ID = 'B020' //Buff Pollen Disperse (Silence) rawcode
private constant integer DUMMY_ID = 'n019' //Dummy Pollen rawcode
private constant integer ABILITY1_ID = 'A06V' //Spell Blend in Nature rawcode
private constant integer ABILITY2_ID = 'Assk' //Ability Blend rawcode
private constant real INTERVAL_DISPERSE = 0.2 //Interval to disperse
private constant integer ITEM1_UPGRADE1 = 'I004' //Item Leather Armor
private constant integer ITEM1_UPGRADE2 = 'I020' //Item Elven Leafcoat
private constant integer ITEM1_UPGRADE3 = 'I022' //Item Meridian Stark
private constant integer ITEM1_UPGRADE4 = 'I021' //Item Dragon FrostScale
private constant integer ITEM2_UPGRADE1 = 'I01N' //Item Staff of Flamecurse
private constant integer ITEM2_UPGRADE2 = 'ssil' //Item Sunstalker
private constant real UPGRADE1_DAMAGE1 = 0.5 //Upgrade 1 effect 1
private constant real UPGRADE1_DAMAGE2 = 1.0 //Upgrade 1 effect 2
private constant real UPGRADE1_DAMAGE3 = 1.5 //Upgrade 1 effect 3
private constant real UPGRADE1_DAMAGE4 = 2.0 //Upgrade 1 effect 4
private constant real UPGRADE1_RADIUS4 = 300.0 //Upgrade 1 effect 4
private constant real UPGRADE2_DURATION1 = 2.0 //Upgrade 2 effect 1
private constant real UPGRADE2_DURATION2 = 4.0 //Upgrade 2 effect 2
private constant real UPGRADE2_POLLEN_DURATION1 = 15.0 //Upgrade 2 effect 1
private constant real UPGRADE2_POLLEN_DURATION2 = 30.0 //Upgrade 2 effect 2
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_PLANT //Spell attack type
endglobals
//Duration channel
private function Duration takes integer level returns real
if(level == 1) then
return 30.0
elseif(level == 2) then
return 30.0
elseif(level == 3) then
return 30.0
else
return 0.0
endif
endfunction
//Pollen duration
private function Pollen_Duration takes integer level returns real
if(level == 1) then
return 4.0
elseif(level == 2) then
return 6.0
elseif(level == 3) then
return 10.0
else
return 0.0
endif
endfunction
//Radius
private function Radius takes integer level returns real
return 900.0 + (0.0 * level)
endfunction
//Damage
private function Damage takes integer level returns real
if(level == 1) then
return 0.5
elseif(level == 2) then
return 1.0
elseif(level == 3) then
return 2.0
else
return 0.0
endif
endfunction
//Pollen move per interval
private function Pollen_Move takes integer level returns real
return 90.0 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct PollensDisperse_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of spell
widget p //Pollen recipient
group t //Group target
boolean c //Channeling
real i //Interval
real im //Interval max
real d //Duration
real r //Radius
real pd //Pollen duration
boolean ea //Effect attack
real dd //Damage
endstruct
//----------------------------------------------------------------
struct Pollen_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of spell
widget p //Pollen recipient
unit t //Unit target
unit dum //Unit dummy
boolean ea //Effect attack
real x //Target x
real y //Target y
integer md //Mode
boolean h //Hit
real m //Move
boolean b //Buffed
real i //Timer buff
real dd //Damage
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private PollensDisperse_Data array Ar[10]
private timer Tim2
private integer Total2
private Pollen_Data array Ar2[300]
private group all
private group copy
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute2 takes nothing returns nothing
local Pollen_Data pd
local integer i = 0
local real cX = 0.0
local real cY = 0.0
local real tX = 0.0
local real tY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local real x = 0.0
local real y = 0.0
local real rad = 0.0
loop
exitwhen(i >= Total2)
set pd = Ar2[i]
if(pd.md == 0) then
if(not pd.h) then
set cX = GetUnitX(pd.dum)
set cY = GetUnitY(pd.dum)
set tX = pd.x
set tY = pd.y
set dx = cX - tX
set dy = cY - tY
set distance = SquareRoot(dx * dx + dy * dy)
set rad = Atan2(tY - cY, tX - cX)
if(distance > pd.m) then
set x = cX + pd.m * Cos(rad)
set y = cY + pd.m * Sin(rad)
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
call SetUnitX(pd.dum, x)
call SetUnitY(pd.dum, y)
else
set pd.h = true
endif
else
set pd.h = true
endif
elseif(not pd.b) then
if(pd.i > 0.0) then
set pd.i = pd.i - Interval()
else
set pd.b = true
endif
else
call KillUnit(pd.dum)
call RemoveUnit(pd.dum)
set pd.u = null
set pd.o = null
set pd.p = null
set pd.t = null
set pd.dum = null
set Ar2[i] = Ar2[Total2 - 1]
set Total2 = Total2 - 1
call pd.destroy()
set i = i - 1
endif
else
if(not pd.h) then
set cX = GetUnitX(pd.dum)
set cY = GetUnitY(pd.dum)
set tX = GetUnitX(pd.t)
set tY = GetUnitY(pd.t)
set dx = cX - tX
set dy = cY - tY
set distance = SquareRoot(dx * dx + dy * dy)
set rad = Atan2(tY - cY, tX - cX)
if(distance > pd.m) then
set x = cX + pd.m * Cos(rad)
set y = cY + pd.m * Sin(rad)
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
call SetUnitX(pd.dum, x)
call SetUnitY(pd.dum, y)
else
set distance = pd.m
endif
else
call KillUnit(pd.dum)
if(GetUnitState(pd.t, UNIT_STATE_MAX_MANA) > 0.0) then
if(not pd.ea) then
call TargetCast(pd.o, tX, tY, 0.5, CAST_ID, pd.l, "soulburn", 0, pd.t)
else
call TargetCast(pd.o, tX, tY, 0.5, CAST_ID, pd.l + 3, "soulburn", 0, pd.t)
endif
//else
//call UnitDamageTarget(pd.u, pd.t, pd.dd * pd.i, true, false, A_TYPE, D_TYPE, null)
//set pd.i = 0.0
endif
set pd.h = true
endif
elseif(not pd.b) then
if(pd.i > 0.0) then
set pd.i = pd.i - Interval()
if(IsUnitDead(pd.t)) then
set pd.i = 0.0
endif
else
call KillUnit(pd.dum)
call RemoveUnit(pd.dum)
set pd.u = null
set pd.o = null
set pd.p = null
set pd.t = null
set pd.dum = null
set Ar2[i] = Ar2[Total2 - 1]
set Total2 = Total2 - 1
call pd.destroy()
set i = i - 1
endif
if(GetUnitAbilityLevel(pd.t, BUFF_ID) > 0) then
set pd.b = true
endif
else
if(GetUnitAbilityLevel(pd.t, BUFF_ID) > 0) then
call UnitDamageTarget(pd.u, pd.t, pd.dd, true, false, A_TYPE, D_TYPE, null)
//call SetUnitState(pd.t, UNIT_STATE_MANA, GetUnitState(pd.t, UNIT_STATE_MANA) - pd.dd)
else
call KillUnit(pd.dum)
call RemoveUnit(pd.dum)
set pd.u = null
set pd.o = null
set pd.p = null
set pd.t = null
set pd.dum = null
set Ar2[i] = Ar2[Total2 - 1]
set Total2 = Total2 - 1
call pd.destroy()
set i = i - 1
endif
endif
endif
set i = i + 1
endloop
if Total2 == 0 then
call PauseTimer(Tim2)
endif
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local PollensDisperse_Data sd
local Pollen_Data pd
local integer i = 0
local integer j = 0
local real x = 0.0
local real y = 0.0
local unit dummy = null
local unit f = null
local boolean done = false
local boolean exist = false
local real randomDistance = 0.0
local real randomRad = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.c) then
if(sd.d > 0) then
set sd.d = sd.d - Interval()
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
set x = GetWidgetX(sd.p)
set y = GetWidgetY(sd.p)
set done = false
set exist = false
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(f != sd.p and /*
*/IsUnitEnemy(f, sd.o) and /*
*/(not IsUnitInGroup(f, sd.t)) and /*
*/GetUnitAbilityLevel(f, BUFF_ID) <= 0 and/*
*/(not done)) then
set exist = true
set done = true
call GroupAddUnit(sd.t, f)
set pd = Pollen_Data.create()
set pd.u = sd.u
set pd.o = sd.o
set pd.l = sd.l
set pd.p = sd.p
set pd.t = f
set pd.dum = CreateUnit(sd.o, DUMMY_ID, x, y, 0.0)
set pd.x = 0.0
set pd.y = 0.0
set pd.md = 1
set pd.h = false
set pd.m = Pollen_Move(sd.l)
set pd.b = false
set pd.i = sd.pd
set pd.dd = sd.dd
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = pd
endif
endloop
if(not exist) then
set sd.i = sd.im
set randomDistance = GetRandomReal(200.0, sd.r)
set randomRad = GetRandomInt(0, 360) * bj_DEGTORAD
set pd = Pollen_Data.create()
set pd.u = sd.u
set pd.o = sd.o
set pd.l = sd.l
set pd.p = null
set pd.t = null
set pd.dum = CreateUnit(sd.o, DUMMY_ID, x, y, 0.0)
set pd.x = x + randomDistance * Cos(randomRad)
set pd.y = y + randomDistance * Sin(randomRad)
set pd.md = 0
set pd.h = false
set pd.m = Pollen_Move(sd.l)
set pd.b = false
set pd.i = sd.pd
set pd.dd = sd.dd
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = pd
endif
endif
else
call IssueImmediateOrder(sd.u, "stop")
set sd.c = false
endif
set copy = CopyGroup(sd.t)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not IsUnitDead(f)) then
set exist = false
set j = 0
loop
exitwhen(j >= Total2)
set pd = Ar2[j]
if(pd.t == f) then
set exist = true
set j = Total2
endif
set j = j + 1
endloop
if(not exist) then
call GroupRemoveUnit(sd.t, f)
endif
else
call GroupRemoveUnit(sd.t, f)
endif
endloop
else
loop
set f = FirstOfGroup(sd.t)
exitwhen(f == null)
call GroupRemoveUnit(sd.t, f)
endloop
set sd.u = null
set sd.o = null
set sd.p = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set dummy = null
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local PollensDisperse_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
local unit target = GetSpellTargetUnit()
local real targetX = GetUnitX(target)
local real targetY = GetUnitY(target)
local boolean isNull = (Ar[Total] == null)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM1_UPGRADE4)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item6 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
if(isNull) then
set sd = PollensDisperse_Data.create()
set sd.t = CreateGroup()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.l = level
set sd.o = owner
set sd.p = target
set sd.c = true
set sd.d = Duration(level)
set sd.i = 0.0
set sd.im = INTERVAL_DISPERSE
set sd.r = Radius(level)
set sd.pd = Pollen_Duration(level)
set sd.ea = false
set sd.dd = Damage(level) + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
if(caster == target and GetUnitAbilityLevel(caster, ABILITY1_ID) > 0) then
call SetPlayerAbilityAvailable(owner, ABILITY2_ID, true)
call SaveReal(BlendNatureHt, casterID, BLEND_NATURE_COOLDOWN_KEY, BLEND_NATURE_COOLDOWN)
call SaveBoolean(BlendNatureHt, casterID, BLEND_NATURE_BLENDING_KEY, true)
endif
if(item1 > 0) then
set sd.dd = sd.dd + (UPGRADE1_DAMAGE1 * item1)
endif
if(item2 > 0) then
set sd.dd = sd.dd + (UPGRADE1_DAMAGE2 * item2)
endif
if(item3 > 0) then
set sd.dd = sd.dd + (UPGRADE1_DAMAGE3 * item3)
endif
if(item4 > 0) then
set sd.dd = sd.dd + (UPGRADE1_DAMAGE4 * item4)
set sd.r = sd.r + (UPGRADE1_RADIUS4 * item4)
endif
if(item5 > 0) then
set sd.d = sd.d + (UPGRADE2_DURATION1 * item5)
set sd.pd = sd.pd + (UPGRADE2_POLLEN_DURATION1 * item5)
endif
if(item6 > 0) then
set sd.d = sd.d + (UPGRADE2_DURATION2 * item6)
set sd.pd = sd.pd + (UPGRADE2_POLLEN_DURATION2 * item6)
set sd.ea = true
endif
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set owner = null
set target = null
endfunction
//----------------------------------------------------------------
private function Stop_Actions takes nothing returns nothing
local PollensDisperse_Data sd
local unit caster = GetTriggerUnit()
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set sd.c = false
endif
set i = i + 1
endloop
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
function PollenDisperse_onDamage takes unit attacker, unit attacked, real amount returns nothing
local real attackerX = GetUnitX(attacker)
local real attackerY = GetUnitY(attacker)
local player owner = GetOwningPlayer(attacker)
local Pollen_Data sd
local integer i = 0
loop
exitwhen(i >= Total2)
set sd = Ar2[i]
if(sd.t == attacker and sd.p == attacked) then
call UnitRemoveAbility(attacker, BUFF_ID)
endif
set i = i + 1
endloop
set attacker = null
set owner = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(PollensDisperseTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(PollensDisperseTrg, Condition(function Conditions))
call TriggerAddAction(PollensDisperseTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(PollensDisperseStopTrg, EVENT_PLAYER_UNIT_SPELL_ENDCAST)
call TriggerAddCondition(PollensDisperseStopTrg, Condition(function Conditions))
call TriggerAddAction(PollensDisperseStopTrg, function Stop_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set Tim2 = CreateTimer()
set Total2 = 0
set all = CreateGroup()
set copy = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call AbilityPreload(ABILITY1_ID)
call AbilityPreload(ABILITY2_ID)
endfunction
endscope
//TESH.scrollpos=24
//TESH.alwaysfold=0
scope RazorLeaves initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A06U' //Spell Razor Leaves rawcode
private constant integer ABILITY1_ID = 'A06V' //Spell Blend in Nature rawcode
private constant integer ABILITY2_ID = 'Assk' //Ability Blend rawcode
private constant integer ITEM1_UPGRADE1 = 'evtl' //Item Talisman of Evasion
private constant integer ITEM1_UPGRADE2 = 'I01K' //Item Void Artifice
private constant integer ITEM1_UPGRADE3 = 'clfm' //Item Diamond Escutcheon
private constant integer ITEM2_UPGRADE1 = 'I00Q' //Item Edge of Blaze
private constant integer ITEM2_UPGRADE2 = 'frgd' //Item Heaven Rapier
private constant real UPGRADE1_RADIUS1 = 50.0 //Upgrade 1 effect 1
private constant real UPGRADE1_RADIUS2 = 100.0 //Upgrade 1 effect 2
private constant real UPGRADE1_RADIUS3 = 150.0 //Upgrade 1 effect 3
private constant integer UPGRADE1_BLAST1 = 10 //Upgrade 1 effect 1
private constant integer UPGRADE1_BLAST2 = 16 //Upgrade 1 effect 2
private constant integer UPGRADE1_BLAST3 = 22 //Upgrade 1 effect 3
private constant real UPGRADE2_DAMAGE_RADIUS1 = 25.0 //Upgrade 2 effect 1
private constant real UPGRADE2_DAMAGE_RADIUS2 = 50.0 //Upgrade 2 effect 2
private constant real UPGRADE2_DAMAGE1 = 25.0 //Upgrade 2 effect 1
private constant real UPGRADE2_DAMAGE2 = 50.0 //Upgrade 2 effect 2
private constant string SPELL_EFFECT = "Objects\\Spawnmodels\\NightElf\\EntBirthTarget\\EntBirthTarget.mdl" //Spell effect
private constant attacktype A_TYPE = ATTACK_TYPE_PIERCE //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_PLANT //Spell damage type
endglobals
//Interval between blast
private function Blast_Interval takes integer level returns real
return 0.4 - (0.1 * level)
endfunction
//Damage to targets
private function Damage takes integer level returns real
if(level == 1) then
return 50.0
elseif(level == 2) then
return 70.0
elseif(level == 3) then
return 100.0
else
return 0.0
endif
endfunction
//Damage radius of blast
private function Damage_Radius takes integer level returns real
return 200.0 + (0 * level)
endfunction
//Number of blast
private function Blast takes integer level returns integer
if(level == 1) then
return 20
elseif(level == 2) then
return 32
elseif(level == 3) then
return 44
else
return 0
endif
endfunction
//Radius of blast
private function Radius takes integer level returns real
return 600.0 + (0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct RazorLeaves_Data
unit u //Unit caster
player o //Owner of caster
real i //Interval
real im //Max interval
real d //Damage to target
real dr //Damage radius
integer c //Number of blast
real r //Radius of blast
unit t1 //Target 1
unit t2 //Target 2
unit t3 //Target 3
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private RazorLeaves_Data array Ar[10]
private integer Total
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local RazorLeaves_Data sd
local integer i = 0
local real x = 0.0
local real y = 0.0
local boolean exist = false
local real rDistance = 0.0
local real rAngle = 0.0
local real X = 0.0
local real Y = 0.0
local unit f = null
local unit target = null
local unit dummy = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.c > 0) then
if(sd.i > 0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
set sd.c = sd.c - 1
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
set exist = false
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (IsUnitEnemy(f, sd.o) and (not exist) and (f != sd.t1) and (f != sd.t2) and (f != sd.t3)) then
set target = f
set exist = true
if(sd.t1 == null) then
set sd.t1 = target
set sd.t2 = null
elseif(sd.t2 == null) then
set sd.t2 = target
set sd.t3 = null
elseif(sd.t3 == null) then
set sd.t3 = target
set sd.t1 = null
endif
endif
endloop
if(not exist) then
set sd.t1 = null
set sd.t2 = null
set sd.t3 = null
set rDistance = GetRandomInt(50, R2I(sd.r))
set rAngle = GetRandomInt(50, 360)
set X = x + rDistance * Cos(rAngle*bj_DEGTORAD)
set Y = y + rDistance * Sin(rAngle*bj_DEGTORAD)
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, X, Y))
call GroupEnumUnitsInRange(all, X, Y, sd.dr, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
call UnitDamageTarget(sd.u, f, sd.d, true, false, A_TYPE, D_TYPE, null)
if(not IsUnitType(f, UNIT_TYPE_ANCIENT)) then
call IssueImmediateOrder(f, "stop")
endif
endif
endloop
else
set X = GetUnitX(target)
set Y = GetUnitY(target)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, target, "origin"))
call GroupEnumUnitsInRange(all, X, Y, sd.dr, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
call UnitDamageTarget(sd.u, f, sd.d, true, false, A_TYPE, D_TYPE, null)
if(not IsUnitType(f, UNIT_TYPE_ANCIENT)) then
call IssueImmediateOrder(f, "stop")
endif
endif
endloop
endif
endif
else
set sd.u = null
set sd.o = null
set sd.t1 = null
set sd.t2 = null
set sd.t3 = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set dummy = null
set target = null
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local RazorLeaves_Data sd = RazorLeaves_Data.create()
local unit caster = GetTriggerUnit()
local player owner = GetOwningPlayer(caster)
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_GN_RazorLeaves
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
set sd.u = caster
set sd.o = owner
set sd.i = 0
set sd.im = Blast_Interval(level)
set sd.d = Damage(level) + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.dr = Damage_Radius(level)
set sd.c = Blast(level)
set sd.r = Radius(level)
set sd.t1 = null
set sd.t2 = null
set sd.t3 = null
if(GetUnitAbilityLevel(caster, ABILITY1_ID) > 0) then
call SetPlayerAbilityAvailable(owner, ABILITY2_ID, true)
call SaveReal(BlendNatureHt, casterID, BLEND_NATURE_COOLDOWN_KEY, BLEND_NATURE_COOLDOWN)
call SaveBoolean(BlendNatureHt, casterID, BLEND_NATURE_BLENDING_KEY, true)
endif
if(item1 > 0) then
set sd.r = sd.r + (UPGRADE1_RADIUS1 * item1)
set sd.c = sd.c + (UPGRADE1_BLAST1 * item1)
endif
if(item2 > 0) then
set sd.r = sd.r + (UPGRADE1_RADIUS2 * item2)
set sd.c = sd.c + (UPGRADE1_BLAST1 * item2)
endif
if(item3 > 0) then
set sd.r = sd.r + (UPGRADE1_RADIUS3 * item3)
set sd.c = sd.c + (UPGRADE1_BLAST1 * item3)
endif
if(item4 > 0) then
set sd.dr = sd.dr + (UPGRADE2_DAMAGE_RADIUS1 * item4)
set sd.d = sd.d + (UPGRADE2_DAMAGE1 * item4)
endif
if(item5 > 0) then
set sd.dr = sd.dr + (UPGRADE2_DAMAGE_RADIUS2 * item5)
set sd.d = sd.d + (UPGRADE2_DAMAGE2 * item5)
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
set s = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(RazorLeavesTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(RazorLeavesTrg, Condition(function Conditions))
call TriggerAddAction(RazorLeavesTrg, function Actions)
//setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY1_ID)
call AbilityPreload(ABILITY2_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=15
//TESH.alwaysfold=0
scope ForestArisen initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A06W' //Spell Forest Arisen rawcode
private constant integer ABILITY_ID = 'AOae' //Ability Forest Arisen (Speed) rawcode
private constant integer TREE_ID = 'ATtr' //Tree rawcode
private constant integer DUMMY_ID = 'n01A' //Dummy rawcode
private constant integer ABILITY1_ID = 'A06V' //Spell Blend in Nature rawcode
private constant integer ABILITY2_ID = 'Assk' //Ability Blend rawcode
private constant real FINISH_DURATION = 1.0 //Finish duration
private constant integer ITEM1_UPGRADE1 = 'odef' //Item Eve Feather
private constant integer ITEM1_UPGRADE2 = 'gvsm' //Item Chronos the Forbidden
private constant integer ITEM2_UPGRADE1 = 'I00H' //Item Warmarcher
private constant integer ITEM2_UPGRADE2 = 'I019' //Item Skypath Strider
private constant real UPGRADE1_HEAL1 = 1.0 //Upgrade 1 effect 1
private constant real UPGRADE1_HEAL2 = 1.5 //Upgrade 1 effect 2
private constant real UPGRADE1_MANA1 = 0.5 //Upgrade 1 effect 1
private constant real UPGRADE1_MANA2 = 0.75 //Upgrade 1 effect 2
private constant real UPGRADE2_DURATION1 = 5.0 //Upgrade 2 effect 1
private constant real UPGRADE2_DURATION2 = 10.0 //Upgrade 2 effect 2
private constant real UPGRADE2_HEAL2 = 500.0 //Upgrade 1 effect 2
private constant real UPGRADE2_MANA2 = 250.0 //Upgrade 1 effect 2
private constant string SPELL_EFFECT = "Objects\\Spawnmodels\\NightElf\\EntBirthTarget\\EntBirthTarget.mdl" //Death effect
private constant string UPGRADE_EFFECT = "Abilities\\Spells\\NightElf\\Tranquility\\TranquilityTarget.mdl" //Upgrade effect
endglobals
//Duration
private function Duration takes integer level returns real
if(level == 1) then
return 30.0
elseif(level == 2) then
return 30.0
else
return 0.0
endif
endfunction
//Radius effect
private function Radius takes integer level returns real
return 900.0 + (0 * level)
endfunction
//Amount of trees
private function Trees takes integer level returns integer
if(level == 1) then
return 6
elseif(level == 2) then
return 12
elseif(level == 3) then
return 18
else
return 0
endif
endfunction
//Radius of trees
private function Trees_Radius takes integer level returns real
if(level == 1) then
return 300.0
elseif(level == 2) then
return 600.0
elseif(level == 3) then
return 900.0
else
return 0.0
endif
endfunction
//Heal
private function Heal takes integer level returns real
if(level == 1) then
return 2.0
elseif(level == 2) then
return 3.0
else
return 0.0
endif
endfunction
//Mana regeneration
private function Mana takes integer level returns real
if(level == 1) then
return 1.0
elseif(level == 2) then
return 1.5
else
return 0.0
endif
endfunction
//Unit type summon
private function Dummy_Type takes integer level returns integer
if(level == 1) then
return 'e000'
elseif(level == 2) then
return 'e001'
else
return 'e000'
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct ForestArisen_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of ability
unit dum //Dummy revealer
unit dum1 //Dummy
unit array dumExtra[2] //Dummy extra
real x //Target x
real y //Target y
real d //Duration
real dm //Duration max
integer f //Finish
real fd //Finish duration
integer t //Target tree
integer t1 //Total destructables level 1
destructable array ds1[9] //Destructables level 1
integer t2 //Total destructables level 2
destructable array ds2[24] //Destructables level 2
integer t3 //Total destructables level 3
destructable array ds3[36] //Destructables level 3
real r //Radius
real h //Heal
real m //Mana
real i //Interval
real im //Interval max
boolean up //Upgrade
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private ForestArisen_Data array Ar[10]
private group all
private boolexpr bexpr
private location target
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local ForestArisen_Data sd
local integer i = 0
local integer j = 0
local real cX = 0.0
local real cY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local unit f = null
local real fX = 0.0
local real fY = 0.0
local integer m = 0
local boolean exist = false
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.f < 3) then
if(sd.d > 0) then
set sd.d = sd.d - Interval()
set cX = GetUnitX(sd.u)
set cY = GetUnitY(sd.u)
set dx = cX - sd.x
set dy = cY - sd.y
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= 1000.0) then
//call UnitAddAbility(sd.u, 'Arav')
//call UnitRemoveAbility(sd.u, 'Arav')
//call SetUnitPathing(sd.u, false)
if(sd.up) then
call SetUnitMoveSpeed(sd.u, 522)
endif
else
//call SetUnitPathing(sd.u, true)
if(sd.up) then
call SetUnitMoveSpeed(sd.u, GetUnitDefaultMoveSpeed(sd.u))
endif
endif
set exist = false
if(sd.up) then
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
set exist = true
endif
endif
call GroupEnumUnitsInRange(all, sd.x, sd.y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitAlly(f, sd.o) and (GetOwningPlayer(f) != Player(PLAYER_NEUTRAL_PASSIVE))) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = fX - sd.x
set dy = fY - sd.y
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= 300.0) then
set m = 3
elseif(distance <= 600.0) then
set m = 2
else
set m = 1
endif
call SetUnitState(f, UNIT_STATE_LIFE, GetUnitState(f, UNIT_STATE_LIFE) + sd.h * m)
call SetUnitState(f, UNIT_STATE_MANA, GetUnitState(f, UNIT_STATE_MANA) + sd.m * m)
if(exist) then
call Timed_AddSpecialEffectTarget(UPGRADE_EFFECT, f, "origin", 2.0)
endif
endif
endloop
set exist = false
set j = 0
loop
exitwhen(j >= sd.t1)
if(GetDestructableLife(sd.ds1[j]) > 0.0) then
set exist = true
endif
set j = j + 1
endloop
set j = 0
loop
exitwhen(j >= sd.t2)
if(GetDestructableLife(sd.ds2[j]) > 0.0) then
set exist = true
endif
set j = j + 1
endloop
set j = 0
loop
exitwhen(j >= sd.t3)
if(GetDestructableLife(sd.ds3[j]) > 0.0) then
set exist = true
endif
set j = j + 1
endloop
if(not exist) then
set sd.d = 0.0
endif
else
if(sd.f == 0) then
if(sd.t < sd.t1) then
//call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, GetDestructableX(sd.ds1[sd.t]), GetDestructableY(sd.ds1[sd.t])))
if(sd.ds1[sd.t] != null) then
call KillDestructable(sd.ds1[sd.t])
endif
set sd.t = sd.t + 1
else
set sd.d = 0.0
set sd.f = sd.f + 1
set sd.t = 0
endif
elseif(sd.f == 1) then
if(sd.t < sd.t2) then
//call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, GetDestructableX(sd.ds2[sd.t]), GetDestructableY(sd.ds2[sd.t])))
if(sd.ds2[sd.t] != null) then
call KillDestructable(sd.ds2[sd.t])
endif
set sd.t = sd.t + 1
else
set sd.d = 0.0
set sd.f = sd.f + 1
set sd.t = 0
endif
elseif(sd.f == 2) then
if(sd.t < sd.t3) then
//call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, GetDestructableX(sd.ds3[sd.t]), GetDestructableY(sd.ds3[sd.t])))
if(sd.ds3[sd.t] != null) then
call KillDestructable(sd.ds3[sd.t])
endif
set sd.t = sd.t + 1
else
set sd.d = 0.0
set sd.f = sd.f + 1
set sd.t = 0
endif
endif
endif
elseif(sd.fd > 0) then
set sd.fd = sd.fd - Interval()
else
call KillUnit(sd.dum)
call RemoveUnit(sd.dum1)
//call SetUnitPathing(sd.u, true)
set j = 0
loop
exitwhen(j >= 2)
if(sd.dumExtra[j] != null) then
call KillUnit(sd.dumExtra[j])
set sd.dumExtra[j] = null
endif
set j = j + 1
endloop
set j = 0
loop
exitwhen(j >= sd.t1)
if(sd.ds1[j] != null) then
call KillDestructable(sd.ds1[j])
call RemoveDestructable(sd.ds1[j])
set sd.ds1[j] = null
endif
set j = j + 1
endloop
set j = 0
loop
exitwhen(j >= sd.t2)
if(sd.ds2[j] != null) then
call KillDestructable(sd.ds2[j])
call RemoveDestructable(sd.ds2[j])
set sd.ds2[j] = null
endif
set j = j + 1
endloop
set j = 0
loop
exitwhen(j >= sd.t3)
if(sd.ds3[j] != null) then
call KillDestructable(sd.ds3[j])
call RemoveDestructable(sd.ds3[j])
set sd.ds3[j] = null
endif
set j = j + 1
endloop
set sd.u = null
set sd.o = null
set sd.dum = null
set sd.dum1 = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local ForestArisen_Data sd = ForestArisen_Data.create()
local unit caster = GetSpellAbilityUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local real targetX = 0.0
local real targetY = 0.0
local integer i = 0
local integer j = 0
local integer total = 0
local real radius = 0.0
local real x = 0.0
local real y = 0.0
local real angle = 0.0
local real rad = 0.0
local real face = 0.0
local real start = 0.0
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local unit f = null
local real fX = 0.0
local real fY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local integer m = 0
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_GN_ForestArisen
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
set target = GetSpellTargetLoc()
set targetX = GetLocationX(target)
set targetY = GetLocationY(target)
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.dum = CreateUnit(owner, DUMMY_ID, targetX, targetY, bj_UNIT_FACING)
set sd.dum1 = CreateUnit(owner, Dummy_Type(level), targetX, targetY, bj_UNIT_FACING)
call UnitAddAbility(sd.dum1, 'Arav')
call UnitRemoveAbility(sd.dum1, 'Arav')
call SetUnitPathing(sd.dum1, false)
call SetUnitX(sd.dum1, targetX)
call SetUnitY(sd.dum1, targetY)
call SetUnitAnimation(sd.dum1, "channel")
call PauseUnit(sd.dum1, true)
set sd.x = targetX
set sd.y = targetY
set sd.d = Duration(level)
set sd.dm = sd.d
set sd.f = 0
set sd.fd = FINISH_DURATION
set sd.t = 0
set sd.t1 = 0
set sd.t2 = 0
set sd.t3 = 0
set sd.r = Radius(level)
set sd.h = Heal(level)
set sd.m = Mana(level)
set sd.i = 0.5
set sd.im = 0.5
set sd.up = false
set i = 1
loop
exitwhen(i >= 4)
set total = Trees(i)
set radius = Trees_Radius(i)
set angle = 360.0 / total
set start = GetRandomReal(0.0, 360.0)
set j = 0
loop
exitwhen(j >= total)
set rad = start + (j * angle) * bj_DEGTORAD
set x = targetX + radius * Cos(rad)
set y = targetY + radius * Sin(rad)
set face = Atan2(y - targetY, x - targetX) * bj_RADTODEG
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
if(i == 1) then
set sd.ds1[sd.t1] = CreateDestructable(TREE_ID, x, y, face, 0.8, i)
call SetDestructableAnimation(sd.ds1[sd.t1], "birth")
//call SetDestructableAnimationSpeed(sd.ds[sd.t], 15.0)
set sd.t1 = sd.t1 + 1
elseif(i == 2) then
set sd.ds2[sd.t2] = CreateDestructable(TREE_ID, x, y, face, 0.8, i)
call SetDestructableAnimation(sd.ds2[sd.t2], "birth")
//call SetDestructableAnimationSpeed(sd.ds[sd.t], 15.0)
set sd.t2 = sd.t2 + 1
elseif(i == 3) then
set sd.ds3[sd.t3] = CreateDestructable(TREE_ID, x, y, face, 0.8, i)
call SetDestructableAnimation(sd.ds3[sd.t3], "birth")
//call SetDestructableAnimationSpeed(sd.ds[sd.t], 15.0)
set sd.t3 = sd.t3 + 1
endif
endif
set j = j + 1
endloop
set i = i + 1
endloop
if(GetUnitAbilityLevel(caster, ABILITY1_ID) > 0) then
call SetPlayerAbilityAvailable(owner, ABILITY2_ID, true)
call SaveReal(BlendNatureHt, casterID, BLEND_NATURE_COOLDOWN_KEY, BLEND_NATURE_COOLDOWN)
call SaveBoolean(BlendNatureHt, casterID, BLEND_NATURE_BLENDING_KEY, true)
endif
if(item1 > 0) then
set sd.h = sd.h + (UPGRADE1_HEAL1 * item1)
set sd.m = sd.m + (UPGRADE1_MANA1 * item1)
call SetUnitVertexColor(sd.dum1, 100, 255, 100, 255)
endif
if(item2 > 0) then
set sd.h = sd.h + (UPGRADE1_HEAL2 * item2)
set sd.m = sd.m + (UPGRADE1_MANA2 * item2)
call SetUnitVertexColor(sd.dum1, 0, 255, 0, 255)
endif
if(item3 > 0) then
set sd.d = sd.d + (UPGRADE2_DURATION1 * item3)
set sd.dumExtra[0] = CreateUnit(owner, DUMMY_ID, targetX, targetY, bj_UNIT_FACING)
set sd.dumExtra[1] = null
set sd.up = true
endif
if(item4 > 0) then
set sd.d = sd.d + (UPGRADE2_DURATION2 * item4)
set sd.dumExtra[0] = CreateUnit(owner, DUMMY_ID, targetX, targetY, bj_UNIT_FACING)
set sd.dumExtra[1] = CreateUnit(owner, DUMMY_ID, targetX, targetY, bj_UNIT_FACING)
set sd.up = true
call GroupEnumUnitsInRange(all, targetX, targetY, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitAlly(f, sd.o) and (GetOwningPlayer(f) != Player(PLAYER_NEUTRAL_PASSIVE))) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = fX - sd.x
set dy = fY - sd.y
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= 300.0) then
set m = 3
elseif(distance <= 600.0) then
set m = 2
else
set m = 1
endif
call SetUnitState(f, UNIT_STATE_LIFE, GetUnitState(f, UNIT_STATE_LIFE) + (UPGRADE2_HEAL2 * item4) * m)
call SetUnitState(f, UNIT_STATE_MANA, GetUnitState(f, UNIT_STATE_MANA) + (UPGRADE2_MANA2 * item4) * m)
call Timed_AddSpecialEffectTarget(UPGRADE_EFFECT, f, "origin", 2.0)
endif
endloop
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
set s = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(ForestArisenTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(ForestArisenTrg, Condition(function Conditions))
call TriggerAddAction(ForestArisenTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
set target = Location(0, 0)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY_ID)
call AbilityPreload(ABILITY1_ID)
call AbilityPreload(ABILITY2_ID)
call Preload(SPELL_EFFECT)
call Preload(UPGRADE_EFFECT)
endfunction
endscope
//TESH.scrollpos=28
//TESH.alwaysfold=0
scope Multishots initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A06X' //Spell Multishots rawcode
private constant integer ABILITY_ID = 'A072' //Spell Lucent Arrow rawcode
private constant integer DUMMY_ID = 'n01B' //Dummy arrow rawcode
private constant real ANGLE_PER_ARROW = 6.0 //Angle
private constant integer ITEM1_UPGRADE1 = 'tels' //Item Hunting Scope
private constant integer ITEM1_UPGRADE2 = 'afac' //Item Scoutbow
private constant integer ITEM1_UPGRADE3 = 'ajen' //Item Ralex Hawk
private constant integer ITEM2_UPGRADE1 = 'gcel' //Item Gauntlet of Brawler
private constant integer ITEM2_UPGRADE2 = 'rst1' //Item Hypergloves
private constant integer ITEM2_UPGRADE3 = 'crdt' //Item Armlet of Insanity
private constant integer ITEM3_UPGRADE1 = 'I01D' //Item Larynxrage
private constant real UPGRADE1_DISTANCE1 = 200.0 //Upgrade 1 effect 2
private constant real UPGRADE1_DISTANCE2 = 400.0 //Upgrade 1 effect 3
private constant real UPGRADE1_DISTANCE3 = 600.0 //Upgrade 1 effect 4
private constant integer UPGRADE1_SHOTS2 = 1 //Upgrade 1 effect 3
private constant integer UPGRADE1_SHOTS3 = 2 //Upgrade 1 effect 4
private constant integer UPGRADE2_MAX_ARROW1 = 3 //Upgrade 2 effect 1
private constant integer UPGRADE2_MAX_ARROW2 = 6 //Upgrade 2 effect 2
private constant integer UPGRADE2_MAX_ARROW3 = 9 //Upgrade 2 effect 1
private constant real UPGRADE2_REPLENISH2 = 0.2 //Upgrade 2 effect 3
private constant real UPGRADE2_REPLENISH3 = 0.4 //Upgrade 2 effect 4
private constant real UPGRADE3_LIFE1 = 40.0 //Upgrade 3 effect 1
private constant integer LUCENT_ARROW_ITEM1_UPGRADE1 = 'I013' //Item Silverlight Toucher
private constant integer LUCENT_ARROW_ITEM1_UPGRADE2 = 'I012' //Item Arcane Heaver
private constant integer LUCENT_ARROW_ITEM1_UPGRADE3 = 'lgdh' //Item Vangage Expulsion
private constant integer LUCENT_ARROW_UPGRADE1_AMPLIFY1 = 4 //Upgrade 1 effect 1
private constant integer LUCENT_ARROW_UPGRADE1_AMPLIFY2 = 8 //Upgrade 1 effect 2
private constant integer LUCENT_ARROW_UPGRADE1_AMPLIFY3 = 12 //Upgrade 1 effect 3
private constant string SPECIAL_EFFECT = "Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl" //Attack effect
private constant string HEAL_EFFECT = "Abilities\\Spells\\Human\\Heal\\HealTarget.mdl" //Heal effect
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_NORMAL //Spell attack type
endglobals
//Replenish duration
private function Replenish takes integer level returns real
return 2.0 + (0.0 * level)
endfunction
//Max arrow
private function Max_Arrow takes integer level returns integer
return 15 + (0 * level)
endfunction
//Shots
private function Shots takes integer level returns integer
return 5 + (0 * level)
endfunction
//Distance
private function Distance takes integer level returns real
return 2000.0 + (0.0 * level)
endfunction
//Distance move
private function Distance_Move takes integer level returns real
return 80.0 + (0.0 * level)
endfunction
//Damage deal
private function Damage takes integer level returns real
if(level == 1) then
return 30.0
elseif(level == 2) then
return 40.0
elseif(level == 3) then
return 60.0
elseif(level == 4) then
return 90.0
else
return 0.0
endif
endfunction
//Radius
private function Radius takes integer level returns real
return 200.0 + (0.0 * level)
endfunction
//Amplify from Lucent Arrow
private function Amplify takes integer level returns integer
if(level == 1) then
return 16
elseif(level == 2) then
return 20
elseif(level == 3) then
return 25
else
return 0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//Interval
private function Replenish_Interval takes nothing returns real
return 1.0
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Multishots_Data
unit u //Unit caster
player o //Owner of caster
group array g[12] //Group target
integer s //Shots
real d //Distance
real dm //Distance move
real dd //Damage
real r //Radius damage
integer la //Lucent arrow level
unit array dum[12] //Array of dummies
real array cos[12] //Cos of angle
real array sin[12] //Sin of angle
endstruct
//----------------------------------------------------------------
struct Replenish_Data
unit u //Unit caster
integer uId //Caster id
integer l //Level of spell
player o //Owner of caster
real i //Interval replenish
real im //Interval max replenish
integer a //Arrow amount
integer am //Max arrow amount
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Multishots_Data array Ar[10]
private timer Tim2
private integer Total2
private Replenish_Data array Ar2[10]
private location loc
private group all
private group copy
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute2 takes nothing returns nothing
local Replenish_Data sd
local integer i = 0
local real angle = 0.0
local string text = ""
local integer item4 = 0
local integer item5 = 0
local integer item6 = 0
loop
exitwhen(i >= Total2)
set sd = Ar2[i]
set item4 = IsUnitHasItemType(sd.u, ITEM2_UPGRADE1)
set item5 = IsUnitHasItemType(sd.u, ITEM2_UPGRADE2)
set item6 = IsUnitHasItemType(sd.u, ITEM2_UPGRADE3)
set sd.am = Max_Arrow(sd.l)
if(item4 > 0) then
set sd.am = sd.am + (UPGRADE2_MAX_ARROW1 * item4)
endif
if(item5 > 0) then
set sd.am = sd.am + (UPGRADE2_MAX_ARROW2 * item5)
endif
if(item6 > 0) then
set sd.am = sd.am + (UPGRADE2_MAX_ARROW3 * item6)
endif
if(sd.a < sd.am) then
if(sd.i > 0.0) then
set sd.i = sd.i - Replenish_Interval()
else
set sd.i = sd.im
set sd.a = sd.a + 1
if(item5 > 0) then
set sd.i = sd.i - (UPGRADE2_REPLENISH2 * item5)
endif
if(item6 > 0) then
set sd.i = sd.i - (UPGRADE2_REPLENISH3 * item6)
endif
if(not IsUnitDead(sd.u)) then
set angle = GetUnitFacing(sd.u)
set text = ""
if(GetLocalPlayer() == sd.o) then
set text = I2S(sd.a)
endif
call TextTag_AttachUnit(text, 10.0 * 0.023 / 10.0, sd.u, 30.0, /*
*/R2I(0.0 * 255.0 * 0.01), R2I(0.0 * 255.0 * 0.01), R2I(100.0 * 255.0 * 0.01), R2I(100.0 * 255.0 * 0.01), /*
*/50.0 * 0.071 / 128.0 * Cos(90.0 * bj_DEGTORAD), 50.0 * 0.071 / 128.0 * Sin(90.0 * bj_DEGTORAD), /*
*/false, 5.00, 1.75)
endif
endif
endif
set i = i + 1
endloop
if Total2 == 0 then
call PauseTimer(Tim2)
endif
set text = null
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Multishots_Data sd
local integer i = 0
local integer j = 0
local real x = 0.0
local real y = 0.0
local unit f = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.d > 0) then
set sd.d = sd.d - sd.dm
set j = 0
loop
exitwhen(j >= sd.s)
if(sd.dum[j] != null) then
set x = GetUnitX(sd.dum[j]) + sd.dm * sd.cos[j]
set y = GetUnitY(sd.dum[j]) + sd.dm * sd.sin[j]
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
call SetUnitX(sd.dum[j], x)
call SetUnitY(sd.dum[j], y)
endif
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (IsUnitEnemy(f, sd.o) and (not IsUnitInGroup(f, sd.g[j]))) then
call GroupAddUnit(sd.g[j], f)
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
if(sd.la > 0) then
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, f, "chest"))
endif
endif
endloop
endif
set j = j + 1
endloop
else
set j = 0
loop
exitwhen(j >= sd.s)
loop
set f = FirstOfGroup(sd.g[j])
exitwhen(f == null)
call GroupRemoveUnit(sd.g[j], f)
endloop
if(sd.dum[j] != null) then
call KillUnit(sd.dum[j])
set sd.dum[j] = null
endif
set j = j + 1
endloop
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Multishots_Data sd = Multishots_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local integer lucentLevel = GetUnitAbilityLevel(caster, ABILITY_ID)
local integer amplify = 0
local player owner = GetOwningPlayer(caster)
local unit target = GetSpellTargetUnit()
local real targetX = 0.0
local real targetY = 0.0
local real facing = 0.0
local integer shots = 0
local real rad = 0.0
local real angle = 0.0
local real face = 0.0
local integer i = 0
local boolean isNull = (Ar[Total] == null)
local Replenish_Data rd
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item7 = IsUnitHasItemType(caster, ITEM3_UPGRADE1)
local real lifeGain = 0.0
local integer lucentArrowItem1 = IsUnitHasItemType(caster, LUCENT_ARROW_ITEM1_UPGRADE1)
local integer lucentArrowItem2 = IsUnitHasItemType(caster, LUCENT_ARROW_ITEM1_UPGRADE2)
local integer lucentArrowItem3 = IsUnitHasItemType(caster, LUCENT_ARROW_ITEM1_UPGRADE3)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_CP_Multishots
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
if(target == null) then
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
else
set targetX = GetUnitX(target)
set targetY = GetUnitY(target)
endif
set facing = Atan2(targetY - casterY, targetX - casterX) * bj_RADTODEG
set i = 0
loop
exitwhen(i >= Total2)
set rd = Ar2[i]
if(caster == rd.u) then
set shots = IMinBJ(rd.a, Shots(level))
set rd.a = rd.a - shots
set i = Total2
endif
set i = i + 1
endloop
set shots = IMaxBJ(shots, 1)
if(item2 > 0) then
set shots = shots + (UPGRADE1_SHOTS2 * item2)
endif
if(item3 > 0) then
set shots = shots + (UPGRADE1_SHOTS3 * item3)
endif
if(shots > 1) then
set angle = (ANGLE_PER_ARROW * shots) / (shots - 1)
set face = facing - ((ANGLE_PER_ARROW * shots) / 2)
else
set angle = 0.0
set face = facing
endif
if(isNull) then
set sd = Multishots_Data.create()
set i = 0
loop
exitwhen(i >= shots)
set sd.g[i] = CreateGroup()
set i = i + 1
endloop
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.o = owner
set sd.s = shots
set sd.d = Distance(level)
set sd.dm = Distance_Move(level)
set sd.dd = Damage(level) + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.r = Radius(level)
set sd.la = 0
if(item1 > 0) then
set sd.d = sd.d + (UPGRADE1_DISTANCE1 * item1)
endif
if(item2 > 0) then
set sd.d = sd.d + (UPGRADE1_DISTANCE2 * item2)
endif
if(item3 > 0) then
set sd.d = sd.d + (UPGRADE1_DISTANCE3 * item3)
endif
if(lucentLevel > 0) then
set amplify = Amplify(lucentLevel)
if(lucentArrowItem1 > 0) then
set amplify = amplify + (LUCENT_ARROW_UPGRADE1_AMPLIFY1 * lucentArrowItem1)
endif
if(lucentArrowItem2 > 0) then
set amplify = amplify + (LUCENT_ARROW_UPGRADE1_AMPLIFY2 * lucentArrowItem2)
endif
if(lucentArrowItem3 > 0) then
set amplify = amplify + (LUCENT_ARROW_UPGRADE1_AMPLIFY3 * lucentArrowItem3)
endif
set sd.dd = sd.dd + (sd.dd * amplify * 0.01)
set sd.la = lucentLevel
endif
set lifeGain = 0.0
set i = 0
loop
exitwhen(i >= shots)
set sd.dum[i] = CreateUnit(owner, DUMMY_ID, casterX, casterY, face + angle * i)
set rad = GetUnitFacing(sd.dum[i]) * bj_DEGTORAD
set sd.cos[i] = Cos(rad)
set sd.sin[i] = Sin(rad)
if(item7 > 0) then
set lifeGain = lifeGain + (UPGRADE3_LIFE1 * item7)
endif
set i = i + 1
endloop
if(lifeGain > 0.0) then
call SetUnitState(caster, UNIT_STATE_LIFE, GetUnitState(caster, UNIT_STATE_LIFE) + lifeGain)
call DestroyEffect(AddSpecialEffectTarget(HEAL_EFFECT, caster, "head"))
endif
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set owner = null
set target = null
set s = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local unit learner = GetLearningUnit()
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
local Replenish_Data sd
local integer i = 0
if(GetUnitAbilityLevel(learner, SPELL_ID) <= 1) then
set sd = Replenish_Data.create()
set sd.u = learner
set sd.uId = GetUnitUserData(learner)
set sd.l = level
set sd.o = GetOwningPlayer(learner)
set sd.i = 0.0
set sd.im = Replenish(level)
set sd.a = Max_Arrow(level)
set sd.am = sd.a
if(Total2 <= 0) then
call TimerStart(Tim2, Replenish_Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = sd
else
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set sd.l = level
set sd.im = Replenish(level)
set sd.am = Max_Arrow(level)
endif
set i = i + 1
endloop
endif
set learner = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
return GetLearnedSkill() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(MultishotsTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(MultishotsTrg, Condition(function Conditions))
call TriggerAddAction(MultishotsTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(MultishotsLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(MultishotsLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(MultishotsLearnTrg, function Learn_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set Tim2 = CreateTimer()
set Total2 = 0
set loc = Location(0, 0)
set all = CreateGroup()
set copy = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY_ID)
call Preload(SPECIAL_EFFECT)
endfunction
endscope
//TESH.scrollpos=2
//TESH.alwaysfold=0
scope TigerLeap initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A09O' //Spell Tiger Slam rawcode
private constant integer CAST_ID = 'A070' //Cast Tiger Slam (Dummy) rawcode
private constant integer CAST1_ID = 'A0BN' //Cast Tiger Slam (Dummy) rawcode
private constant integer BUFF_ID = 'B022' //Buff Tiger Slam rawcode
private constant real DELAY = 0.2 //Delay
private constant real NEXT_JUMP_DISTANCE = 50.0 //Next jump distance
private constant integer ANIME = 6 //Animation
private constant integer ITEM1_UPGRADE1 = 'I016' //Item Expidition Footgear
private constant integer ITEM1_UPGRADE2 = 'bpsd' //Item Boots of Speed
private constant integer ITEM1_UPGRADE3 = 'I016' //Item Jungle Runner
private constant integer ITEM2_UPGRADE1 = 'I008' //Item Mania Cestus
private constant integer ITEM2_UPGRADE2 = 'I011' //Item Fist of Firebringer
private constant integer ITEM3_UPGRADE1 = 'I01P' //Item Anexiler
private constant real UPGRADE1_DAMAGE1 = 20.0 //Upgrade 1 effect 1
private constant real UPGRADE1_DAMAGE2 = 50.0 //Upgrade 1 effect 2
private constant real UPGRADE1_DAMAGE3 = 80.0 //Upgrade 1 effect 3
private constant integer UPGRADE1_JUMP3 = 1 //Upgrade 1 effect 3
private constant real UPGRADE2_DISTANCE_MOVE1 = 10.0 //Upgrade 2 effect 1
private constant real UPGRADE2_DISTANCE_MOVE2 = 20.0 //Upgrade 2 effect 2
private constant integer UPGRADE2_TARGET_STUN_AMOUNT1 = 1 //Upgrade 2 effect 1
private constant integer UPGRADE2_TARGET_STUN_AMOUNT2 = 2 //Upgrade 2 effect 2
private constant real UPGRADE3_RADIUS1 = 50.0 //Upgrade 3 effect 1
private constant string SPELL_EFFECT = "Abilities\\Spells\\NightElf\\Taunt\\TauntCaster.mdl" //Spell effect
private constant damagetype D_TYPE = DAMAGE_TYPE_NORMAL //Spell attack type
private constant attacktype A_TYPE = ATTACK_TYPE_MAGIC //Spell damage type
endglobals
//Jump
private function Jump takes integer level returns integer
return 1 + (0 * level)
endfunction
//Distance
private function Distance takes integer level returns real
return 800.0 + (0.0 * level)
endfunction
//Distance move
private function Distance_Move takes integer level returns real
return 60.0 + (0.0 * level)
endfunction
//Height max
private function Height_Max takes integer level returns real
return 200.0 + (0.0 * level)
endfunction
//Radius
private function Radius takes integer level returns real
return 300.0 + (0.0 * level)
endfunction
//Damage
private function Damage takes integer level returns real
if(level == 1) then
return 80.0
elseif(level == 2) then
return 150.0
elseif(level == 3) then
return 240.0
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_FLYING) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct TigerLeap_Data
unit u //Unit caster
integer l //Level of spell
player o //Owner of caster
real i //Interval delay
boolean f //Finish delay
integer j //Jump
real d //Distance
real dm //Distance move
real cos //Cos of angle
real sin //Sin of angle
real c //Counter
real cm //Counter move
real mh //Height maximum
real r //Radius
real dd //Damage
boolean up //Upgrade
integer ts //Target stun amount
integer tsm //Target stun amount max
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private TigerLeap_Data array Ar[10]
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local TigerLeap_Data sd
local integer i = 0
local real x = 0.0
local real y = 0.0
local real height = 0.0
local unit f = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
set x = GetUnitX(sd.u) + 10.0 * sd.cos
set y = GetUnitY(sd.u) + 10.0 * sd.sin
set height = sd.mh * Sin(sd.c)
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0)) and (not IsBarrel(sd.u, x, y, 100.0))) then
call SetUnitX(sd.u, x)
call SetUnitY(sd.u, y)
endif
elseif(not sd.f) then
set sd.f = true
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, x, y))
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
if(GetUnitAbilityLevel(f, BUFF_ID) <= 0) then
if(not sd.up) then
call TargetCast(sd.o, x, y, 0.5, CAST_ID, sd.l, "slow", 0, f)
else
call TargetCast(sd.o, x, y, 0.5, CAST_ID, sd.l + 3, "slow", 0, f)
endif
endif
endif
endloop
elseif(sd.j > 0) then
if(sd.d > 0.0) then
set x = GetUnitX(sd.u) + sd.dm * sd.cos
set y = GetUnitY(sd.u) + sd.dm * sd.sin
set height = sd.mh * Sin(sd.c)
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0)) and (not IsBarrel(sd.u, x, y, 100.0))) then
call SetUnitX(sd.u, x)
call SetUnitY(sd.u, y)
endif
call SetUnitFlyHeight(sd.u, height, 0.0)
set sd.c = sd.c + sd.cm
set sd.d = sd.d - sd.dm
else
set sd.j = sd.j - 1
set sd.c = 0.0
set sd.d = NEXT_JUMP_DISTANCE
set sd.ts = sd.tsm
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
call PauseUnit(sd.u, true)
call PauseUnit(sd.u, false)
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, x, y))
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
if(GetUnitAbilityLevel(f, BUFF_ID) <= 0) then
if(not sd.up) then
call TargetCast(sd.o, x, y, 0.5, CAST_ID, sd.l, "slow", 0, f)
else
call TargetCast(sd.o, x, y, 0.5, CAST_ID, sd.l + 3, "slow", 0, f)
endif
endif
if(sd.ts > 0) then
call TargetCast(sd.o, x, y, 0.5, CAST1_ID, 1, "stun", 0, f)
set sd.ts = sd.ts - 1
endif
endif
endloop
endif
else
call SetUnitFlyHeight(sd.u, 0.0, 0.0)
call SetUnitPathing(sd.u, true)
//call PauseUnit(sd.u, false)
call SetUnitAnimation(sd.u, "stand")
call SetUnitTimeScale(sd.u, 1.0)
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, x, y))
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
if(GetUnitAbilityLevel(f, BUFF_ID) <= 0) then
if(not sd.up) then
call TargetCast(sd.o, x, y, 0.5, CAST_ID, sd.l, "slow", 0, f)
else
call TargetCast(sd.o, x, y, 0.5, CAST_ID, sd.l + 3, "slow", 0, f)
endif
endif
if(sd.ts > 0) then
call TargetCast(sd.o, x, y, 0.5, CAST1_ID, 1, "stun", 0, f)
set sd.ts = sd.ts - 1
endif
endif
endloop
call Pather(sd.u, 1.5)
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local TigerLeap_Data sd = TigerLeap_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
local real face = GetUnitFacing(caster)
local real rad = face * bj_DEGTORAD
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item6 = IsUnitHasItemType(caster, ITEM3_UPGRADE1)
set sd.u = caster
set sd.l = level
set sd.o = owner
set sd.i = DELAY
set sd.f = false
set sd.j = Jump(level)
set sd.d = Distance(level)
set sd.dm = Distance_Move(level)
set sd.cos = Cos(rad)
set sd.sin = Sin(rad)
set sd.c = 0.0
set sd.cm = sd.dm * 3.5 / sd.d
set sd.mh = Height_Max(level)
set sd.r = Radius(level)
set sd.dd = Damage(level) + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.up = false
set sd.ts = 0
set sd.tsm = 0
call UnitAddAbility(caster, 'Arav')
call UnitRemoveAbility(caster, 'Arav')
call SetUnitPathing(caster, false)
//call PauseUnit(caster, true)
call SetUnitAnimationByIndex(caster, ANIME)
call SetUnitTimeScale(caster, 2.0)
if(item1 > 0) then
set sd.dd = sd.dd + (UPGRADE1_DAMAGE1 * item1)
endif
if(item2 > 0) then
set sd.dd = sd.dd + (UPGRADE1_DAMAGE2 * item2)
endif
if(item3 > 0) then
set sd.dd = sd.dd + (UPGRADE1_DAMAGE3 * item3)
set sd.j = sd.j + (UPGRADE1_JUMP3 * item3)
endif
if(item4 > 0) then
set sd.dm = sd.dm + (UPGRADE2_DISTANCE_MOVE1 * item4)
set sd.ts = sd.ts + (UPGRADE2_TARGET_STUN_AMOUNT1 * item4)
set sd.tsm = sd.ts
endif
if(item5 > 0) then
set sd.dm = sd.dm + (UPGRADE2_DISTANCE_MOVE2 * item4)
set sd.up = true
set sd.ts = sd.ts + (UPGRADE2_TARGET_STUN_AMOUNT1 * item4)
set sd.tsm = sd.ts
endif
if(item6 > 0) then
set sd.r = sd.r + (UPGRADE3_RADIUS1 * item6)
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(TigerLeapTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(TigerLeapTrg, Condition(function Conditions))
call TriggerAddAction(TigerLeapTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=18
//TESH.alwaysfold=0
scope LucentArrow initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A072' //Spell Lucent Arrow rawcode
private constant integer CAST_ID = 'A073' //Cast Lucent Arrow (Dummy) rawcode
private constant integer BUFF_ID = 'B023' //Buff Lucent Arrow rawcode
private constant integer ABILITY_ID = 'A074' //Ability Lucent Arrow (Attack Speed) rawcode
private constant integer ITEM1_UPGRADE1 = 'I013' //Item Silverlight Toucher
private constant integer ITEM1_UPGRADE2 = 'I012' //Item Arcane Heaver
private constant integer ITEM1_UPGRADE3 = 'lgdh' //Item Vangage Expulsion
private constant integer ITEM2_UPGRADE1 = 'I01J' //Item Lightning Gripper
private constant integer ITEM2_UPGRADE2 = 'I028' //Item Stormanifer
private constant integer UPGRADE1_AMPLIFY1 = 4 //Upgrade 1 effect 1
private constant integer UPGRADE1_AMPLIFY2 = 8 //Upgrade 1 effect 2
private constant integer UPGRADE1_AMPLIFY3 = 12 //Upgrade 1 effect 3
private constant real UPGRADE2_MANA1 = 1.0 //Upgrade 1 effect 1
private constant real UPGRADE2_MANA2 = 2.0 //Upgrade 1 effect 2
private constant damagetype D_TYPE = DAMAGE_TYPE_MAGIC //Spell attack type
private constant attacktype A_TYPE = ATTACK_TYPE_MAGIC //Spell damage type
private constant string SPELL_EFFECT = "Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl" //Attack effect
endglobals
//Amplify
private function Amplify takes integer level returns integer
if(level == 1) then
return 16
elseif(level == 2) then
return 20
elseif(level == 3) then
return 25
else
return 0
endif
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
endglobals
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit attacker = GetAttacker()
local real attackerX = GetUnitX(attacker)
local real attackerY = GetUnitY(attacker)
local player owner = GetOwningPlayer(attacker)
local unit attacked = GetTriggerUnit()
local unit f = null
if(GetUnitAbilityLevel(attacked, BUFF_ID) <= 0) then
call TargetCast(owner, attackerX, attackerY, 0.5, CAST_ID, 1, "curse", 0, attacked)
endif
set attacker = null
set owner = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit attacker = GetAttacker()
local boolean okey = GetUnitAbilityLevel(attacker, SPELL_ID) > 0
if(not okey and GetUnitAbilityLevel(attacker, ABILITY_ID) > 0) then
call UnitRemoveAbility(attacker, ABILITY_ID)
endif
set attacker = null
return okey
endfunction
//----------------------------------------------------------------
function LucentArrow_onDamage takes unit attacker, unit attacked, real amount returns nothing
local integer attackerID = GetUnitUserData(attacker)
local integer level = GetUnitAbilityLevel(attacker, SPELL_ID)
local integer amplify = Amplify(level)
local real damage = 0.0
local real magic = 0.0
local integer item1 = IsUnitHasItemType(attacker, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(attacker, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(attacker, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(attacker, ITEM2_UPGRADE1)
local integer item5 = IsUnitHasItemType(attacker, ITEM2_UPGRADE2)
local real manaGain = 0.0
if(item1 > 0) then
set amplify = amplify + (UPGRADE1_AMPLIFY1 * item1)
endif
if(item2 > 0) then
set amplify = amplify + (UPGRADE1_AMPLIFY2 * item2)
endif
if(item3 > 0) then
set amplify = amplify + (UPGRADE1_AMPLIFY3 * item3)
endif
set damage = LoadInteger(MagicDamage_Ht, attackerID, 0) + amplify
set magic = (amount * damage * 0.01)
call UnitRemoveAbility(attacked, BUFF_ID)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, attacked, "chest"))
call UnitDamageTarget(attacker, attacked, magic, false, false, A_TYPE, D_TYPE, null)
if(item4 > 0) then
set manaGain = manaGain + (UPGRADE2_MANA1 * item4)
endif
if(item5 > 0) then
set manaGain = manaGain + (UPGRADE2_MANA2 * item5)
endif
if(manaGain > 0) then
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, attacker, "chest"))
call SetUnitState(attacker, UNIT_STATE_MANA, GetUnitState(attacker, UNIT_STATE_MANA) + manaGain)
endif
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local unit learner = GetLearningUnit()
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
if(level == 1) then
call UnitAddAbility(learner, ABILITY_ID)
//call AddSpecialEffectTarget(SPELL_EFFECT, learner, "weapon")
else
call SetUnitAbilityLevel(learner, ABILITY_ID, level)
endif
set learner = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
local unit learner = GetTriggerUnit()
local boolean okey = GetLearnedSkill() == SPELL_ID and (not IsUnitIllusion(learner))
set learner = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(LucentArrowLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(LucentArrowLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(LucentArrowLearnTrg, function Learn_Actions)
call TriggerRegisterAnyUnitEventBJ(LucentArrowTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(LucentArrowTrg, Condition(function Conditions))
call TriggerAddAction(LucentArrowTrg, function Actions)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call AbilityPreload(ABILITY_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=337
//TESH.alwaysfold=0
scope Watcher initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A06Y' //Spell Watcher rawcode
private constant integer DUMMY_ID = 'n01C' //Dummy Watcher rawcode
private constant integer DUMMY1_ID = 'n02D' //Dummy Revealer rawcode
private constant integer ABILITY_ID = 'A07K' //Ability Watcher (Damage) rawcode
private constant integer ABILITY1_ID = 'A0BO' //Ability Watcher (Sight Range) rawcode
private constant integer ABILITY2_ID = 'Adtg' //Ability True Sight rawcode
private constant integer CAST_ID = 'A0BP' //Cast Watcher's Guard rawcode
private constant real DISTANCE_MOVE = 30.0 //Distance move
private constant real INTERVAL_CHECK = 0.5 //Interval check
private constant integer ITEM1_UPGRADE1 = 'I01Q' //Item Book of Spirit
private constant integer ITEM1_UPGRADE2 = 'I01R' //Item Shadow Grimoire
private constant integer ITEM2_UPGRADE1 = 'I01X' //Item Oversurge
private constant integer ITEM2_UPGRADE2 = 'I01W' //Item Ghost Veil
private constant integer ITEM3_UPGRADE1 = 'I01U' //Item Royaltouch
private constant integer ITEM3_UPGRADE2 = 'rnsp' //Item Ivory Halo
private constant real UPGRADE1_RADIUS1 = 400.0 //Upgrade 1 effect
private constant real UPGRADE1_RADIUS2 = 800.0 //Upgrade 2 effect
private constant real UPGRADE2_MAX_INTERVAL = 5.0 //Upgrade 3 effect 1
private constant real UPGRADE2_INTERVAL1 = 0.5 //Upgrade 3 effect 1
private constant real UPGRADE2_INTERVAL2 = 1.0 //Upgrade 3 effect 2
private constant real UPGRADE2_WARNING_RADIUS = 500.0 //Upgrade 2 effect 2
private constant real UPGRADE2_DURATION1 = 4.0 //Upgrade 3 effect 1
private constant real UPGRADE2_DURATION2 = 10.0 //Upgrade 3 effect 2
private constant real UPGRADE3_HEAL1 = 0.05 //Upgrade 3 effect 1
private constant real UPGRADE3_HEAL2 = 0.1 //Upgrade 3 effect 2
private constant real UPGRADE3_MANA2 = 0.05 //Upgrade 3 efefct 2
endglobals
//Duration
private function Duration takes integer level returns real
if(level == 1) then
return 20.0
elseif(level == 2) then
return 30.0
elseif(level == 3) then
return 40.0
else
return 0.0
endif
endfunction
//Radius
private function Radius takes integer level returns real
return 2000.0 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_HERO) == true) and/*
*/(GetUnitTypeId(target) != 'Uwar') and/*
*/(GetUnitTypeId(target) != 'U000')
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Watcher_Data
unit u //Unit caster
integer l //Level of spell
player o //Owner of caster
unit t //Unit target
unit dum //Unit dummy
unit rv //Unit revealer
boolean h //Reach target
real d //Duration
real r //Radius
real i //Interval
real im //Max interval
unit dt //Detect unit
boolean wr //Warning
integer wrm //Warming mode
real wri //Warning interval
boolean wg //Watcher guard
real wgi //Watcher guard interval
real wgim //Watcher guard interval max
real hl //Heal percent
real mr //Mana restore
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Watcher_Data array Ar[10]
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Watcher_Data sd
local integer i = 0
local real cX = 0.0
local real cY = 0.0
local real tX = 0.0
local real tY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local real rad = 0.0
local real x = 0.0
local real y = 0.0
local real minDistance = 0.0
local boolean init = false
local unit f = null
local real fX = 0.0
local real fY = 0.0
local real face = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(not sd.h) then
set cX = GetUnitX(sd.dum)
set cY = GetUnitY(sd.dum)
set tX = GetUnitX(sd.t)
set tY = GetUnitY(sd.t)
set dx = cX - tX
set dy = cY - tY
set distance = SquareRoot(dx * dx + dy * dy)
set rad = Atan2(tY - cY, tX - cX)
if(distance > DISTANCE_MOVE) then
set x = cX + DISTANCE_MOVE * Cos(rad)
set y = cY + DISTANCE_MOVE * Sin(rad)
call SetUnitX(sd.dum, x)
call SetUnitY(sd.dum, y)
else
set sd.h = true
call SetUnitAnimation(sd.dum, "stand")
call UnitAddAbility(sd.t, ABILITY_ID)
if(sd.hl > 0.0) then
call SetUnitState(sd.t, UNIT_STATE_LIFE, GetUnitState(sd.t, UNIT_STATE_LIFE) + GetUnitState(sd.t, UNIT_STATE_MAX_LIFE) * sd.hl)
endif
if(sd.mr > 0.0) then
call SetUnitState(sd.t, UNIT_STATE_MANA, GetUnitState(sd.t, UNIT_STATE_MANA) + GetUnitState(sd.t, UNIT_STATE_MAX_MANA) * sd.mr)
endif
endif
elseif(sd.d > 0.0) then
set sd.d = sd.d - Interval()
set x = GetUnitX(sd.t)
set y = GetUnitY(sd.t)
call SetUnitX(sd.dum, x)
call SetUnitY(sd.dum, y)
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
set minDistance = 0.0
set init = false
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (IsUnitEnemy(f, sd.o)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = x - fX
set dy = y - fY
set distance = SquareRoot(dx * dx + dy * dy)
if(not init) then
set minDistance = distance
set init = true
set sd.dt = f
else
if(distance < minDistance) then
set minDistance = distance
set sd.dt = f
endif
endif
endif
endloop
endif
if(sd.dt != null) then
set tX = GetUnitX(sd.dt)
set tY = GetUnitY(sd.dt)
set face = Atan2(tY - y, tX - x) * bj_RADTODEG
call SetUnitX(sd.rv, tX)
call SetUnitY(sd.rv, tY)
call SetUnitFacing(sd.rv, GetUnitFacing(sd.dt))
call SetUnitFacing(sd.dum, face)
call SetUnitAbilityLevel(sd.t, ABILITY_ID, sd.l + 1)
call SetUnitVertexColor(sd.rv, 255, 255, 255, 150)
if(sd.wr) then
if(sd.wri > 0.0) then
set sd.wri = sd.wri - Interval()
else
set sd.wri = 0.1
if(sd.wrm == 0) then
set sd.wrm = 1
call SetUnitVertexColor(sd.dum, 255, 0, 0, 255)
else
set sd.wrm = 0
call SetUnitVertexColor(sd.dum, 255, 255, 255, 255)
endif
endif
endif
else
set tX = GetUnitX(sd.t)
set tY = GetUnitY(sd.t)
set face = GetUnitFacing(sd.t)
call SetUnitX(sd.rv, tX)
call SetUnitY(sd.rv, tY)
call SetUnitFacing(sd.dum, face)
call SetUnitAbilityLevel(sd.t, ABILITY_ID, 1)
call SetUnitVertexColor(sd.rv, 255, 255, 255, 0)
if(sd.wr) then
if(sd.wrm == 1) then
set sd.wrm = 0
call SetUnitVertexColor(sd.dum, 255, 255, 255, 255)
endif
set sd.wri = 0.1
endif
endif
if(sd.wg) then
if(sd.wgi > 0.0) then
set sd.wgi = sd.wgi - Interval()
else
set sd.wgi = sd.wgim
call TargetCast(sd.o, x, y, 0.5, CAST_ID, 1, "invisibility", 0, sd.t)
endif
endif
else
call KillUnit(sd.dum)
call RemoveUnit(sd.rv)
if(sd.t != null) then
call UnitRemoveAbility(sd.t, ABILITY_ID)
endif
set sd.u = null
set sd.o = null
set sd.t = null
set sd.dum = null
set sd.rv = null
set sd.dt = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Watcher_Data sd = Watcher_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local real face = GetUnitFacing(caster)
local player owner = GetOwningPlayer(caster)
local unit target = GetSpellTargetUnit()
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item5 = IsUnitHasItemType(caster, ITEM3_UPGRADE1)
local integer item6 = IsUnitHasItemType(caster, ITEM3_UPGRADE2)
set sd.u = caster
set sd.l = level
set sd.o = owner
set sd.t = target
set sd.dum = CreateUnit(owner, DUMMY_ID, casterX, casterY, face)
set sd.rv = CreateUnit(owner, DUMMY1_ID, casterX, casterY, face)
call UnitAddAbility(sd.rv, ABILITY1_ID)
if(item1 > 0) then
call SetUnitAbilityLevel(sd.rv, ABILITY1_ID, GetUnitAbilityLevel(sd.rv, ABILITY1_ID) + item1)
endif
if(item2 > 0) then
call SetUnitAbilityLevel(sd.rv, ABILITY1_ID, GetUnitAbilityLevel(sd.rv, ABILITY1_ID) + item2)
endif
call SetUnitVertexColor(sd.rv, 255, 255, 255, 0)
set sd.h = false
set sd.d = Duration(level)
set sd.r = Radius(level)
set sd.i = 0.0
set sd.im = INTERVAL_CHECK
set sd.dt = null
set sd.wr = false
set sd.wrm = 0
set sd.wri = 0.0
set sd.wg = false
set sd.wgi = 0.0
set sd.wgim = 0.0
set sd.hl = 0.0
set sd.mr = 0.0
if(item1 > 0) then
set sd.r = sd.r + (UPGRADE1_RADIUS1 * item1)
endif
if(item2 > 0) then
set sd.r = sd.r + (UPGRADE1_RADIUS2 * item2)
endif
if(item3 > 0) then
set sd.wg = true
set sd.wgi = 0.0
set sd.wgim = UPGRADE2_MAX_INTERVAL - (UPGRADE2_INTERVAL1 * (item3 - 1))
set sd.d = sd.d + (UPGRADE2_DURATION1 * item3)
endif
if(item4 > 0) then
set sd.wr = true
set sd.wrm = 0
set sd.wri = 1.0
set sd.wg = true
set sd.wgi = 0.0
set sd.wgim = UPGRADE2_MAX_INTERVAL - (UPGRADE2_INTERVAL2 * (item4 - 1))
set sd.d = sd.d + (UPGRADE2_DURATION2 * item4)
endif
if(item5 > 0) then
set sd.hl = sd.hl + (UPGRADE3_HEAL1 * item5)
endif
if(item6 > 0) then
set sd.hl = sd.hl + (UPGRADE3_HEAL2 * item6)
set sd.mr = sd.mr + (UPGRADE3_MANA2 * item6)
endif
call SetUnitAnimation(sd.dum, "birth")
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
set target = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(WatcherTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(WatcherTrg, Condition(function Conditions))
call TriggerAddAction(WatcherTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY_ID)
endfunction
endscope
//TESH.scrollpos=1
//TESH.alwaysfold=0
scope HeavensTwilight initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A071' //Spell HeavensTwilight rawcode
private constant integer EFFECT_KEY = 0 //Effect key
private constant real MANA_DECREASE_DURATION = 3.0 //Duration decrease
private constant integer ITEM1_UPGRADE1 = 'I00G' //Item Guardian's Helm
private constant integer ITEM1_UPGRADE2 = 'I01F' //Item Ataraxia Sparta
private constant integer ITEM1_UPGRADE3 = 'I01G' //Item Throne of Emperor
private constant integer ITEM2_UPGRADE1 = 'kpin' //Item Medallion of Talent
private constant integer ITEM2_UPGRADE2 = 'spsh' //Item Dream Sphere
private constant integer ITEM2_UPGRADE3 = 'I009' //Item Prime Lucent
private constant real UPGRADE1_DURATION1 = 8.0 //Upgrade 1 effect 1
private constant real UPGRADE1_DURATION2 = 16.0 //Upgrade 1 effect 2
private constant real UPGRADE1_DURATION3 = 24.0 //Upgrade 1 effect 3
private constant integer UPGRADE2_MAGIC1 = 5 //Upgrade 2 effect 1
private constant integer UPGRADE2_MAGIC2 = 10 //Upgrade 2 effect 2
private constant integer UPGRADE2_MAGIC3 = 25 //Upgrade 2 effect 3
private constant real UPGRADE2_AMPLIFY_RADIUS3 = 200.0 //Upgrade 2 effect 3
private constant string SPELL_EFFECT = "Abilities\\Spells\\NightElf\\Starfall\\StarfallCaster.mdl" //Spell effect
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Undead\\ReplenishMana\\ReplenishManaCaster.mdl" //Spell effect
private constant string UPGRADE_EFFECT = "Abilities\\Spells\\Undead\\ReplenishMana\\ReplenishManaCasterOverhead.mdl" //Upgrade effect
private constant attacktype A_TYPE = ATTACK_TYPE_MAGIC //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_UNIVERSAL //Spell attack type
endglobals
//Duration
private function Duration takes integer level returns real
return 20.0 + (0.0 * level)
endfunction
//Radius
private function Radius takes integer level returns real
return 1000.0 + (0.0 * level)
endfunction
//Magic increase
private function Magic_Increase takes integer level returns integer
return 0 + (50 * level)
endfunction
//Mana decrease radius
private function Mana_Radius takes integer level returns real
return 600.0 + (0.0 * level)
endfunction
//Amplify mana decrease radius
private function Amplify_Radius takes integer level returns real
return 200.0 + (0.0 * level)
endfunction
//Mana decrease
private function Mana_Decrease takes integer level returns real
if(level == 1) then
return 50.0
elseif(level == 2) then
return 100.0
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_HERO) == true) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false)
endfunction
//Unit affected
private function Targets2 takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 1.0
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct HeavensTwilight_Data
unit u //Unit caster
integer l //Level of spell
player o //Owner of caster
group g //Group target
hashtable ht //Hashtable
real d //Duration
integer m //Magic increase
real r //Radius
real ar //Amplify radius
real mn //Mana decrease
real md //Mana decrease duration
integer c //Count
real i //Interval
real im //Interval max
effect e //Effect
boolean up //Upgrade
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private HeavensTwilight_Data array Ar[10]
private group copy
private group all
private boolexpr bexpr
private boolexpr bexpr2
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Pick2 takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets2(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local HeavensTwilight_Data sd
local integer i = 0
local unit f = null
local real fX = 0.0
local real fY = 0.0
local integer fId = 0
local unit g = null
local real mana = 0.0
local integer magic = 0
local boolean exist = false
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.d > 0.0) then
set sd.d = sd.d - Interval()
set exist = false
if(sd.c > 0) then
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
set exist = true
set sd.c = sd.c - 1
endif
endif
if(not exist) then
if(sd.md > 0.0) then
set sd.md = sd.md - Interval()
endif
endif
set copy = CopyGroup(sd.g)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not IsUnitDead(f)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set fId = GetUnitUserData(f)
if(exist) then
call DestroyEffect(LoadEffectHandle(sd.ht, fId, EFFECT_KEY))
call SaveEffectHandle(sd.ht, fId, EFFECT_KEY, AddSpecialEffectTarget(SPELL_EFFECT, f, "origin"))
if(sd.up) then
call DestroyEffect(AddSpecialEffectTarget(UPGRADE_EFFECT, f, "overhead"))
endif
endif
if(sd.md > 0.0) then
call GroupEnumUnitsInRange(all, fX, fY, sd.r, bexpr2)
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
if(IsUnitEnemy(g, sd.o)) then
set mana = GetUnitState(g, UNIT_STATE_MANA)
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, g, "origin"))
if(mana > sd.mn) then
call SetUnitState(g, UNIT_STATE_MANA, mana - sd.mn)
else
call UnitDamageTarget(sd.u, g, sd.mn, true, false, A_TYPE, D_TYPE, null)
endif
endif
endloop
call GroupEnumUnitsInRange(all, fX, fY, sd.ar, bexpr2)
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
if(IsUnitEnemy(g, sd.o)) then
set mana = GetUnitState(g, UNIT_STATE_MANA)
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, g, "origin"))
if(mana > sd.mn) then
call SetUnitState(g, UNIT_STATE_MANA, mana - sd.mn)
else
call UnitDamageTarget(sd.u, g, sd.mn, true, false, A_TYPE, D_TYPE, null)
endif
endif
endloop
endif
endif
endloop
else
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
set fId = GetUnitUserData(f)
set magic = LoadInteger(MagicDamage_Ht, fId, 0)
call DestroyEffect(LoadEffectHandle(sd.ht, fId, EFFECT_KEY))
call FlushChildHashtable(sd.ht, fId)
call SaveInteger(MagicDamage_Ht, fId, 0, magic - sd.m)
endloop
if(sd.e != null) then
call DestroyEffect(sd.e)
set sd.e = null
endif
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
set g = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local HeavensTwilight_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local real face = GetUnitFacing(caster)
local player owner = GetOwningPlayer(caster)
local unit target = GetSpellTargetUnit()
local boolean isNull = (Ar[Total] == null)
local unit f = null
local integer fId = 0
local integer magic = 0
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE1)
local integer item2 = IsUnitHasItemType(caster, ITEM1_UPGRADE2)
local integer item3 = IsUnitHasItemType(caster, ITEM1_UPGRADE3)
local integer item4 = IsUnitHasItemType(caster, ITEM2_UPGRADE1)
local integer item5 = IsUnitHasItemType(caster, ITEM2_UPGRADE2)
local integer item6 = IsUnitHasItemType(caster, ITEM2_UPGRADE3)
local integer count = 0
local real radius = 0.0
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_CP_HeavensTwilight
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
if(isNull) then
set sd = HeavensTwilight_Data.create()
set sd.g = CreateGroup()
set sd.ht = InitHashtable()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.l = level
set sd.o = owner
set sd.d = Duration(level)
set sd.m = Magic_Increase(level)
set sd.r = Mana_Radius(level)
set sd.ar = Amplify_Radius(level)
set sd.mn = Mana_Decrease(level)
set sd.md = MANA_DECREASE_DURATION
set sd.c = 0
set sd.i = 0.0
set sd.im = 0.0
set sd.e = null
set sd.up = false
set radius = Radius(level)
if(item1 > 0) then
set sd.d = sd.d + (UPGRADE1_DURATION1 * item1)
set sd.up = true
endif
if(item2 > 0) then
set sd.d = sd.d + (UPGRADE1_DURATION2 * item2)
set sd.up = true
endif
if(item3 > 0) then
set sd.d = sd.d + (UPGRADE1_DURATION3 * item3)
set radius = radius + 9000.0
set count = 1
set sd.up = true
endif
if(item4 > 0) then
set sd.m = sd.m + (UPGRADE2_MAGIC1 * item4)
endif
if(item5 > 0) then
set sd.m = sd.m + (UPGRADE2_MAGIC2 * item5)
endif
if(item6 > 0) then
set sd.m = sd.m + (UPGRADE2_MAGIC3 * item6)
set sd.ar = sd.ar + (UPGRADE2_AMPLIFY_RADIUS3 * item6)
endif
if(item4 > 0 or item5 > 0 or item6 > 0) then
set count = 1
call GroupEnumUnitsInRange(all, casterX, casterY, radius, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitAlly(f, sd.o) and (GetOwningPlayer(f) != Player(PLAYER_NEUTRAL_PASSIVE)) and f != caster) then
set count = count + 1
endif
endloop
endif
set sd.c = count
set sd.i = 1.0
set sd.im = 1.0
call GroupEnumUnitsInRange(all, casterX, casterY, radius, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitAlly(f, sd.o) and (GetOwningPlayer(f) != Player(PLAYER_NEUTRAL_PASSIVE))) then
call GroupAddUnit(sd.g, f)
//call SetUnitState(f, UNIT_STATE_MANA, GetUnitState(f, UNIT_STATE_MAX_MANA))
set fId = GetUnitUserData(f)
set magic = LoadInteger(MagicDamage_Ht, fId, 0)
call SaveEffectHandle(sd.ht, fId, EFFECT_KEY, AddSpecialEffectTarget(SPELL_EFFECT, f, "origin"))
call SaveInteger(MagicDamage_Ht, fId, 0, magic + sd.m)
endif
endloop
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set owner = null
set target = null
set f = null
set s = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(HeavensTwilightTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(HeavensTwilightTrg, Condition(function Conditions))
call TriggerAddAction(HeavensTwilightTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set copy = CreateGroup()
set all = CreateGroup()
set bexpr = Condition(function Pick)
set bexpr2 = Condition(function Pick2)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
endfunction
endscope
//TESH.scrollpos=63
//TESH.alwaysfold=0
scope Vorpal initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A075' //Spell Vorpal Slash rawcode
private constant real DISTANCE_PER_INTERVAL = 40.0 //Distance increase per interval
private constant real SIZE_PER_INTERVAL = 0.2 //Size increase per interval
private constant real RADIUS_OF_DAMAGE = 250.0 //Radius of damage
private constant real DISTANCE_ARC = 50.0 //Distance between arc
private constant real ANGLE_ARC = 22.5 //Angle between arc
private constant real SPEED = 90.0 //Speed of Vorpal Slash
private constant integer DUMMY_ID = 'n01E' //Unit Vorpal Slash dummy
private constant integer DUMMY1_ID = 'n01H' //Unit Vorpal Slash dummy
private constant integer ANIME = 9 //Animate end cast
private constant integer ANIME2 = 5 //Animate attack
private constant integer ANIME3 = 16 //Animate attack
//private constant integer ANIME4 = 17 //Animate spell
//private constant real RANGE_ANGLE = 10.0 //Angle difference in range
//private constant real INTERVAL_CHANGE_ANGLE = 0.5 //Interval decrease angle
//private constant real ANGLE_DECREASE = 1.0 //Amount of angle decrease
//private constant real FLY_HEIGHT = 80.0 //Fly height of Vorpal Slash
private constant real DAMAGE_TO_TREES = 1.0 //Damage to trees
private constant integer UNIT_ID = 'Edmm' //Unit Demon Hunter (Demon Form)
private constant integer ITEM1_UPGRADE = 'I006' //Item Baneriven Dagger
private constant real UPGRADE1_SPEED = 30.0 //Upgrade 1 effect
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_SONIC //Spell damage type
private constant string CAST_EFFECT = "Abilities\\Spells\\NightElf\\Barkskin\\BarkSkinTarget.mdl"
private constant string TARGET_EFFECT = "Abilities\\Spells\\Items\\WandOfNeutralization\\NeutralizationMissile.mdl" //Effect to unit target
endglobals
//Damage base
private function Damage_Base takes integer level returns real
if(level == 1) then
return 60.0
elseif(level == 2) then
return 60.0
elseif(level == 3) then
return 60.0
elseif(level == 4) then
return 60.0
else
return 0.0
endif
endfunction
//Damage increase
private function Damage takes integer level returns real
if(level == 1) then
return 2.4
elseif(level == 2) then
return 4.0
elseif(level == 3) then
return 5.6
elseif(level == 4) then
return 7.2
else
return 0.0
endif
endfunction
//Damage base
private function Damage_Max takes integer level returns real
if(level == 1) then
return 240.0
elseif(level == 2) then
return 360.0
elseif(level == 3) then
return 480.0
elseif(level == 4) then
return 600.0
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct VorpalSlash_Data
unit u //Unit caster
player o //Owner of caster
unit n //Unit sonic
group g //Group target
real i //Interval cast
real a //Angle facing of caster
real cos //Cos of facing of caster
real sin //Sin of facing of caster
real x //Caster x
real y //Caster y
real d //Distance cast
effect array sfx[10] //Effect on weapon
integer sfxCount //Number of effect
integer s //Size
real p //Speed
real dd //Damage
real di //Damage increase
real dm //Damage max
integer arcL //Number of arc to left
real cosL //Cos of arc to left
real sinL //Sin of arc to right
integer arcR //Number of arc to right
real cosR //Cos of arc to left
real sinR //Sin of arc to right
boolean c //Casting check
boolean up //Upgrade
integer it1 //Item 1 upgrade
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private VorpalSlash_Data array Ar[10]
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local VorpalSlash_Data sd
local integer i = 0
local integer j = 0
local real tX = 0.0
local real tY = 0.0
local unit f = null
local unit dummy = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.c) then
set sd.i = sd.i + Interval()
set sd.d = sd.d + DISTANCE_PER_INTERVAL
if(sd.dd + sd.di < sd.dm) then
set sd.dd = sd.dd + sd.di
else
set sd.dd = sd.dm
endif
if(sd.sfxCount < 10) then
set sd.sfx[sd.sfxCount] = AddSpecialEffectTarget(CAST_EFFECT, sd.u, "weapon")
set sd.sfxCount = sd.sfxCount + 1
endif
elseif(sd.d > 0) then
set sd.d = sd.d - sd.p
set sd.s = sd.s + 1
set sd.x = sd.x + sd.p * sd.cos
set sd.y = sd.y + sd.p * sd.sin
if(sd.x > WorldBounds.minX + 300.0 and /*
*/sd.x < WorldBounds.maxX - 300.0 and /*
*/sd.y > WorldBounds.minY + 300.0 and /*
*/sd.y < WorldBounds.maxY - 300.0 and (not IsWall(sd.x, sd.y, 100.0))) then
call SetUnitX(sd.n, sd.x)
call SetUnitY(sd.n, sd.y)
if(sd.up) then
set dummy = CreateUnit(sd.o, DUMMY1_ID, sd.x, sd.y, sd.a)
else
set dummy = CreateUnit(sd.o, DUMMY_ID, sd.x, sd.y, sd.a)
endif
call UnitApplyTimedLife(dummy, 'BTLF', 0.1)
call SetUnitVertexColor(dummy, 255, 255, 255, 150)
call SetUnitScale(dummy, 2 + (SIZE_PER_INTERVAL * sd.s), 2 + (SIZE_PER_INTERVAL * sd.s), 2 + (SIZE_PER_INTERVAL * sd.s))
call UnitAddAbility(dummy, 'Arav')
call UnitRemoveAbility(dummy, 'Arav')
call SetUnitPathing(dummy, false)
call SetUnitX(dummy, sd.x)
call SetUnitY(dummy, sd.y)
call SetUnitFlyHeight(dummy, 100.0, 0.0)
else
set sd.d = 0
endif
call SetUnitScale(sd.n, 2 + (SIZE_PER_INTERVAL * sd.s), 2 + (SIZE_PER_INTERVAL * sd.s), 2 + (SIZE_PER_INTERVAL * sd.s))
set sd.arcL = sd.s / 5
set sd.arcR = sd.s / 5
call CreateFogModifierRadius(sd.o, FOG_OF_WAR_VISIBLE, sd.x, sd.y, 200 + sd.s * 20, true, false)
call GroupEnumUnitsInRange(all, sd.x, sd.y, RADIUS_OF_DAMAGE, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (IsUnitEnemy(f, sd.o) and (not IsUnitInGroup(f, sd.g))) then
call GroupAddUnit(sd.g, f)
call DestroyEffect(AddSpecialEffectTarget(TARGET_EFFECT, f, "origin"))
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
endif
endloop
call HitTree(sd.x, sd.y, RADIUS_OF_DAMAGE, 0, 0.0)
set j = 0
loop
exitwhen(j > sd.arcL)
set tX = sd.x + (DISTANCE_ARC * j) * sd.cosL
set tY = sd.y + (DISTANCE_ARC * j) * sd.sinL
call GroupEnumUnitsInRange(all, tX, tY, RADIUS_OF_DAMAGE, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (IsUnitEnemy(f, sd.o) and (not IsUnitInGroup(f, sd.g))) then
call GroupAddUnit(sd.g, f)
call DestroyEffect(AddSpecialEffectTarget(TARGET_EFFECT, f, "origin"))
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
endif
endloop
call HitTree(tX, tY, RADIUS_OF_DAMAGE, 0, 0.0)
set j = j + 1
endloop
set j = 0
loop
exitwhen(j > sd.arcR)
set tX = sd.x + (DISTANCE_ARC * j) * sd.cosR
set tY = sd.y + (DISTANCE_ARC * j) * sd.sinR
call GroupEnumUnitsInRange(all, tX, tY, RADIUS_OF_DAMAGE, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (IsUnitEnemy(f, sd.o) and (not IsUnitInGroup(f, sd.g))) then
call GroupAddUnit(sd.g, f)
call DestroyEffect(AddSpecialEffectTarget(TARGET_EFFECT, f, "origin"))
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
endif
endloop
call HitTree(tX, tY, RADIUS_OF_DAMAGE, 0, 0.0)
set j = j + 1
endloop
else
call KillUnit(sd.n)
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
set j = 0
loop
exitwhen(j >= sd.sfxCount)
if(sd.sfx[j] != null) then
call DestroyEffect(sd.sfx[j])
set sd.sfx[j] = null
endif
set j = j + 1
endloop
set sd.u = null
set sd.o = null
set sd.n = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set dummy = null
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local VorpalSlash_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real angle = GetUnitFacing(caster)
local boolean isNull = (Ar[Total] == null)
if(isNull) then
set sd = VorpalSlash_Data.create()
set sd.g = CreateGroup()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.o = GetOwningPlayer(caster)
set sd.n = null
set sd.i = 0.0
set sd.a = 0.0
set sd.cos = 0.0
set sd.sin = 0.0
set sd.x = GetUnitX(caster)
set sd.y = GetUnitY(caster)
set sd.d = 0.0
set sd.sfxCount = 0
set sd.s = 0
set sd.p = SPEED
set sd.dd = Damage_Base(level) + (Damage_Base(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.di = Damage(level) + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.dm = Damage_Max(level) + (Damage_Max(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.arcL = 0
set sd.cosL = 0.0
set sd.sinL = 0.0
set sd.arcR = 0
set sd.cosR = 0.0
set sd.sinR = 0.0
set sd.c = true
set sd.up = (GetUnitTypeId(caster) == UNIT_ID)
set sd.it1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
if(sd.it1 > 0) then
set sd.p = sd.p + UPGRADE1_SPEED
endif
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
endfunction
//----------------------------------------------------------------
private function Stop_Actions takes nothing returns nothing
local VorpalSlash_Data sd
local unit caster = GetTriggerUnit()
local integer i = 0
local integer j = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set sd.c = false
set j = 0
loop
exitwhen(j >= sd.sfxCount)
call DestroyEffect(sd.sfx[j])
set j = j + 1
endloop
set sd.a = GetUnitFacing(sd.u)
set sd.cos = Cos(sd.a * bj_DEGTORAD)
set sd.sin = Sin(sd.a * bj_DEGTORAD)
set sd.cosL = Cos((sd.a + 90.0 + ANGLE_ARC) * bj_DEGTORAD)
set sd.sinL = Sin((sd.a + 90.0 + ANGLE_ARC) * bj_DEGTORAD)
set sd.cosR = Cos((sd.a - 90.0 - ANGLE_ARC) * bj_DEGTORAD)
set sd.sinR = Sin((sd.a - 90.0 - ANGLE_ARC) * bj_DEGTORAD)
set sd.n = CreateUnit(GetOwningPlayer(caster), DUMMY_ID, sd.x, sd.y, sd.a)
call SetUnitScale(sd.n, 2, 2, 2)
call UnitAddAbility(sd.n, 'Arav')
call UnitRemoveAbility(sd.n, 'Arav')
call SetUnitPathing(sd.n, false)
call SetUnitX(sd.n, sd.x)
call SetUnitY(sd.n, sd.y)
call SetUnitFlyHeight(sd.n, 100.0, 0.0)
if(GetUnitTypeId(caster) == UNIT_ID) then
call SetUnitAnimationByIndex(caster, ANIME3)
call QueueUnitAnimation(caster, "stand, alternate")
else
call SetUnitAnimationByIndex(caster, ANIME)
call QueueUnitAnimation(caster, "stand")
endif
set i = Total
endif
set i = i + 1
endloop
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(VorpalSlashTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(VorpalSlashTrg, Condition(function Conditions))
call TriggerAddAction(VorpalSlashTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(VorpalSlashStopTrg, EVENT_PLAYER_UNIT_SPELL_ENDCAST)
call TriggerAddCondition(VorpalSlashStopTrg, Condition(function Conditions))
call TriggerAddAction(VorpalSlashStopTrg, function Stop_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(CAST_EFFECT)
call Preload(TARGET_EFFECT)
endfunction
endscope
//TESH.scrollpos=83
//TESH.alwaysfold=0
scope SwiftBlade initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL1_ID = 'A076' //Spell Swift Blade rawcode
private constant real DURATION = 0.5 //Duration backward
private constant real DISTANCE = 500.0 //Distance backward
private constant integer ANIME = 4 //Animate
private constant integer ANIME2 = 17 //Animation demon form
private constant integer DUMMY1_ID = 'n01G' //Dummy Demon Hunter
private constant integer DUMMY2_ID = 'n01F' //Dummy Defend effect
private constant integer DUMMY_INTERVAL = 1 //Interval between dummy
private constant real START_DUMMY2_SIZE = 5.0 //Initial size of dummy
private constant real TURNING_POINT = 0.01 //Turning point of unit
private constant real TURNING_TIME = 1.0 //Turning time of unit
private constant integer UNIT_ID = 'Edmm' //Unit Demon Hunter (Demon Form)
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_SONIC //Spell damage type
private constant real KNOCKBACK_DISTANCE = 500 //Knockback distance
private constant real KNOCKBACK_DURATION = 2.0 //Knockback targets duration
private constant integer ITEM1_UPGRADE = 'I00C' //Item Amulet of Dexterity
private constant real UPGRADE1_DISTANCE = 100.0 //Upgrade 1 effect
endglobals
//Damage deal
private function Damage takes integer level returns real
if(level == 1) then
return 40.0
elseif(level == 2) then
return 60.0
elseif(level == 3) then
return 100.0
else
return 0.0
endif
endfunction
//Radius effect
private function Radius takes integer level returns real
return 300.0 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_FLYING) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct SwiftBlade_Data
unit u //Unit caster
player o //Owner of caster
group g //Group target
real a //Angle
real cos //Cos of angle
real sin //Sin of angle
real d1 //Distance
real d2 //Distance decelerator
real cX //caster X
real cY //caster Y
integer i //Interval effect
real s //Size of effect
real tt //Turn time
real d //Damage deal
real r //Radius of damage
real kd //Knockback distance
boolean up //Upgrade
endstruct
//----------------------------------------------------------------
globals
private group all
private boolexpr bexpr
private timer Tim
private integer Total
private SwiftBlade_Data array Ar[10]
private location target
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local SwiftBlade_Data sd
local integer i = 0
local real x = 0.0
local real y = 0.0
local unit dummy = null
local unit f = null
local real fX = 0.0
local real fY = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.d1 > 0) then
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (IsUnitEnemy(f, sd.o) and (not IsUnitInGroup(f, sd.g))) then
call GroupAddUnit(sd.g, f)
//call DestroyEffect(AddSpecialEffectTarget(TARGET_EFFECT, f, "origin"))
set fX = GetUnitX(f)
set fY = GetUnitY(f)
call Knockback(f, sd.kd, sd.a, KNOCKBACK_DURATION)
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.d, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.d, true, false, A_TYPE, D_TYPE, null)
endif
endif
endloop
set sd.kd = sd.kd - 1
set sd.r = sd.r - 20.0
if(sd.i > DUMMY_INTERVAL) then
set dummy = CreateUnit(sd.o, DUMMY1_ID, x, y, sd.a)
call SetUnitVertexColor(dummy, 255, 255, 255, 150)
call SetUnitExploded(dummy, true)
call UnitApplyTimedLife(dummy, 'BTLF', 0.5)
call SetUnitPathing(dummy, false)
call SetUnitX(dummy, x)
call SetUnitY(dummy, y)
if(sd.up)then
call SetUnitAnimationByIndex(dummy, ANIME2)
else
call SetUnitAnimationByIndex(dummy, ANIME)
endif
set dummy = CreateUnit(sd.o, DUMMY2_ID, x, y, sd.a )
call SetUnitExploded(dummy, true)
call UnitApplyTimedLife(dummy, 'BTLF', 0.5)
//call SetUnitVertexColor(dummy, 255, 255, 255, 255)
call SetUnitPathing(dummy, false)
call SetUnitX(dummy, x)
call SetUnitY(dummy, y)
call SetUnitScale(dummy, sd.s, sd.s, sd.s)
if(sd.up)then
call SetUnitAnimationByIndex(dummy, ANIME2)
call SetUnitVertexColor(dummy, 0, 255,0, 255)
else
call SetUnitAnimationByIndex(dummy, ANIME)
call SetUnitVertexColor(dummy, 255, 255, 255, 255)
endif
set sd.s = sd.s - 1.0
//call SetUnitAnimationByIndex(dummy, ANIME)
set sd.i = 0
else
set sd.i = sd.i + 1
endif
set x = x + sd.d1 * sd.cos
set y = y + sd.d1 * sd.sin
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
call SetUnitPosition(sd.u, x, y)
else
set sd.d1 = 0
endif
set sd.d1 = sd.d1 - sd.d2
elseif(sd.tt > 0) then
set sd.tt = sd.tt - Interval()
else
call SetUnitPathing(sd.u, true)
//call SetUnitFacing(sd.u, sd.a)
call SetUnitTurnSpeed(sd.u, GetUnitDefaultTurnSpeed(sd.u))
call Pather(sd.u, 3.0)
/*
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
set x = x - 100.0 * sd.cos
set y = y - 100.0 * sd.sin
call IssuePointOrder(sd.u , "move", x, y)
*/
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set dummy = null
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local SwiftBlade_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer casterType = GetUnitTypeId(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL1_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
local location target = null
local real targetX = 0.0
local real targetY = 0.0
local real angle = 0.0
local real q = R2I(DURATION / Interval())
local boolean isNull = (Ar[Total] == null)
local real distance = DISTANCE
if(IsUnitHasItemType(caster, ITEM1_UPGRADE) > 0) then
set distance = distance + UPGRADE1_DISTANCE
endif
set target = GetSpellTargetLoc()
set targetX = GetLocationX(target)
set targetY = GetLocationY(target)
set angle = Atan2(casterY - targetY, casterX - targetX)
call SetUnitTurnSpeed(caster, TURNING_POINT)
call PauseUnit(caster, true)
call SetUnitPathing(caster, false)
if(casterType == UNIT_ID) then
call SetUnitAnimationByIndex(caster, ANIME2)
else
call SetUnitAnimationByIndex(caster, ANIME)
call QueueUnitAnimation(caster, "stand")
endif
call PauseUnit(caster, false)
if(isNull) then
set sd = SwiftBlade_Data.create()
set sd.g = CreateGroup()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.o = owner
set sd.a = GetUnitFacing(caster)
set sd.cos = Cos(angle)
set sd.sin = Sin(angle)
set sd.d1 = 2 * distance / (q + 1)
set sd.d2 = sd.d1 / q
set sd.cX = casterX
set sd.cY = casterY
set sd.i = 0
set sd.s = START_DUMMY2_SIZE
set sd.tt = TURNING_TIME
set sd.d = Damage(level) + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.r = Radius(level)
set sd.kd = KNOCKBACK_DISTANCE
set sd.up = (casterType == UNIT_ID)
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set owner = null
call RemoveLocation(target)
set target = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL1_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(SwiftBladeTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(SwiftBladeTrg, Condition(function Conditions))
call TriggerAddAction(SwiftBladeTrg, function Actions)
//Setting globals
set all = CreateGroup()
set bexpr = Condition(function Pick)
set Tim = CreateTimer()
set Total = 0
set target = Location(0, 0)
//Preload
call AbilityPreload(SPELL1_ID)
endfunction
endscope
//TESH.scrollpos=397
//TESH.alwaysfold=0
globals
constant integer CROSSX_KEY = 0 //X key
constant integer CROSSY_KEY = 1 //Y key
constant integer CROSSD_KEY = 2 //Distance key
constant integer CROSSE_KEY = 3 //Effect key
constant integer CROSSS_KEY = 4 //
constant integer CROSSO_KEY = 5 //
constant integer CROSSC_KEY = 6 //Count key
constant integer CROSST_KEY = 7 //Text key
hashtable InfiniteCrossHt = InitHashtable()
endglobals
scope InfiniteCross initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A077' //Spell Infinite Cross rawcode
private constant integer DUMMY_ID = 'n01G' //Dummy Demon Hunter
private constant integer UNIT1_ID = 'Edem' //Unit Demon Hunter
private constant integer UNIT2_ID = 'Edmm' //Unit Demon Hunter (Demon Form)
private constant integer ANIME1 = 8 //Animation move
private constant integer ANIME2 = 15 //Animation alternate move
private constant real MIN_DISTANCE = 300.0 //Min distance
private constant string TEXT_PERCENT = "IIIII" //Text tag name
private constant real TEXT_SIZE = 10.0 //Text tag size
private constant real TEXT_HEIGHT = 150.0 //Text tag height
private constant integer ITEM1_UPGRADE = 'I00H' //Item Warmarcher
private constant integer UPGRADE1_CROSS = 1 //Upgrade 1 effect
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\NightElf\\Blink\\BlinkTarget.mdl" //Special effect move
private constant string SPELL_EFFECT = "war3mapImported\\NetherStrike2.mdx" //Effect charged
endglobals
//Charge count
private function Count takes integer level returns integer
return 3 + (1 * level)
endfunction
//Distance travel to charge
private function Distance_Travel takes integer level returns real
return 3600.0 - (600.0 * level)
endfunction
private function Distance takes integer level returns real
return 300.0 + (100.0 * level)
endfunction
//Speed of move
private function Speed takes integer level returns real
return 60.0 + (10.0 * level)
endfunction
//Radius of target
private function Radius takes integer level returns real
return 200.0 + (0 * level)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct InfiniteCross_Data
unit u //Unit ordered
unit t //Unit target
destructable dt //Destructable target
item it //Item target
player o //Owner of ordered
integer uId //Ordered unit id
real cX //Caster x
real cY //Caster y
real tX //Target x
real tY //Target y
real s //Speed
real cos //Cos of angle
real sin //Sin of angle
real a //Angle
real d //Distance
real p //Phase
boolean de //Destroy effect
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private InfiniteCross_Data array Ar[10]
private group Group
private trigger InfiniteCrossChargeTrg
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local InfiniteCross_Data sd
local integer i = 0
local unit f = null
local unit dummy = null
local real dx = 0.0
local real dy = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.d > 0) then
set sd.cX = GetUnitX(sd.u) + sd.s * sd.cos
set sd.cY = GetUnitY(sd.u) + sd.s * sd.sin
set dummy = CreateUnit(sd.o, DUMMY_ID, sd.cX, sd.cY, sd.a )
call SetUnitExploded(dummy, true)
call UnitApplyTimedLife(dummy, 'Bapl', 0.3)
call SetUnitVertexColor(dummy, 255, 255, 255, 150)
call SetUnitPathing(dummy, false)
call SetUnitX(dummy, sd.cX)
call SetUnitY(dummy, sd.cY)
if(GetUnitTypeId(sd.u) == UNIT2_ID) then
call AddUnitAnimationProperties(dummy, "alternate", false )
call SetUnitAnimationByIndex(dummy, ANIME2)
else
call SetUnitAnimationByIndex(dummy, ANIME1)
endif
set dummy = null
if(sd.cX > WorldBounds.minX + 300.0 and /*
*/sd.cX < WorldBounds.maxX - 300.0 and /*
*/sd.cY > WorldBounds.minY + 300.0 and /*
*/sd.cY < WorldBounds.maxY - 300.0 and (not IsWall(sd.cX, sd.cY, 100.0)) and (not IsBarrel(sd.u, sd.cX, sd.cY, 100.0))) then
call SetUnitX(sd.u, sd.cX)
call SetUnitY(sd.u, sd.cY)
else
set sd.d = 0
endif
set sd.cX = GetUnitX(sd.u)
set sd.cY = GetUnitY(sd.u)
call SetUnitFacing(sd.u, sd.a)
set sd.d = sd.d - sd.s
else
set sd.cX = GetUnitX(sd.u)
set sd.cY = GetUnitY(sd.u)
//call PauseUnit(sd.u, false)
call SetUnitPathing(sd.u, true)
call SetUnitPosition(sd.u, sd.cX, sd.cY)
if(sd.de) then
call DestroyEffect(LoadEffectHandle(InfiniteCrossHt, sd.uId, CROSSE_KEY))
call SaveEffectHandle(InfiniteCrossHt, sd.uId, CROSSE_KEY, null)
call SaveBoolean(InfiniteCrossHt, sd.uId, CROSSS_KEY, false)
endif
call SaveBoolean(InfiniteCrossHt, sd.uId, CROSSO_KEY, false)
if(sd.t != null) then
call IssueTargetOrder(sd.u, "smart", sd.t)
elseif(sd.dt != null) then
call IssueTargetOrder(sd.u, "smart", sd.dt)
elseif(sd.it != null) then
call IssueTargetOrder(sd.u, "smart", sd.it)
else
call IssueImmediateOrder(sd.u, "stop")
endif
call SaveBoolean(InfiniteCrossHt, sd.uId, CROSSO_KEY, true)
set sd.u = null
set sd.t = null
set sd.dt = null
set sd.it = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
set dummy = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local InfiniteCross_Data sd
local unit ordered = GetOrderedUnit()
local integer level = GetUnitAbilityLevel(ordered, SPELL_ID)
local player owner = GetOwningPlayer(ordered)
local real orderedX = GetUnitX(ordered)
local real orderedY = GetUnitY(ordered)
local integer orderedID = GetUnitUserData(ordered)
local unit target = null
local destructable targetDest = null
local item targetItem = null
local real targetX = 0.0
local real targetY = 0.0
local real angle = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local boolean b = false
local integer i = 0
local integer charge = LoadInteger(InfiniteCrossHt, orderedID, CROSSC_KEY)
local boolean destroy = charge <= 1
set target = GetOrderTargetUnit()
set targetDest = GetOrderTargetDestructable()
set targetItem = GetOrderTargetItem()
if(target == null and targetDest == null and targetItem == null) then
set targetX = GetOrderPointX()
set targetY = GetOrderPointY()
else
if(target != null) then
set targetX = GetUnitX(target)
set targetY = GetUnitY(target)
elseif(targetDest != null) then
set targetX = GetDestructableX(targetDest)
set targetY = GetDestructableY(targetDest)
elseif(targetItem != null) then
set targetX = GetItemX(targetItem)
set targetY = GetItemY(targetItem)
endif
endif
set dx = orderedX - targetX
set dy = orderedY - targetY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance > MIN_DISTANCE) then
if(not (charge <= 0)) then
call SaveInteger(InfiniteCrossHt, orderedID, CROSSC_KEY, charge - 1)
endif
set angle = Atan2(targetY - orderedY, targetX - orderedX)
set dx = orderedX - targetX
set dy = orderedY - targetY
set distance = SquareRoot(dx * dx + dy * dy)
call DestroyEffect(AddSpecialEffect(SPECIAL_EFFECT, orderedX, orderedY))
call SetUnitPathing(ordered, false)
//call PauseUnit(ordered, true)
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == ordered) then
set sd.t = target
set sd.dt = targetDest
set sd.it = targetItem
set sd.cX = orderedX
set sd.cY = orderedY
set sd.tX = targetX
set sd.tY = targetY
set sd.s = Speed(level)
set sd.cos = Cos(angle)
set sd.sin = Sin(angle)
set sd.a = angle * bj_RADTODEG
set sd.d = RMinBJ(Distance(level), distance - 80.0)
set sd.de = destroy
set b = true
set i = Total
endif
set i = i + 1
endloop
if(not b) then
set sd = InfiniteCross_Data.create()
set sd.u = ordered
set sd.t = target
set sd.dt = targetDest
set sd.it = targetItem
set sd.o = owner
set sd.uId = orderedID
set sd.cX = orderedX
set sd.cY = orderedY
set sd.tX = targetX
set sd.tY = targetY
set sd.s = Speed(level)
set sd.cos = Cos(angle)
set sd.sin = Sin(angle)
set sd.a = angle * bj_RADTODEG
set sd.d = RMinBJ(Distance(level), distance - 80.0)
set sd.de = destroy
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
endif
set ordered = null
set owner = null
set target = null
set targetDest = null
set targetItem = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit ordered = GetOrderedUnit()
local boolean okey = (GetUnitTypeId(ordered) == UNIT1_ID or /*
*/GetUnitTypeId(ordered) == UNIT2_ID) and /*
*/LoadBoolean(InfiniteCrossHt, GetUnitUserData(ordered), CROSSS_KEY) and /*
*/LoadBoolean(InfiniteCrossHt, GetUnitUserData(ordered), CROSSO_KEY) and /*
*/GetIssuedOrderId() == 851971 and /*
*/(LoadInteger(InfiniteCrossHt, GetUnitUserData(ordered), CROSSC_KEY) > 0)
set ordered = null
return okey
endfunction
//----------------------------------------------------------------
private function Group_Actions takes nothing returns nothing
local unit enumU = GetEnumUnit()
local integer enumID = GetUnitUserData(enumU)
local integer level = GetUnitAbilityLevel(enumU, SPELL_ID)
local player enumO = GetOwningPlayer(enumU)
local real enumX = GetUnitX(enumU)
local real enumY = GetUnitY(enumU)
local real oriX = 0.0
local real oriY = 0.0
local real distance = 0
local real dx = 0.0
local real dy = 0.0
local real range = 0.0
local integer count = 0
local texttag tt = LoadTextTagHandle(InfiniteCrossHt, enumID, CROSST_KEY)
local string text = ""
local integer charge = 0
if(level > 0) then
if(not LoadBoolean(InfiniteCrossHt, enumID, CROSSS_KEY)) then
if(not HaveSavedReal(InfiniteCrossHt, enumID, CROSSD_KEY)) then
call SaveReal(InfiniteCrossHt, enumID, CROSSX_KEY, GetUnitX(enumU))
call SaveReal(InfiniteCrossHt, enumID, CROSSY_KEY, GetUnitY(enumU))
call SaveReal(InfiniteCrossHt, enumID, CROSSD_KEY, 0.0)
call SaveBoolean(InfiniteCrossHt, enumID, CROSSO_KEY, false)
else
set oriX = LoadReal(InfiniteCrossHt, enumID, CROSSX_KEY)
set oriY = LoadReal(InfiniteCrossHt, enumID, CROSSY_KEY)
set distance = LoadReal(InfiniteCrossHt, enumID, CROSSD_KEY)
set dy = enumX - oriX
set dx = enumY - oriY
set range = SquareRoot(dx * dx + dy * dy)
endif
if(not IsUnitPaused(enumU)) then
set distance = distance + range
endif
if(distance > Distance_Travel(level)) then
set distance = 0
set count = Count(level)
if(IsUnitHasItemType(enumU, ITEM1_UPGRADE) > 0) then
set count = count + UPGRADE1_CROSS
endif
call SaveInteger(InfiniteCrossHt, enumID, CROSSC_KEY, count)
if(LoadEffectHandle(InfiniteCrossHt, enumID, CROSSE_KEY) != null) then
call DestroyEffect(LoadEffectHandle(InfiniteCrossHt, enumID, CROSSE_KEY))
call SaveEffectHandle(InfiniteCrossHt, enumID, CROSSE_KEY, null)
endif
call SaveEffectHandle(InfiniteCrossHt, enumID, CROSSE_KEY, AddSpecialEffectTarget(SPELL_EFFECT, enumU, "chest"))
call SaveBoolean(InfiniteCrossHt, enumID, CROSSS_KEY, true)
call SaveBoolean(InfiniteCrossHt, enumID, CROSSO_KEY, true)
else
set charge = R2I(5 * distance/Distance_Travel(level))
if(charge == 0) then
set text = "IIIII"
elseif(charge == 1) then
set text = "|cff0080ffI|rIIII"
elseif(charge == 2) then
set text = "|cff0080ffII|rIII"
elseif(charge == 3) then
set text = "|cff0080ffIII|rII"
elseif(charge == 4) then
set text = "|cff0080ffIIII|rI"
endif
if(GetLocalPlayer() != enumO) then
set text = ""
endif
call SetTextTagTextBJ(tt, text, TEXT_SIZE)
endif
else
set count = LoadInteger(InfiniteCrossHt, enumID, CROSSC_KEY)
if(GetLocalPlayer() == enumO) then
set text = "|cff0080ff"+I2S(count)+"|r"
endif
call SetTextTagTextBJ(tt, text, TEXT_SIZE)
endif
call SetTextTagPos(tt, enumX, enumY, TEXT_HEIGHT)
else
call SetTextTagTextBJ(tt, "", TEXT_SIZE)
call SetTextTagPos(tt, enumX, enumY, TEXT_HEIGHT)
endif
call SaveReal(InfiniteCrossHt, enumID, CROSSX_KEY, enumX)
call SaveReal(InfiniteCrossHt, enumID, CROSSY_KEY, enumY)
call SaveReal(InfiniteCrossHt, enumID, CROSSD_KEY, distance)
set enumU = null
set enumO = null
set tt = null
set text = null
endfunction
//----------------------------------------------------------------
private function Charge_Actions takes nothing returns nothing
call ForGroup(Group, function Group_Actions)
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local unit learner = GetLearningUnit()
local integer learnerID = GetUnitUserData(learner)
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
local real learnerX = GetUnitX(learner)
local real learnerY = GetUnitY(learner)
local player owner = GetOwningPlayer(learner)
local texttag tt = null
local string text = ""
if(level == 1) then
if((not IsUnitInGroup(learner, Group))) then
if(GetLocalPlayer() == owner) then
set text = TEXT_PERCENT
endif
set tt = CreateTextTag()
call SetTextTagTextBJ(tt, text, TEXT_SIZE)
call SetTextTagPos(tt, learnerX, learnerY, TEXT_HEIGHT)
call SetTextTagColor(tt, 255, 255, 255, 255)
call SaveInteger(InfiniteCrossHt, learnerID, CROSSC_KEY, 0)
call SaveTextTagHandle(InfiniteCrossHt, learnerID, CROSST_KEY, tt)
call GroupAddUnit(Group, learner)
if(not IsTriggerEnabled(InfiniteCrossChargeTrg)) then
call EnableTrigger(InfiniteCrossChargeTrg)
endif
else
if(GetLocalPlayer() == owner) then
set text = TEXT_PERCENT
endif
set tt = LoadTextTagHandle(InfiniteCrossHt, learnerID, CROSST_KEY)
call SetTextTagTextBJ(tt, text, TEXT_SIZE)
endif
endif
set learner = null
set owner = null
set tt = null
set text = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
local unit learner = GetTriggerUnit()
local boolean okey = GetLearnedSkill() == SPELL_ID and (not IsUnitIllusion(learner))
set learner = null
return okey
endfunction
//----------------------------------------------------------------
function Register_Cross takes unit enumU returns nothing
local integer enumID = GetUnitUserData(enumU)
local integer level = GetUnitAbilityLevel(enumU, SPELL_ID)
local player enumO = GetOwningPlayer(enumU)
local integer count = 0
if(not LoadBoolean(InfiniteCrossHt, enumID, CROSSS_KEY)) then
set count = Count(level)
if(IsUnitHasItemType(enumU, ITEM1_UPGRADE) > 0) then
set count = count + UPGRADE1_CROSS
endif
call SaveInteger(InfiniteCrossHt, enumID, CROSSC_KEY, count)
if(LoadEffectHandle(InfiniteCrossHt, enumID, CROSSE_KEY) != null) then
call DestroyEffect(LoadEffectHandle(InfiniteCrossHt, enumID, CROSSE_KEY))
call SaveEffectHandle(InfiniteCrossHt, enumID, CROSSE_KEY, null)
endif
call SaveEffectHandle(InfiniteCrossHt, enumID, CROSSE_KEY, AddSpecialEffectTarget(SPELL_EFFECT, enumU, "chest"))
call SaveBoolean(InfiniteCrossHt, enumID, CROSSS_KEY, true)
call SaveBoolean(InfiniteCrossHt, enumID, CROSSO_KEY, true)
else
call SaveInteger(InfiniteCrossHt, enumID, CROSSC_KEY, Count(level))
endif
call SaveReal(InfiniteCrossHt, enumID, CROSSX_KEY, 0.0)
call SaveReal(InfiniteCrossHt, enumID, CROSSY_KEY, 0.0)
call SaveReal(InfiniteCrossHt, enumID, CROSSD_KEY, 0.0)
set enumU = null
set enumO = null
endfunction
//----------------------------------------------------------------
function Add_Cross takes unit enumU, integer add returns nothing
local integer enumID = GetUnitUserData(enumU)
local integer level = GetUnitAbilityLevel(enumU, SPELL_ID)
local player enumO = GetOwningPlayer(enumU)
if(not LoadBoolean(InfiniteCrossHt, enumID, CROSSS_KEY)) then
call SaveInteger(InfiniteCrossHt, enumID, CROSSC_KEY, LoadInteger(InfiniteCrossHt, enumID, CROSSC_KEY) + add)
endif
set enumU = null
set enumO = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set InfiniteCrossChargeTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(InfiniteCrossTrg, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER)
call TriggerRegisterAnyUnitEventBJ(InfiniteCrossTrg, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER)
call TriggerAddCondition(InfiniteCrossTrg, Condition(function Conditions))
call TriggerAddAction(InfiniteCrossTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(InfiniteCrossLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(InfiniteCrossLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(InfiniteCrossLearnTrg, function Learn_Actions)
call TriggerRegisterTimerEventPeriodic(InfiniteCrossChargeTrg, 0.05)
call DisableTrigger(InfiniteCrossChargeTrg)
call TriggerAddAction(InfiniteCrossChargeTrg, function Charge_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set Group = CreateGroup()
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
endfunction
endscope
//TESH.scrollpos=6
//TESH.alwaysfold=0
scope VoidImpulse initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A078' //Spell Void Impulse rawcode
private constant integer CAST_ID = 'Aprg' //Spell Void Impulse (Dummy) rawcode
private constant string SPELL_EFFECT = "Abilities\\Spells\\Other\\Silence\\SilenceAreaBirth.mdl" //Spell Pause effect
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Other\\Charm\\CharmTarget.mdl" //Spell Cast effect
private constant integer ITEM1_UPGRADE = 'spsh' //Item Dream Sphere
private constant real UPGRADE1_RADIUS = 200.0 //Upgrade 1 effect
endglobals
//Slow duration
private function Slow_Duration takes integer level returns real
return 2.0 + (0.0 * level)
endfunction
//Pause duration
private function Pause_Duration takes integer level returns real
if(level == 1) then
return 1.0
elseif(level == 2) then
return 2.0
elseif(level == 3) then
return 4.0
else
return 0.0
endif
endfunction
//Radius effect
private function Radius takes integer level returns real
return 200.0 + (100.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct VoidImpulse_Data
unit u //Unit caster
player o //Owner of caster
group g //Group target
real s //Slow duration
boolean t //Stun
real p //Pause duration
integer c //Count for effect
integer tc //Total count
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private VoidImpulse_Data array Ar[10]
private group all
private group copy
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local VoidImpulse_Data sd
local integer i = 0
local unit dummy = null
local unit f = null
local integer count = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.s > 0) then
set sd.s = sd.s - Interval()
set copy = CopyGroup(sd.g)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if((IsUnitDead(f))) then
call GroupRemoveUnit(sd.g, f)
endif
endloop
elseif(not sd.t) then
set sd.t = true
set copy = CopyGroup(sd.g)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if((IsUnitDead(f))) then
call GroupRemoveUnit(sd.g, f)
else
call PauseUnit(f, true)
call SetUnitTimeScale(f, 0.0)
endif
endloop
elseif(sd.p > 0) then
set sd.p = sd.p - Interval()
set count = 0
set copy = CopyGroup(sd.g)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if((IsUnitDead(f))) then
call GroupRemoveUnit(sd.g, f)
else
if(sd.c == count) then
call Timed_AddSpecialEffectTarget(SPELL_EFFECT, f, "chest", 1.0)
call PauseUnit(f, true)
endif
endif
set count = count + 1
endloop
if(sd.c < sd.tc) then
set sd.c = sd.c + 1
else
set sd.c = 0
endif
else
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
call PauseUnit(f, false)
call SetUnitTimeScale(f, 1.0)
endloop
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set dummy = null
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local VoidImpulse_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local boolean isNull = (Ar[Total] == null)
local unit f = null
local integer count = 0
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
local real radius = Radius(level)
if(item1 > 0) then
set radius = radius + UPGRADE1_RADIUS
endif
if(isNull) then
set sd = VoidImpulse_Data.create()
set sd.g = CreateGroup()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.o = owner
set sd.s = Slow_Duration(level)
set sd.t = false
set sd.p = Pause_Duration(level)
set count = 0
call GroupEnumUnitsInRange(all, casterX, casterY, radius, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o) and (not IsUnitInGroup(f, sd.g))) then
call GroupAddUnit(sd.g, f)
call TargetCast(owner, casterX, casterY, 0.5, CAST_ID, 1, "purge", 0, f)
set count = count + 1
endif
endloop
set sd.c = 0
set sd.tc = count
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, caster, "origin"))
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set owner = null
set f = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(VoidImpulseTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(VoidImpulseTrg, Condition(function Conditions))
call TriggerAddAction(VoidImpulseTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set copy = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
endfunction
endscope
//TESH.scrollpos=19
//TESH.alwaysfold=0
scope Vengeance initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A079' //Spell Vengeance rawcode
private constant integer ABILITY1_ID = 'A07B' //Spell Vengeance (Demon Form) rawcode
private constant integer ABILITY2_ID = 'A07C' //Spell Vengeance (Normal Form) rawcode
private constant integer ABILITY3_ID = 'A07A' //Ability Vengeance (Cancel) rawcode
private constant integer ANIME_PHASE1 = 21 //Animation in phase 1
private constant integer ANIME_PHASE3 = 22 //Animation in phase 2
private constant integer ANIME_DELAY = 17 //Animation delay
private constant integer ANIME_ATTACK = 16 //Animation attack
private constant integer ANIME_READY = 18 //Animation stand ready
private constant real PHASE0_TIME = 1.5 //Phase 0 time
private constant real PHASE1_TIME = 1.5 //Phase 1 time
private constant real PHASE3_TIME = 1.5 //Phase 2 time
private constant integer UNIT_ID = 'Edmm' //Unit Demon Hunter (Demon Form)
private constant real DELAY_ATTACK_TIME = 0.5 //Delay before launch attack
private constant real HIT_TIME = 0.5 //Hit time before damage
private constant real DAMAGE_TIME = 3.0 //Damage time
private constant real KNOCKBACK_DURATION = 1.5 //Duration knock
private constant string MESSAGE_CANNOT_ATTACK = "|cffff0000Cannot attack other units besides the target|r" //Message cannot attack others
private constant integer ITEM1_UPGRADE = 'I028' //Item Stormanifer
private constant integer ITEM2_UPGRADE = 'I01W' //Item Ghost Veil
private constant attacktype A_TYPE = ATTACK_TYPE_CHAOS //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_UNIVERSAL //Spell attack type
private constant string SPELL_EFFECT = "Abilities\\Spells\\Human\\ManaFlare\\ManaFlareBoltImpact.mdl" //Damage effect
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Other\\Parasite\\ParasiteMissile.mdl" //Effect at hand
private constant string CROSS_EFFECT = "war3mapImported\\NetherStrike2.mdx" //Effect Infinite Cross
endglobals
//Damage deal to target
private function Damage takes integer level returns real
return 0.0 + (0.0 * level)
endfunction
//Percentage
private function Percentage takes integer level returns real
return 0.0 + (0.4 * level)
endfunction
//Phase 2
private function Phase2 takes integer level returns real
return 30.0 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Vengeance_Data
unit u //Unit caster
integer uId //Caster id
integer l //Level of spell
player o //Owner of caster
unit t //Unit target
real time //Time
integer p //Phase
boolean at //Boolean check attack
real atime //Attack delay time
real hit //Hit time
real dtime //Damage time
real dd //Damage deal to target
real tX //Target x
real tY //Target y
real kb //Knockback
lightning li //Lightning effect
effect array eL[20] //Effect hand left
effect array eR[20] //Effect hand right
integer eNum //Number of effect
real i //Interval
real im //Interval max
integer it1 //Item 1 upgrade
integer it2 //Item 2 upgrade
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Vengeance_Data array Ar[10]
private hashtable ht
private group all
private boolexpr bexpr
private location loc1
private location loc2
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Vengeance_Data sd
local integer i = 0
local integer j = 0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local real face = 0.0
local real casterX = 0.0
local real casterY = 0.0
local real targetX = 0.0
local real targetY = 0.0
local real castX = 0.0
local real castY = 0.0
local real rad = 0.0
local real x = 0.0
local real y = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(IsUnitDead(sd.u)) then
if(sd.at) then
set sd.atime = 0
set sd.hit = 0
set sd.dtime = 0
endif
endif
if(sd.time > 0 and sd.p == 0) then
set sd.time = sd.time - Interval()
elseif(sd.p == 0) then
set sd.p = 1
set sd.time = PHASE1_TIME
call PauseUnit(sd.u, true)
call SetUnitAnimationByIndex(sd.u, ANIME_PHASE1)
//if(GetUnitAbilityLevel(sd.u, ABILITY3_ID) <= 0) then
call UnitAddAbility(sd.u, ABILITY3_ID)
//endif
if(sd.it2 > 0) then
call Register_Cross(sd.u)
call Add_Cross(sd.u, 4)
endif
elseif(sd.time > 0 and sd.p == 1) then
set sd.time = sd.time - Interval()
elseif(sd.p == 1) then
set sd.p = 2
set sd.time = Phase2(sd.l)
call UnitAddAbility(sd.u, ABILITY1_ID)
call UnitRemoveAbility(sd.u, ABILITY1_ID)
call AddUnitAnimationProperties(sd.u, "alternate", true )
call SetUnitInvulnerable(sd.u, false)
call PauseUnit(sd.u, false)
if(LoadBoolean(InfiniteCrossHt, sd.uId, CROSSS_KEY)) then
call DestroyEffect(LoadEffectHandle(InfiniteCrossHt, sd.uId, CROSSE_KEY))
call SaveEffectHandle(InfiniteCrossHt, sd.uId, CROSSE_KEY, null)
call SaveEffectHandle(InfiniteCrossHt, sd.uId, CROSSE_KEY, AddSpecialEffectTarget(CROSS_EFFECT, sd.u, "chest"))
endif
if(IsUnitVisible(sd.t, sd.o)) then
call IssueTargetOrder(sd.u, "attack", sd.t)
endif
if(GetUnitAbilityLevel(sd.u, ABILITY3_ID) <= 0) then
call UnitAddAbility(sd.u, ABILITY3_ID)
endif
call SetPlayerAbilityAvailable(sd.o, ABILITY3_ID, true)
call SetPlayerAbilityAvailable(sd.o, SPELL_ID, false)
elseif(sd.time > 0 and sd.p == 2 and /*
*/((not IsUnitDead(sd.t)) or sd.at)) then
if(not IsUnitDead(sd.u)) then
set sd.time = sd.time - Interval()
if(sd.it1 > 0 or sd.it2 > 0) then
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.u, "hand, left"))
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.u, "hand, right"))
endif
endif
endif
if(sd.at) then
set casterX = GetUnitX(sd.u)
set casterY = GetUnitY(sd.u)
set targetX = GetUnitX(sd.t)
set targetY = GetUnitY(sd.t)
set rad = Atan2(targetY - casterY, targetX - casterX)
set sd.time = sd.time + Interval()
set dx = casterX - targetX
set dy = casterY - targetY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance > 1000.0) then
set sd.at = false
set sd.hit = HIT_TIME
set sd.dtime = DAMAGE_TIME
call PauseUnit(sd.u, false)
call SetUnitInvulnerable(sd.u, false)
set j = 0
loop
exitwhen(j >= sd.eNum)
call DestroyEffect(sd.eL[j])
call DestroyEffect(sd.eR[j])
set sd.eL[j] = null
set sd.eR[j] = null
set j = j + 1
endloop
if(sd.li != null) then
call DestroyLightning(sd.li)
set sd.li = null
endif
call SetUnitTimeScale(sd.u, 1.0)
endif
if(sd.atime > 0) then
set sd.atime = sd.atime - Interval()
if(sd.eNum < 10) then
set sd.eL[sd.eNum] = AddSpecialEffectTarget(SPECIAL_EFFECT, sd.u, "hand, left")
set sd.eR[sd.eNum] = AddSpecialEffectTarget(SPECIAL_EFFECT, sd.u, "hand, right")
set sd.eNum = sd.eNum + 1
endif
elseif(sd.hit == HIT_TIME) then
set face = Atan2(targetY - casterY, targetX - casterX)
call SetUnitFacing(sd.u, face * bj_RADTODEG)
call SetUnitAnimationByIndex(sd.u, ANIME_ATTACK)
set sd.hit = sd.hit - Interval()
elseif(sd.hit > 0) then
set sd.hit = sd.hit - Interval()
elseif(sd.dtime == DAMAGE_TIME) then
set face = GetUnitFacing(sd.u)
set castX = casterX + 80.0 * Cos(face * bj_DEGTORAD)
set castY = casterY + 80.0 * Sin(face * bj_DEGTORAD)
set loc1 = Location(castX, castY)
set loc2 = Location(targetX, targetY)
call SetUnitTimeScale(sd.u, 0.0)
set sd.li = AddLightningEx("MFPB", true, /*
*/castX, castY, GetLocationZ(loc1) + 80.0, /*
*/targetX, targetY, GetLocationZ(loc2) + 50.0 + GetUnitFlyHeight(sd.t))
set sd.dtime = sd.dtime - Interval()
elseif(sd.dtime > 0 and /*
*/(not IsUnitDead(sd.t))) then
set face = GetUnitFacing(sd.u)
set castX = casterX + 80.0 * Cos(face * bj_DEGTORAD)
set castY = casterY + 80.0 * Sin(face * bj_DEGTORAD)
set loc1 = Location(castX, castY)
set loc2 = Location(targetX, targetY)
set sd.dtime = sd.dtime - Interval()
call MoveLightningEx(sd.li, true, /*
*/castX, castY, GetLocationZ(loc1) + 80.0, /*
*/targetX, targetY, GetLocationZ(loc2) + 50.0 + GetUnitFlyHeight(sd.t))
call UnitDamageTarget(sd.u, sd.t, sd.dd, true, false, A_TYPE, D_TYPE, null)
set x = targetX + sd.kb * Cos(rad)
set y = targetY + sd.kb * Sin(rad)
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
call SetUnitX(sd.t, x)
call SetUnitY(sd.t, y)
endif
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.t, "origin"))
else
set sd.at = false
set sd.hit = HIT_TIME
set sd.dtime = DAMAGE_TIME
call PauseUnit(sd.u, false)
call SetUnitInvulnerable(sd.u, false)
set j = 0
loop
exitwhen(j >= sd.eNum)
call DestroyEffect(sd.eL[j])
call DestroyEffect(sd.eR[j])
set j = j + 1
endloop
if(sd.li != null) then
call DestroyLightning(sd.li)
set sd.li = null
endif
call SetUnitTimeScale(sd.u, 1.0)
if(IsUnitDead(sd.t)) then
set sd.time = 0.0
else
call Pather(sd.t, 1.0)
endif
endif
endif
elseif(sd.p == 2) then
set sd.p = 3
set sd.time = PHASE3_TIME
call PauseUnit(sd.u, true)
call SetUnitInvulnerable(sd.u, true)
call SetUnitAnimationByIndex(sd.u, ANIME_PHASE3)
elseif(sd.time > 0 and sd.p == 3) then
set sd.time = sd.time - Interval()
elseif(sd.p == 3) then
if(not IsUnitDead(sd.u)) then
call UnitAddAbility(sd.u, ABILITY2_ID)
call UnitRemoveAbility(sd.u, ABILITY2_ID)
call AddUnitAnimationProperties(sd.u, "alternate", false)
call SetUnitInvulnerable(sd.u, false)
call PauseUnit(sd.u, false)
if(LoadBoolean(InfiniteCrossHt, sd.uId, CROSSS_KEY)) then
call DestroyEffect(LoadEffectHandle(InfiniteCrossHt, sd.uId, CROSSE_KEY))
call SaveEffectHandle(InfiniteCrossHt, sd.uId, CROSSE_KEY, null)
call SaveEffectHandle(InfiniteCrossHt, sd.uId, CROSSE_KEY, AddSpecialEffectTarget(CROSS_EFFECT, sd.u, "chest"))
endif
call SetPlayerAbilityAvailable(sd.o, ABILITY3_ID, false)
call SetPlayerAbilityAvailable(sd.o, SPELL_ID, true)
set sd.u = null
set sd.o = null
set sd.t = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set loc1 = Location(0, 0)
set loc2 = Location(0, 0)
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Vengeance_Data sd = Vengeance_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local unit target = GetSpellTargetUnit()
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_DH_Vengeance
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
set sd.u = caster
set sd.l = level
set sd.o = owner
set sd.t = target
set sd.uId = casterID
set sd.time = PHASE0_TIME
set sd.p = 0
set sd.at = false
set sd.atime = 0.0
set sd.kb = 30.0
set sd.hit = 0.0
set sd.dtime = 0.0
set sd.dd = Damage(level) + GetHeroAgi(caster, true) * Percentage(level)
set sd.dd = sd.dd + (sd.dd * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.tX = 0.0
set sd.tY = 0.0
set sd.li = null
set sd.i = 0.0
set sd.im = 1.0
set sd.it1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
set sd.it2 = IsUnitHasItemType(caster, ITEM2_UPGRADE)
if(GetUnitTypeId(sd.t) == 'Uktl') then
set sd.dd = 0
endif
if(sd.it1 > 0) then
set sd.time = 0.0
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
set target = null
set s = null
endfunction
//----------------------------------------------------------------
private function Stop_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local Vengeance_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.p == 0 and sd.u == caster) then
set sd.time = 0
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
set i = Total
endif
set i = i + 1
endloop
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Cancel_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local Vengeance_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set sd.time = 0
set i = Total
endif
set i = i + 1
endloop
set caster = null
endfunction
//----------------------------------------------------------------
private function Cancel_Conditions takes nothing returns boolean
return GetSpellAbilityId() == ABILITY3_ID
endfunction
//----------------------------------------------------------------
private function Attack_Actions takes nothing returns nothing
local Vengeance_Data sd
local unit attacker = GetAttacker()
local real attackerX = GetUnitX(attacker)
local real attackerY = GetUnitY(attacker)
local player owner = GetOwningPlayer(attacker)
local unit attacked = GetTriggerUnit()
local integer i = 0
local boolean check = false
local real angle = GetUnitFacing(attacker) * bj_DEGTORAD
local sound s = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(attacker == sd.u) then
if(attacked == sd.t) then
if(not sd.at) then
set sd.at = true
set sd.atime = DELAY_ATTACK_TIME
set sd.hit = HIT_TIME
set sd.dtime = DAMAGE_TIME
set sd.eNum = 0
set check = true
call PauseUnit(attacker, true)
call SetUnitInvulnerable(attacker, true)
call SetUnitAnimationByIndex(attacker, ANIME_DELAY)
set i = Total
endif
else
if(sd.it2 > 0) then
else
call IssueTargetOrder(attacker, "attack", sd.t)
endif
endif
endif
set i = i + 1
endloop
/*if(not check) then
call SetUnitAnimationByIndex(attacker, ANIME_READY)
set s = gg_snd_Error
if(GetLocalPlayer() == owner) then
call StartSound(s)
endif
set s = null
endif*/
set attacker = null
set owner = null
set attacked = null
set s = null
endfunction
//----------------------------------------------------------------
private function Attack_Conditions takes nothing returns boolean
return GetUnitTypeId(GetAttacker()) == UNIT_ID and Total > 0
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(VengeanceCancelTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(VengeanceCancelTrg, Condition(function Cancel_Conditions))
call TriggerAddAction(VengeanceCancelTrg, function Cancel_Actions)
call TriggerRegisterAnyUnitEventBJ(VengeanceTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(VengeanceTrg, Condition(function Conditions))
call TriggerAddAction(VengeanceTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(VengeanceStopTrg, EVENT_PLAYER_UNIT_SPELL_ENDCAST)
call TriggerAddCondition(VengeanceStopTrg, Condition(function Conditions))
call TriggerAddAction(VengeanceStopTrg, function Stop_Actions)
call TriggerRegisterAnyUnitEventBJ(VengeanceAttackTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(VengeanceAttackTrg, Condition(function Attack_Conditions))
call TriggerAddAction(VengeanceAttackTrg, function Attack_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set loc1 = Location(0, 0)
set loc2 = Location(0, 0)
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY1_ID)
call AbilityPreload(ABILITY2_ID)
call AbilityPreload(ABILITY3_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
call Preload(CROSS_EFFECT)
endfunction
endscope
//TESH.scrollpos=272
//TESH.alwaysfold=0
scope PhantomKnives initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A07D' //Spell Phantom Knives Strike rawcode
private constant integer DUMMY_ID = 'n01I' //Dummy knives rawcode
private constant integer ABILITY1_ID = 'Apiv' //Ability parmenent invisibility rawcode
private constant integer DUMMY1_ID = 'espv' //Dummy shadow unit
private constant real MAX_RANGE = 1000.0 //Max range cast
private constant integer ITEM1_UPGRADE = 'I003' //Item Bronzesteel Knife
private constant real UPGRADE1_MOVE_SPEED = 40.0 //Upgrade 1 effect
private constant string SPELL_EFFECT = "Abilities\\Spells\\NightElf\\FanOfKnives\\FanOfKnivesCaster.mdl" //Effect of spell
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_POISON //Spell damage type
endglobals
//Move speed
private function Move_Speed takes integer level returns real
return 60.0 + (0.0 * level)
endfunction
//Percent
private function Percent_Use takes integer level returns integer
return 0 + (0 * level)
endfunction
//Damage deal
private function Damage takes integer level returns real
if(level == 1) then
return 40.0
elseif(level == 2) then
return 70.0
elseif(level == 3) then
return 130.0
elseif(level == 4) then
return 220.0
else
return 0.0
endif
endfunction
//Radius
private function Radius takes integer level returns real
return 375.0 + (25.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct PhantomKnives_Data
unit u //Unit caster
integer uId //Caster id
player o //Owner of caster
group g //Group target
unit dum //Dummy knives
unit dum1 //Dummy shade
boolean c //Casting
real x //X
real y //Y
real f //Facing
real cos //Cos angle
real sin //Sin angle
real ms //Move speed
real d //Distance
real dm //Distance max
integer p //Percent to damage
integer pm //Percent decrease per target
real dd //Damage deal
real dr //Damage radius
real drm //Max damage radius
boolean s //Shade
endstruct
//----------------------------------------------------------------
globals
private group all
private boolexpr bexpr
private timer Tim
private integer Total
private PhantomKnives_Data array Ar[10]
private location loc
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
function Launch_Phantom_Knives takes unit u returns nothing
local integer casterID = GetUnitUserData(u)
local integer level = GetUnitAbilityLevel(u, SPELL_ID)
local real casterX = GetUnitX(u)
local real casterY = GetUnitY(u)
local player owner = GetOwningPlayer(u)
local unit f = null
call Timed_AddSpecialEffect(SPELL_EFFECT, casterX, casterY, 1.0)
call GroupEnumUnitsInRange(all, casterX, casterY, Radius(level), bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, owner)) then
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(u, f, Damage(level), true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(u, f, Damage(level), true, false, A_TYPE, D_TYPE, null)
endif
endif
endloop
set u = null
set owner = null
set f = null
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local PhantomKnives_Data sd
local integer i = 0
local integer j = 0
local real x = 0.0
local real y = 0.0
local unit f = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.d > 0.0 and sd.p > 0) then
set x = sd.x + sd.ms * sd.cos
set y = sd.y + sd.ms * sd.sin
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
call SetUnitX(sd.dum, x)
call SetUnitY(sd.dum, y)
set sd.x = x
set sd.y = y
endif
call GroupEnumUnitsInRange(all, sd.x, sd.y, sd.dr, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o) and (not IsUnitInGroup(f, sd.g))) then
call GroupAddUnit(sd.g, f)
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.dd * (sd.p * 0.01), true, true, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.dd * (sd.p * 0.01), true, true, A_TYPE, D_TYPE, null)
endif
if(sd.p > 0) then
set sd.p = sd.p - sd.pm
endif
endif
endloop
set sd.d = sd.d - sd.ms
if(sd.dr < sd.drm) then
set sd.drm = sd.drm + 30.0
endif
elseif(sd.c) then
call SetUnitAnimation(sd.u, "attack")
call QueueUnitAnimation(sd.u, "ready")
call SetUnitAnimation(sd.dum1, "attack")
call QueueUnitAnimation(sd.dum1, "ready")
call KillUnit(sd.dum)
set sd.dum = null
set sd.x = GetUnitX(sd.u)
set sd.y = GetUnitY(sd.u)
set sd.dum = CreateUnit(sd.o, DUMMY_ID, sd.x, sd.y, sd.f)
call SetUnitAnimation(sd.dum, "birth"+I2S(GetRandomInt(1, 3)))
set sd.d = sd.dm
set sd.p = 100
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
else
call KillUnit(sd.dum)
set sd.dum = null
if(sd.s) then
call KillUnit(sd.dum1)
set sd.s = false
endif
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
set sd.u = null
set sd.o = null
set sd.dum1 = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local PhantomKnives_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
local unit target = GetSpellTargetUnit()
local real targetX = 0.0
local real targetY = 0.0
local real rad = 0.0
local real face = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local real portion = 0.0
local integer i = 0
local boolean isNull = (Ar[Total] == null)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
if(isNull) then
set sd = PhantomKnives_Data.create()
set sd.g = CreateGroup()
else
set sd = Ar[Total]
endif
if(target == null) then
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
else
set targetX = GetUnitX(target)
set targetY = GetUnitY(target)
endif
set rad = Atan2(targetY - casterY, targetX - casterX)
set face = rad * bj_RADTODEG
set dx = casterX - targetX
set dy = casterY - targetY
set distance = SquareRoot(dx * dx + dy * dy)
set portion = distance / (MAX_RANGE/4)
set sd.u = caster
set sd.uId = casterID
set sd.o = owner
set sd.dum = CreateUnit(owner, DUMMY_ID, casterX, casterY, face)
call SetUnitAnimation(sd.dum, "birth"+I2S(GetRandomInt(1, 3)))
set sd.c = true
set sd.x = casterX
set sd.y = casterY
set sd.f = face
set sd.cos = Cos(rad)
set sd.sin = Sin(rad)
set sd.ms = Move_Speed(level)
set sd.d = distance
set sd.dm = distance
set sd.p = 100
set sd.pm = Percent_Use(level)
set sd.dd = Damage(level) * portion
set sd.dd = sd.dd// + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.dr = 100.0
set sd.drm = Radius(level)
set sd.s = (GetUnitAbilityLevel(caster, ABILITY1_ID) > 0)
if(sd.s) then
set sd.dum1 = CreateUnit(owner, DUMMY1_ID, casterX, casterY, face)
call UnitAddAbility(sd.dum1, 'Arav')
call UnitRemoveAbility(sd.dum1, 'Arav')
call SetUnitPathing(sd.dum1, false)
call SetUnitX(sd.dum1, casterX)
call SetUnitY(sd.dum1, casterY)
call SetUnitAnimation(sd.dum1, "attack")
else
set sd.dum1 = null
endif
call SetUnitAnimation(caster, "attack")
if(item1 > 0) then
set sd.ms = sd.ms + UPGRADE1_MOVE_SPEED
endif
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set owner = null
set target = null
endfunction
//----------------------------------------------------------------
private function Stop_Actions takes nothing returns nothing
local PhantomKnives_Data sd
local unit caster = GetTriggerUnit()
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set sd.c = false
endif
set i = i + 1
endloop
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return (GetSpellAbilityId() == SPELL_ID)
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(PhantomKnivesTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(PhantomKnivesTrg, Condition(function Conditions))
call TriggerAddAction(PhantomKnivesTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(PhantomKnivesStopTrg, EVENT_PLAYER_UNIT_SPELL_ENDCAST)
call TriggerAddCondition(PhantomKnivesStopTrg, Condition(function Conditions))
call TriggerAddAction(PhantomKnivesStopTrg, function Stop_Actions)
//Setting globals
set all = CreateGroup()
set bexpr = Condition(function Pick)
set Tim = CreateTimer()
set Total = 0
set loc = Location(0, 0)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY1_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=23
//TESH.alwaysfold=0
scope Blink initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL1_ID = 'AEbl' //Spell Blink rawcode
private constant integer SPELL2_ID = 'A07E' //Spell Return rawcode
private constant integer ABILITY_ID = 'A07D' //Ability Phantom Knives rawcode
private constant integer ABILITY1_ID = 'Apiv' //Ability parmenent invisibility rawcode
private constant integer DUMMY_ID = 'espv' //Dummy shadow unit
private constant integer RETURN_ID = 'n01V' //Dummy return unit
private constant real DUMMY_LIFE_TIME = 1.0 //Dummy life time
private constant integer X_KEY = 1 //Key of x
private constant integer Y_KEY = 2 //Key of y
private constant real EXTRA_RANGE = 200.0 //Extra range
private constant integer SHADE_SHIFT_ITEM2_UPGRADE = 'rugt' //Item Aphotical Scythe
private constant integer ITEM1_UPGRADE = 'rag1' //Item Walking Slippers
private constant real UPGRADE1_DISTANCE = 50.0 //Upgrade 1 effect
private constant integer ITEM2_UPGRADE = 'I017' //Item Platinum Sprinter
private constant real UPGRADE2_RANGE = 100.0 //Upgrade 1 effect
private constant string DAMAGE_EFFECT = "Abilities\\Spells\\Other\\Stampede\\StampedeMissileDeath.mdl" //Effect damage to unit affected
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\NightElf\\Blink\\BlinkCaster.mdl" //Effect of cast
private constant string SPECIAL_EFFECT_TARGET = "Abilities\\Spells\\NightElf\\Blink\\BlinkTarget.mdl" //Effect of target
private constant attacktype A_TYPE = ATTACK_TYPE_CHAOS //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_UNIVERSAL //Spell damage type
endglobals
//Range of the return spell
private function Range takes integer level returns real
if(level == 1) then
return 1000.0
elseif(level == 2) then
return 1200.0
elseif(level == 3) then
return 1600.0
else
return 0.0
endif
endfunction
//Radius of the spell will affect
private function Shadow_Radius takes integer level returns real
return 150.0 + (0 * level)
endfunction
//Damage to enemies
private function Shadow_Damage takes integer level returns real
return 200.0 + (0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.5
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Return_Data
unit u //Unit caster
unit dum //Unit dummy
endstruct
//----------------------------------------------------------------
globals
private group all
private group part
private group copy
private group dummies
private boolexpr b
private hashtable ht = InitHashtable()
private location spellLoc
private timer Tim
private integer Total
private Return_Data array Ar[10]
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Return_Data sd
local integer i = 0
local integer level = 0
local real range = 0.0
local real cX = 0.0
local real cY = 0.0
local real tX = 0.0
local real tY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local integer item2 = 0
local real extraRange = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
set level = GetUnitAbilityLevel(sd.u, SPELL1_ID)
if(level > 0) then
if(GetUnitAbilityLevel(sd.u, SPELL2_ID) <= 0) then
call UnitAddAbility(sd.u, SPELL2_ID)
call SetUnitAbilityLevel(sd.u, SPELL2_ID, level)
call ShowUnit(sd.dum, true)
endif
set range = Range(level)
set cX = GetUnitX(sd.u)
set cY = GetUnitY(sd.u)
set tX = GetUnitX(sd.dum)
set tY = GetUnitY(sd.dum)
set dx = cX - tX
set dy = cY - tY
set distance = SquareRoot(dx * dx + dy * dy)
set item2 = IsUnitHasItemType(sd.u, ITEM1_UPGRADE)
set extraRange = EXTRA_RANGE
if(item2 > 0) then
set extraRange = extraRange + UPGRADE2_RANGE
endif
if(distance > range + extraRange) then
call SetUnitVertexColor(sd.dum, 255, 0, 0, 255)
else
call SetUnitVertexColor(sd.dum, 255, 255, 255, 255)
endif
else
if(GetUnitAbilityLevel(sd.u, SPELL2_ID) > 0) then
call UnitRemoveAbility(sd.u, SPELL2_ID)
call ShowUnit(sd.dum, false)
endif
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Return_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL1_ID)
local player owner = GetOwningPlayer(caster)
local integer spell = GetSpellAbilityId()
local integer rangeLvl = GetUnitAbilityLevel(caster, spell)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local real spellX = 0.0
local real spellY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local integer imax = 0
local real ix = 0.0
local real iy = 0.0
local real angle = 0.0
local unit f = null
local integer i = 0
local real damage = 0.0
local unit dummy = null
local boolean exist = false
local real extraRange = EXTRA_RANGE
local integer item2 = IsUnitHasItemType(caster, ITEM2_UPGRADE)
if(item2 > 0) then
set extraRange = extraRange + UPGRADE2_RANGE
endif
call DestroyEffect(AddSpecialEffect(SPECIAL_EFFECT_TARGET, casterX, casterY))
set exist = false
set copy = CopyGroup(dummies)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == owner) then
set exist = true
call SetUnitX(f, casterX)
call SetUnitY(f, casterY)
endif
endloop
if(not exist) then
set f = CreateUnit(owner, RETURN_ID, casterX, casterY, GetUnitFacing(caster))
call SetUnitAnimation(f, "ready")
call GroupAddUnit(dummies, f)
call UnitAddAbility(f, 'Arav')
call UnitRemoveAbility(f, 'Arav')
call SetUnitPathing(f, false)
call SetUnitX(f, casterX)
call SetUnitY(f, casterY)
set sd = Return_Data.create()
set sd.u = caster
set sd.dum = f
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set f = null
endif
if(GetUnitAbilityLevel(caster, ABILITY1_ID) > 0)then
if(spell == SPELL1_ID) then //Blink
set spellLoc = GetSpellTargetLoc()
set spellX = GetLocationX(spellLoc)
set spellY = GetLocationY(spellLoc)
elseif(spell == SPELL2_ID) then //Return
if HaveSavedReal(ht, casterID, X_KEY) then
set spellX = LoadReal(ht, casterID, X_KEY)
set spellY = LoadReal(ht, casterID, Y_KEY)
else
set spellX = GetUnitX(caster)
set spellY = GetUnitY(caster)
endif
endif
set dx = spellX - casterX
set dy = spellY - casterY
set distance = SquareRoot(dx * dx + dy * dy)
set imax = R2I(distance)
set angle = bj_RADTODEG * Atan2(spellY - casterY, spellX - casterX)
if(GetUnitAbilityLevel(caster, ABILITY_ID) > 0) then
call Launch_Phantom_Knives(caster)
endif
if(spell == SPELL2_ID and (Range(rangeLvl) + extraRange >= imax)) then
call SetUnitX(caster, spellX)
call SetUnitY(caster, spellY)
call SetUnitFacing(caster, angle)
endif
set dummy = CreateUnit(owner, DUMMY_ID, spellX, spellY, angle)
call SetUnitAnimation(dummy, "ready")
call UnitApplyTimedLife(dummy, 'BTLF', DUMMY_LIFE_TIME)
call UnitAddAbility(dummy, 'Arav')
call UnitRemoveAbility(dummy, 'Arav')
call SetUnitPathing(dummy, false)
call SetUnitX(dummy, spellX)
call SetUnitY(dummy, spellY)
call SaveReal(ht, casterID, X_KEY, casterX)
call SaveReal(ht, casterID, Y_KEY, casterY)
set i = 0
loop
exitwhen(i >= imax)
set ix = casterX + i * Cos(angle * bj_DEGTORAD)
set iy = casterY + i * Sin(angle * bj_DEGTORAD)
call GroupEnumUnitsInRange(part, ix, iy, Shadow_Radius(level), b)
loop
set f = FirstOfGroup(part)
exitwhen(f == null)
call GroupRemoveUnit(part, f)
call GroupAddUnit(all, f)
endloop
set i = i + 1
endloop
if(IsUnitHasItemType(caster, SHADE_SHIFT_ITEM2_UPGRADE) > 0) then
set damage = Shadow_Damage(level)
set damage = damage + (damage * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, owner)) then
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT_TARGET, f, "origin"))
call UnitDamageTarget(caster, f, damage, true, false, A_TYPE, D_TYPE, null)
endif
endloop
endif
else
if(spell == SPELL2_ID) then //Return
if(HaveSavedReal(ht, casterID, X_KEY)) then
set spellX = LoadReal(ht, casterID, X_KEY)
set spellY = LoadReal(ht, casterID, Y_KEY)
else
set spellX = casterX
set spellY = casterY
endif
set dx = spellX - casterX
set dy = spellY - casterY
set imax = R2I(SquareRoot(dx * dx + dy * dy))
if(GetUnitAbilityLevel(caster, ABILITY_ID) > 0) then
call Launch_Phantom_Knives(caster)
endif
if(Range(rangeLvl) + extraRange >= imax) then
call SetUnitX(caster, spellX)
call SetUnitY(caster, spellY)
call SetUnitFacing(caster, bj_RADTODEG * Atan2(spellY - casterY, spellX - casterX))
endif
elseif(spell == SPELL1_ID) then //Blink
if(GetUnitAbilityLevel(caster, ABILITY_ID) > 0) then
call Launch_Phantom_Knives(caster)
endif
endif
call SaveReal(ht, casterID, X_KEY, casterX)
call SaveReal(ht, casterID, Y_KEY, casterY)
endif
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, caster, "origin"))
set caster = null
set owner = null
set dummy = null
set f = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL1_ID or /*
*/GetSpellAbilityId() == SPELL2_ID
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local unit learner = GetLearningUnit()
local integer level = GetUnitAbilityLevel(learner, SPELL1_ID)
if(level <= 1) then
call UnitAddAbility(learner, SPELL2_ID)
else
call SetUnitAbilityLevel(learner, SPELL2_ID, level)
endif
set learner = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
return(GetLearnedSkill() == SPELL1_ID)
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(BlinkLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(BlinkLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(BlinkLearnTrg, function Learn_Actions)
call TriggerRegisterAnyUnitEventBJ(BlinkTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(BlinkTrg, Condition(function Conditions))
call TriggerAddAction(BlinkTrg, function Actions)
//Setting globals
set all = CreateGroup()
set part = CreateGroup()
set copy = CreateGroup()
set dummies = CreateGroup()
set b = Condition(function Pick)
set spellLoc = Location(0, 0)
set Tim = CreateTimer()
set Total = 0
//Preload
call AbilityPreload(SPELL1_ID)
call AbilityPreload(SPELL2_ID)
call AbilityPreload(ABILITY_ID)
call AbilityPreload(ABILITY1_ID)
call Preload(DAMAGE_EFFECT)
call Preload(SPECIAL_EFFECT)
call Preload(SPECIAL_EFFECT_TARGET)
endfunction
endscope
//TESH.scrollpos=96
//TESH.alwaysfold=0
scope PoisonGlaive initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A07F' //Spell Poison Glaive rawcode
private constant integer ABILITY_ID = 'A07G' //Ability Poison Glaive (Buffer) rawcode
private constant integer BUFF_ID = 'B024' //Buff Poison Glaive rawcode
private constant integer UNIT_ID = 'Ewar' //Unit Shadow Assassin rawcode
private constant integer UNIT1_ID = 'E000' //Unit Shadow Assassin (Shadow Form) rawcode
private constant integer COUNT_KEY = 0 //Count poison key
private constant integer LEVEL_KEY = 1 //Poison level key
private constant integer ITEM1_UPGRADE = 'I00S' //Item Truepierce Lance
private constant real UPGRADE1_DURATION = 3.0 //Upgrade 1 effect
private constant string DAMAGE_EFFECT = "Abilities\\Spells\\Other\\Stampede\\StampedeMissileDeath.mdl" //Damage effect
private constant string SPELL_EFFECT = "Abilities\\Weapons\\PoisonSting\\PoisonStingTarget.mdl" //Damage effect to target
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Other\\AcidBomb\\BottleImpact.mdl" //Special effect at target
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_POISON //Spell damage type
endglobals
//Count charge of poison
private function Amount takes integer level returns integer
if(level == 1) then
return 3
elseif(level == 2) then
return 5
elseif(level == 3) then
return 9
else
return 0
endif
endfunction
//Turn speed decrease per attack
private function Turn_Speed takes integer level returns real
return 0.2 + (0.02 * level)
endfunction
//Damage per interval
private function Damage takes integer level returns real
return 0.0 + (12.0 * level)
endfunction
//Duration
private function Duration takes integer level returns real
return 5.0 + (0.0 * level)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Glaive_Data
unit u //Unit attacker
unit t //Unit attacked
real d //Damage per second
real i //Interval
real tm //Time
real ts //Turn speed
effect e //Special effect
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Glaive_Data array Ar[100]
private hashtable ht
endglobals
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local integer poisonLevel = GetUnitAbilityLevel(caster, ABILITY_ID)
local player owner = GetOwningPlayer(caster)
local integer count = 0
local real angle = (GetUnitFacing(caster) + 180) * bj_DEGTORAD
local integer number = 0
local string text = ""
if(HaveSavedInteger(ht, casterID, COUNT_KEY)) then
if(poisonLevel <= 0) then
call UnitAddAbility(caster, ABILITY_ID)
else
call SetUnitAbilityLevel(caster, ABILITY_ID, level)
endif
call SetUnitAbilityLevel(caster, ABILITY_ID, level)
//set count = LoadInteger(ht, casterID, COUNT_KEY)
/*
if(count < Amount(level)) then
set count = count + 1
endif
*/
call SaveInteger(ht, casterID, COUNT_KEY, Amount(level))
call SaveInteger(ht, casterID, LEVEL_KEY, level)
else
call UnitAddAbility(caster, ABILITY_ID)
call SetUnitAbilityLevel(caster, ABILITY_ID, level)
call SaveInteger(ht, casterID, 0, Amount(level))
call SaveInteger(ht, casterID, 1, level)
endif
call Timed_AddSpecialEffectTarget(SPELL_EFFECT, caster, "weapon", 1.0)
set text = ""
set number = LoadInteger(ht, casterID, COUNT_KEY)
if(GetLocalPlayer() == owner) then
set text = I2S(number)
endif
call TextTag_AttachUnit(text, 10.0 * 0.023 / 10.0, caster, 30.0, /*
*/R2I(0.0 * 255.0 * 0.01), R2I(100.0 * 255.0 * 0.01), R2I(0.0 * 255.0 * 0.01), R2I(100.0 * 255.0 * 0.01), /*
*/50.0 * 0.071 / 128.0 * Cos(90.0 * bj_DEGTORAD), 50.0 * 0.071 / 128.0 * Sin(90.0 * bj_DEGTORAD), /*
*/false, 5.00, 1.75)
set caster = null
set owner = null
set text = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Glaive_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.tm > 0) then
set sd.tm = sd.tm - Interval()
if(sd.i > 0) then
set sd.i = sd.i - Interval()
else
if(IsUnitType(sd.t, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, sd.t, sd.d, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, sd.t, sd.d, true, false, A_TYPE, D_TYPE, null)
endif
set sd.i = 1.0
endif
call SetUnitTurnSpeed(sd.t, sd.ts)
else
call DestroyEffect(sd.e)
set sd.e = null
call SetUnitTurnSpeed(sd.t, GetUnitDefaultTurnSpeed(sd.t))
set sd.u = null
set sd.t = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
function PoisonGlaive_onDamage takes unit attacker, unit attacked, real amount returns nothing
local Glaive_Data sd = Glaive_Data.create()
local integer attackerID = GetUnitUserData(attacker)
local integer attackerType = GetUnitTypeId(attacker)
local integer level = LoadInteger(ht, attackerID, 1)
local integer count = LoadInteger(ht, attackerID, 0)
local real angle = (GetUnitFacing(attacker) + 180) * bj_DEGTORAD
local real turnSpeed = 0.0
local integer item1 = IsUnitHasItemType(attacker, ITEM1_UPGRADE)
if(count > 0) then
set count = count - 1
if(count <= 0) then
call UnitRemoveAbility(attacker, ABILITY_ID)
endif
endif
call TextTag_AttachUnit(I2S(count), 10.0 * 0.023 / 10.0, attacker, 30.0, /*
*/R2I(0.0 * 255.0 * 0.01), R2I(100.0 * 255.0 * 0.01), R2I(0.0 * 255.0 * 0.01), R2I(100.0 * 255.0 * 0.01), /*
*/50.0 * 0.071 / 128.0 * Cos(angle), 50.0 * 0.071 / 128.0 * Sin(angle), /*
*/false, 5.00, 1.75)
call SaveInteger(ht, attackerID, 0, count)
set sd.u = attacker
set sd.t = attacked
set sd.d = Damage(level)// + (Damage(level) * LoadInteger(MagicDamage_Ht, attackerID, 0) * 0.01)
set sd.i = 1.0
set sd.tm = Duration(level)
set sd.e = AddSpecialEffectTarget(SPECIAL_EFFECT, sd.t, "head")
set turnSpeed = GetUnitTurnSpeed(attacked) - Turn_Speed(level)
if(turnSpeed > 0) then
call SetUnitTurnSpeed(attacked, turnSpeed)
else
call SetUnitTurnSpeed(attacked, 0.01)
set turnSpeed = 0.01
endif
set sd.ts = turnSpeed
call UnitRemoveAbility(attacked, BUFF_ID)
if(attackerType == UNIT1_ID) then
endif
if(item1 > 0) then
set sd.tm = sd.tm + UPGRADE1_DURATION
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(PoisonGlaiveTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(PoisonGlaiveTrg, Condition(function Conditions))
call TriggerAddAction(PoisonGlaiveTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set ht = InitHashtable()
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
call Preload(DAMAGE_EFFECT)
endfunction
endscope
//TESH.scrollpos=72
//TESH.alwaysfold=0
scope ShadowStab initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A07H' //Spell Shadow Stab rawcode
private constant integer CAST_ID = 'Ablo' //Cast Shadow Stab (Speed) rawcode
private constant integer BUFF_ID = 'Bblo' //Buff Shadow Stab rawcode
private constant integer ABILITY_ID = 'A07D' //Ability Phantom Knives rawcode
private constant integer UNIT_ID = 'Ewar' //Unit Shadow Assassin rawcode
private constant integer UNIT1_ID = 'E000' //Unit Shadow Assassin (Shadow Form) rawcode
private constant integer ITEM1_UPGRADE = 'I024' //Item Deathshard
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_POISON //Spell damage type
endglobals
//Attack count
private function Count takes integer level returns integer
if(level == 1) then
return 6
elseif(level == 2) then
return 5
elseif(level == 3) then
return 3
else
return 0
endif
endfunction
//Radius to detect attacked
private function Radius takes integer level returns real
return 100.0 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct ShadowStab_Data
unit u //Unit caster
integer c //Count attack
integer mc //Max count attack
endstruct
//----------------------------------------------------------------
globals
private group all
private boolexpr bexpr
private integer Total
private ShadowStab_Data array Ar[10]
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit attacker = GetAttacker()
local integer level = GetUnitAbilityLevel(attacker, SPELL_ID)
local player owner = GetOwningPlayer(attacker)
local unit attacked = GetTriggerUnit()
local real attackedX = GetUnitX(attacked)
local real attackedY = GetUnitY(attacked)
local real rad = (GetUnitFacing(attacked) + 180.0) * bj_DEGTORAD
local real targetX = attackedX + Radius(level) * Cos(rad)
local real targetY = attackedY + Radius(level) * Sin(rad)
local unit f = null
call GroupEnumUnitsInRange(all, targetX, targetY, Radius(level), bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(f == attacker) then
call TargetCast(owner, targetX, targetY, 0.5, CAST_ID, level, "bloodlust", 0, attacker)
endif
endloop
set attacker = null
set owner = null
set attacked = null
set f = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetUnitAbilityLevel(GetAttacker(), SPELL_ID) > 0
endfunction
//----------------------------------------------------------------
private function Attack_Actions takes nothing returns nothing
local unit attacked = GetTriggerUnit()
local real attackedX = GetUnitX(attacked)
local real attackedY = GetUnitY(attacked)
local integer attackedType = GetUnitTypeId(attacked)
local integer attackedID = GetUnitUserData(attacked)
local integer level = GetUnitAbilityLevel(attacked, SPELL_ID)
local player owner = GetOwningPlayer(attacked)
local unit attacker = GetAttacker()
local ShadowStab_Data sd
local integer i = 0
local integer item1 = IsUnitHasItemType(attacked, ITEM1_UPGRADE)
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == attacked) then
if(sd.c < sd.mc) then
set sd.c = sd.c + 1
set i = Total
else
set sd.c = 0
call SetUnitAnimation(attacked, "slam")
call Launch_Phantom_Knives(attacked)
call TargetCast(owner, attackedX, attackedY, 0.5, CAST_ID, level, "bloodlust", 0, attacked)
if(item1 > 0) then
call Launch_Phantom_Knives(attacked)
endif
endif
endif
set i = i + 1
endloop
set attacked = null
set owner = null
set attacker = null
endfunction
//----------------------------------------------------------------
private function Attack_Conditions takes nothing returns boolean
return (GetUnitAbilityLevel(GetTriggerUnit(), SPELL_ID) > 0 and /*
*/GetUnitAbilityLevel(GetTriggerUnit(), ABILITY_ID) > 0)
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local unit learner = GetLearningUnit()
local integer learnerID = GetUnitUserData(learner)
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
local ShadowStab_Data sd
local integer i = 0
local boolean exist = false
if(level == 1) then
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set exist = true
set sd.mc = Count(level)
set i = Total
endif
set i = i + 1
endloop
if(not exist) then
set sd = ShadowStab_Data.create()
set sd.u = learner
set sd.c = 0
set sd.mc = Count(level)
set Total = Total + 1
set Ar[Total - 1] = sd
endif
else
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set sd.mc = Count(level)
set i = Total
endif
set i = i + 1
endloop
endif
set learner = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
local unit learner = GetTriggerUnit()
local boolean okey = GetLearnedSkill() == SPELL_ID and (not IsUnitIllusion(learner))
set learner = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(ShadowStabTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(ShadowStabTrg, Condition(function Conditions))
call TriggerAddAction(ShadowStabTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(ShadowStabAttackTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(ShadowStabAttackTrg, Condition(function Attack_Conditions))
call TriggerAddAction(ShadowStabAttackTrg, function Attack_Actions)
call TriggerRegisterAnyUnitEventBJ(ShadowStabLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(ShadowStabLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(ShadowStabLearnTrg, function Learn_Actions)
//Setting globals
set all = CreateGroup()
set bexpr = Condition(function Pick)
set Total = 0
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call AbilityPreload(ABILITY_ID)
endfunction
endscope
//TESH.scrollpos=25
//TESH.alwaysfold=0
scope ShadeShift initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A07I' //Spell Shade Shift rawcode
private constant integer ABILITY_ID = 'Apiv' //Ability parmenent invisibility rawcode
private constant integer DUMMY_ID = 'espv' //Dummy shadow unit
private constant real DUMMY_LIFE_TIME = 1.0 //Dummy life time
private constant real RADIUS = 300.0 //Radius
private constant attacktype A_TYPE = ATTACK_TYPE_CHAOS //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_ENHANCED //Spell damage type
private constant string SPECIAL_EFFECT = "war3mapImported\\WarpDarkCaster.mdx" //Effect cast
private constant string SPELL_EFFECT = "war3mapImported\\OrbOfCorruption.mdx" //Effect to target
private constant integer ITEM1_UPGRADE = 'I01W' //Item Ghost Veil
private constant integer ITEM2_UPGRADE = 'rugt' //Item Aphotical Scythe
private constant string UPGRADE_EFFECT = "Abilities\\Spells\\NightElf\\Blink\\BlinkCaster.mdl" //Effect of cast
private constant string UPGRADE_EFFECT_TARGET = "Abilities\\Spells\\NightElf\\Blink\\BlinkTarget.mdl" //Effect of target
//private constant integer ANIME = 11 //Animation Stand Channel
endglobals
//Duration of shadow
private function Duration takes integer level returns real
if(level == 1) then
return 20.0
elseif(level == 2) then
return 30.0
else
return 0.0
endif
endfunction
//Duration increase when damaging
private function Duration_Increase takes integer level returns real
if(level == 1) then
return 2.0
elseif(level == 2) then
return 4.0
else
return 0.0
endif
endfunction
//Duration max
private function Duration_Max takes integer level returns real
if(level == 1) then
return 60.0
elseif(level == 2) then
return 60.0
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct ShadeShift_Data
unit u //Unit caster
player o //Owner of caster
unit dum //Dummy unit
integer l //Level
real d //Duration
real dm //Duration max
boolean s //Show dummy
real si //Show interval
integer it1 //Item 1 upgrade
integer it2 //Item 2 upgrade
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private ShadeShift_Data array Ar[10]
private integer Total
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local ShadeShift_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.d > 0) then
set sd.d = sd.d - Interval()
call SetUnitX(sd.dum, GetUnitX(sd.u))
call SetUnitY(sd.dum, GetUnitY(sd.u))
if(sd.d < 5.0) then
call SetUnitAnimation(sd.dum, "death")
endif
if(sd.s) then
if(sd.si > 0.0) then
set sd.si = sd.si - Interval()
else
//call KillUnit(sd.dum)
call SetUnitVertexColor(sd.dum, 255, 255, 255, 0)
set sd.s = false
endif
endif
else
call UnitRemoveAbility(sd.u, ABILITY_ID)
if(sd.s) then
call KillUnit(sd.dum)
endif
call SetUnitVertexColor(sd.u, 255, 255, 255, 255)
set sd.u = null
set sd.o = null
set sd.dum = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local ShadeShift_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer casterType = GetUnitTypeId(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local real face = GetUnitFacing(caster)
local player owner = GetOwningPlayer(caster)
local boolean exist = false
local integer i = 0
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_SA_ShadeShift
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
call DestroyEffect(AddSpecialEffect(SPECIAL_EFFECT, casterX, casterY))
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set sd.l = level
set sd.d = sd.d + Duration(level)
set sd.dm = Duration_Max(level)
set exist = true
set i = Total
endif
set i = i + 1
endloop
if(not exist) then
set sd = ShadeShift_Data.create()
set sd.u = caster
set sd.o = owner
set sd.dum = CreateUnit(sd.o, DUMMY_ID, casterX, casterY, face)
set sd.l = level
set sd.d = Duration(level)
set sd.dm = Duration_Max(level)
set sd.s = false
set sd.si = 0.0
set sd.it1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
set sd.it2 = IsUnitHasItemType(caster, ITEM2_UPGRADE)
call UnitAddAbility(caster, ABILITY_ID)
call SetUnitVertexColor(sd.dum, 255, 255, 255, 0)
call UnitAddAbility(sd.dum, 'Arav')
call UnitRemoveAbility(sd.dum, 'Arav')
call SetUnitPathing(sd.dum, false)
if(sd.it1 > 0 or sd.it2 > 0) then
call SetUnitVertexColor(caster, 0, 0, 0, 255)
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
set caster = null
set owner = null
set s = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return (GetSpellAbilityId() == SPELL_ID)
endfunction
//----------------------------------------------------------------
private function Attack_Actions takes nothing returns nothing
local unit attacker = GetAttacker()
local integer attackerID = GetUnitUserData(attacker)
local integer level = GetUnitAbilityLevel(attacker, SPELL_ID)
local player owner = GetOwningPlayer(attacker)
local real attackerX = GetUnitX(attacker)
local real attackerY = GetUnitY(attacker)
local unit attacked = GetTriggerUnit()
local ShadeShift_Data sd
local integer i = 0
local real rad = 0.0
local real x = 0.0
local real y = 0.0
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == attacker) then
if(not sd.s) then
//set sd.dum = CreateUnit(owner, DUMMY_ID, attackerX, attackerY, 0)
call SetUnitVertexColor(sd.dum, 255, 255, 255, 255)
endif
set sd.s = true
set sd.si = DUMMY_LIFE_TIME
if(sd.it1 > 0) then
set rad = (GetUnitFacing(attacked) + 180.0) * bj_DEGTORAD
set x = GetUnitX(attacked) + 100.0 * Cos(rad)
set y = GetUnitY(attacked) + 100.0 * Sin(rad)
call DestroyEffect(AddSpecialEffect(UPGRADE_EFFECT_TARGET, attackerX, attackerY))
call SetUnitX(attacker, x)
call SetUnitY(attacker, y)
call DestroyEffect(AddSpecialEffect(UPGRADE_EFFECT, x, y))
endif
//call SetUnitPathing(sd.dum, false)
call SetUnitFacing(sd.dum, GetUnitFacing(attacker))
call SetUnitX(sd.dum, attackerX)
call SetUnitY(sd.dum, attackerY)
call SetUnitAnimation(sd.dum, "attack")
set i = Total
endif
set i = i + 1
endloop
set attacker = null
set attacked = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Attack_Conditions takes nothing returns boolean
local unit attacker = GetAttacker()
local boolean okey = GetUnitAbilityLevel(attacker, ABILITY_ID) > 0
set attacker = null
return okey
endfunction
//----------------------------------------------------------------
function ShadeShift_onDamage takes unit attacker, unit attacked, real amount returns nothing
local real attackedX = GetUnitX(attacked)
local real attackedY = GetUnitY(attacked)
local real rad = (GetUnitFacing(attacked) + 180.0) * bj_DEGTORAD
local real targetX = attackedX// + RADIUS * Cos(rad)
local real targetY = attackedY// + RADIUS * Sin(rad)
local unit f = null
local ShadeShift_Data sd
local integer i = 0
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == attacker) then
call GroupEnumUnitsInRange(all, targetX, targetY, RADIUS, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(f == attacker) then
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, attacked, "chest"))
if(IsUnitType(attacked, UNIT_TYPE_HERO)) then
set sd.d = RMinBJ(sd.d + Duration_Increase(sd.l), sd.dm)
endif
endif
endloop
set i = Total
endif
set i = i + 1
endloop
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(ShadeShiftTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(ShadeShiftTrg, Condition(function Conditions))
call TriggerAddAction(ShadeShiftTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(ShadeShiftAttackTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(ShadeShiftAttackTrg, Condition(function Attack_Conditions))
call TriggerAddAction(ShadeShiftAttackTrg, function Attack_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY_ID)
call Preload(UPGRADE_EFFECT)
call Preload(UPGRADE_EFFECT_TARGET)
endfunction
endscope
//TESH.scrollpos=58
//TESH.alwaysfold=0
scope Berserk initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A0A0' //Spell Berserk rawcode
private constant integer DUMMY_ID = 'n01K' //Dummy Berserk rawcode
private constant integer DUMMY2_ID = 'n01P' //Dummy Berserk (Infernal) rawcode
private constant integer UNIT_ID = 'Opgh' //Unit Damned Amok (Infernal) rawcode
private constant real INTERVAL_LAUNCH = 3.0 //Interval before launch
private constant real INTERVAL_HOLD = 0.2 //Interval hold
private constant real INTERVAL_EFFECT = 0.0 //Interval for each effect
private constant integer ANIME = 11 //Animation spin
private constant integer ANIME2 = 12 //Animation spin
private constant integer ITEM1_UPGRADE = 'I004' //Item Leather Armor
private constant real UPGRADE1_DISTANCE_MOVE = 10.0 //Upgrade 1 effect
private constant string SPELL_EFFECT = "Abilities\\Weapons\\RedDragonBreath\\RedDragonMissile.mdl" //Spell effect
private constant string SPECIAL_EFFECT = "Abilities\\Weapons\\PhoenixMissile\\Phoenix_Missile.mdl" //Hand effect
private constant attacktype A_TYPE = ATTACK_TYPE_SIEGE //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_UNIVERSAL //Spell attack type
endglobals
//Max charge
private function Max_Charge takes integer level returns integer
return 4 + (0 * level)
endfunction
//Base distance
private function Base_Distance takes integer level returns real
return 600.0 + (0.0 * level)
endfunction
//Distance per charge
private function Distance takes integer level returns real
return 200.0 + (0.0 * level)
endfunction
//Distance move
private function Distance_Move takes integer level returns real
return 120.0 + (0.0 * level)
endfunction
//Damage
private function Damage takes integer level returns real
if(level == 1) then
return 20.0
elseif(level == 2) then
return 30.0
elseif(level == 3) then
return 60.0
elseif(level == 4) then
return 100.0
else
return 0.0
endif
endfunction
//Radius
private function Radius takes integer level returns real
return 300.0 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Berserk_Data
unit u //Unit caster
integer uId //Caster id
integer l //Level of spell
player o //Owner of caster
group g //Group target
unit dum //Unit dummy
integer c //Count berserk
integer cm //Max count berserk
real d //Distance travel
real dm //Distance move
real cos //Cos of angle
real sin //Sin of angle
real i //Interval
real im //Interval max
integer p //Phase
real dd //Damage
real r //Radius damage
effect e1 //Effect hand left
effect e2 //Effect hand right
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Berserk_Data array Ar[10]
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Berserk_Data sd
local integer i = 0
local real face = 0.0
local real rad = 0.0
local real x = 0.0
local real y = 0.0
local unit f = null
local sound s = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.p == 0) then
if(sd.i > 0.0) then
if(not IsUnitPaused(sd.u)) then
set sd.i = sd.i - Interval()
if(IsUnitInGroup(sd.u, InfernalCaster)) then
set sd.i = sd.im
endif
endif
if(IsUnitInGroup(sd.u, OverkillCaster)) then
set sd.c = Max_Charge(sd.l) + 1
set sd.d = Base_Distance(sd.l) + sd.c * Distance(sd.l)
set sd.dd = Damage(sd.l)// + (Damage(sd.l) * LoadInteger(MagicDamage_Ht, sd.uId, 0) * 0.01)
set sd.dd = sd.dd * sd.c
set sd.i = sd.im
endif
//if(ModuloInteger(R2I(sd.i * 100), 100) == 99) then
//endif
elseif(not IsUnitDead(sd.u) and (not IsUnitType(sd.u, UNIT_TYPE_STUNNED))) then
set sd.p = 1
set sd.i = INTERVAL_HOLD
set sd.dd = sd.dd * 2
set s = LoadSoundHandle(Heroes_Ht, sd.uId, HERO_SOUND_KEY)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_DA_Berserk
call AttachSoundToUnit(s, sd.u)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, sd.uId, HERO_SOUND_KEY, s)
call SetUnitInvulnerable(sd.u, true)
call PauseUnit(sd.u, true)
call SetUnitTimeScale(sd.u, 2.0)
call SetUnitAnimation(sd.u, "attack")
endif
elseif(sd.p == 1) then
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set face = GetUnitFacing(sd.u)
set rad = face * bj_DEGTORAD
set sd.cos = Cos(rad)
set sd.sin = Sin(rad)
//call PauseUnit(sd.u, true)
//call ShowUnit(sd.u, false)
call SetUnitVertexColor(sd.u, 255, 255, 255, 0)
if(GetUnitTypeId(sd.u) == UNIT_ID) then
set sd.dum = CreateUnit(sd.o, DUMMY2_ID, GetUnitX(sd.u), GetUnitY(sd.u), GetUnitFacing(sd.u))
set sd.e1 = AddSpecialEffectTarget(SPECIAL_EFFECT, sd.dum, "hand, left")
set sd.e2 = AddSpecialEffectTarget(SPECIAL_EFFECT, sd.dum, "hand, right")
call PauseUnit(sd.dum, true)
call SetUnitAnimationByIndex(sd.dum, ANIME2)
else
set sd.dum = CreateUnit(sd.o, DUMMY_ID, GetUnitX(sd.u), GetUnitY(sd.u), GetUnitFacing(sd.u))
set sd.e1 = AddSpecialEffectTarget(SPECIAL_EFFECT, sd.dum, "hand, left")
set sd.e2 = AddSpecialEffectTarget(SPECIAL_EFFECT, sd.dum, "hand, right")
call PauseUnit(sd.dum, true)
call SetUnitAnimationByIndex(sd.dum, ANIME)
endif
set sd.p = 2
endif
elseif(sd.p == 2) then
if(sd.d > 0.0) then
set sd.d = sd.d - sd.dm
set x = GetUnitX(sd.dum) + sd.dm * sd.cos
set y = GetUnitY(sd.dum) + sd.dm * sd.sin
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0)) and (not IsBarrel(sd.u, x, y, 100.0))) then
call SetUnitX(sd.dum, x)
call SetUnitY(sd.dum, y)
call SetUnitX(sd.u, x)
call SetUnitY(sd.u, y)
else
set sd.d = 0.0
endif
if(sd.i > 0) then
set sd.i = sd.i - Interval()
else
set sd.i = 0.0
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.dum, "hand, left"))
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.dum, "hand, right"))
endif
call HitTree(x, y, sd.r, 5.0, 0.0)
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (IsUnitEnemy(f, sd.o) and (not IsUnitInGroup(f, sd.g))) then
call GroupAddUnit(sd.g, f)
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
endloop
else
set sd.p = 3
endif
else
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
//call PauseUnit(sd.u, false)
if(sd.e1 != null) then
call DestroyEffect(sd.e1)
set sd.e1 = null
endif
if(sd.e2 != null) then
call DestroyEffect(sd.e2)
set sd.e2 = null
endif
if(sd.dum != null) then
//call SetUnitExploded(sd.dum, true)
//call KillUnit(sd.dum)
//call SetUnitVertexColor(sd.dum, 255, 255, 255, 0)
call RemoveUnit(sd.dum)
set sd.dum = null
endif
//call ShowUnit(sd.u, true)
call SetUnitVertexColor(sd.u, 255, 255, 255, 255)
//if(GetLocalPlayer() == sd.o) then
//call SelectUnit(sd.u, true)
//endif
call PauseUnit(sd.u, false)
call SetUnitInvulnerable(sd.u, false)
call SetUnitTimeScale(sd.u, 1.0)
call SetUnitAnimation(sd.u, "stand")
call Pather(sd.u, 1.0)
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, sd.u, "hand, left"))
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, sd.u, "hand, right"))
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set s = null
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Berserk_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local real angle = GetUnitFacing(caster)
local player owner = GetOwningPlayer(caster)
local boolean isNull = (Ar[Total] == null)
local integer i = 0
local boolean exist = false
local integer count = 0
local unit f = null
local string text = ""
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
if(GetUnitTypeId(caster) == UNIT_ID) then
call SetUnitAnimationByIndex(caster, ANIME2)
else
call SetUnitAnimationByIndex(caster, ANIME)
endif
call QueueUnitAnimation(caster, "stand")
set exist = false
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set exist = true
set sd.l = level
if(sd.c < sd.cm and sd.p == 0) then
set sd.c = sd.c + 1
set sd.d = sd.d + Distance(level)
set sd.i = sd.im
set sd.dd = sd.dd + Damage(level)// + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
call HitTree(casterX, casterY, Radius(level), 5.0, 0.0)
call GroupEnumUnitsInRange(all, casterX, casterY, Radius(level), bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (IsUnitEnemy(f, sd.o)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
endloop
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.u, "hand, left"))
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.u, "hand, right"))
set count = sd.c
set text = ""
if(GetLocalPlayer() == owner) then
set text = I2S(count)
endif
call TextTag_AttachUnit(text, 10.0 * 0.023 / 10.0, sd.u, 30.0, /*
*/R2I(100.0 * 255.0 * 0.01), R2I(0.0 * 255.0 * 0.01), R2I(0.0 * 255.0 * 0.01), R2I(100.0 * 255.0 * 0.01), /*
*/50.0 * 0.071 / 128.0 * Cos(90.0 * bj_DEGTORAD), 50.0 * 0.071 / 128.0 * Sin(90.0 * bj_DEGTORAD), /*
*/false, 5.00, 1.75)
if(item1 > 0) then
set sd.dm = sd.dm + UPGRADE1_DISTANCE_MOVE
endif
else
set sd.i = 0.0
call HitTree(casterX, casterY, Radius(level), 5.0, 0.0)
call GroupEnumUnitsInRange(all, casterX, casterY, Radius(level), bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (IsUnitEnemy(f, sd.o)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
endloop
endif
set i = Total
endif
set i = i + 1
endloop
if(not exist) then
if(isNull) then
set sd = Berserk_Data.create()
set sd.g = CreateGroup()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.uId = casterID
set sd.l = level
set sd.o = owner
set sd.dum = null
set sd.c = 1
set sd.cm = Max_Charge(level)
set sd.d = Distance(level) + Base_Distance(level)
set sd.dm = Distance_Move(level)
set sd.cos = 0.0
set sd.sin = 0.0
set sd.p = 0
set sd.i = INTERVAL_LAUNCH
set sd.im = sd.i
set sd.dd = Damage(level)// + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.r = Radius(level)
set sd.e1 = null
set sd.e2 = null
call HitTree(casterX, casterY, sd.r, 1.0, 0.0)
call GroupEnumUnitsInRange(all, casterX, casterY, Radius(level), bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (IsUnitEnemy(f, sd.o)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
endloop
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.u, "hand, left"))
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.u, "hand, right"))
set count = sd.c
set text = ""
if(GetLocalPlayer() == owner) then
set text = I2S(count)
endif
call TextTag_AttachUnit(text, 10.0 * 0.023 / 10.0, sd.u, 30.0, /*
*/R2I(100.0 * 255.0 * 0.01), R2I(0.0 * 255.0 * 0.01), R2I(0.0 * 255.0 * 0.01), R2I(100.0 * 255.0 * 0.01), /*
*/50.0 * 0.071 / 128.0 * Cos(90.0 * bj_DEGTORAD), 50.0 * 0.071 / 128.0 * Sin(90.0 * bj_DEGTORAD), /*
*/false, 5.00, 1.75)
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
endif
set caster = null
set owner = null
set f = null
set text = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(BerserkTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(BerserkTrg, Condition(function Conditions))
call TriggerAddAction(BerserkTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
endfunction
endscope
//TESH.scrollpos=262
//TESH.alwaysfold=0
scope Madness initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A085' //Spell Madness rawcode
private constant integer ABILITY_ID = 'AId7' //Ability Madness (Armor) rawcode
private constant integer DAMAGE_KEY = 0 //Absorb damage key
private constant integer EFFECT_KEY = 1 //Effect key
private constant integer ITEM1_UPGRADE = 'I00F' //Item Tribal Headdress
private constant real UPGRADE1_AMOUNT = 100.0 //Upgrade 1 effect
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_UNIVERSAL //Spell attack type
private constant string SPELL_EFFECT = "Abilities\\Spells\\Demon\\ReviveDemon\\ReviveDemon.mdl" //Effect target
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Other\\SoulBurn\\SoulBurnbuff.mdl" //Effect target
endglobals
//Initial amount
private function Initial_Amount takes integer level returns real
return 100 + (0.0 * level)
endfunction
//Percent damage absorb
private function Percent_Absorb takes integer level returns real
if(level == 1) then
return 0.2
elseif(level == 2) then
return 0.3
elseif(level == 3) then
return 0.5
else
return 0.0
endif
endfunction
//Duration
private function Duration takes integer level returns real
if(level == 1) then
return 30.0
elseif(level == 2) then
return 40.0
elseif(level == 3) then
return 60.0
else
return 0.0
endif
endfunction
//Radius
private function Radius takes integer level returns real
return 500.0 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_HERO) == true) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.5
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Madness_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of spell
group g //Group target
hashtable ht //Hashtable
real p //Percent absorb
real t //Timer
real i //Interval
real im //Max interval
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Madness_Data array Ar[10]
private group all
private group copy
private boolexpr bexpr
private location loc
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Madness_Data sd
local integer i = 0
local unit f = null
local player fOwner = null
local integer fID = 0
local real damage = 0.0
local string text = ""
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t > 0.0) then
set sd.t = sd.t - Interval()
set copy = CopyGroup(sd.g)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetUnitAbilityLevel(f, ABILITY_ID) <= 0) then
call UnitAddAbility(f, ABILITY_ID)
call SetUnitAbilityLevel(f, ABILITY_ID, sd.l)
endif
endloop
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
set copy = CopyGroup(sd.g)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set fOwner = GetOwningPlayer(f)
set fID = GetUnitUserData(f)
set damage = LoadReal(sd.ht, fID, DAMAGE_KEY)
set text = ""
if(IsPlayerAlly(GetLocalPlayer(), fOwner)) then
set text = I2S(R2I(damage))
endif
call TextTag_AttachUnit(text, 10.0 * 0.023 / 10.0, f, 30.0, /*
*/R2I(50.0 * 255.0 * 0.01), R2I(0.0 * 255.0 * 0.01), R2I(0.0 * 255.0 * 0.01), R2I(100.0 * 255.0 * 0.01), /*
*/50.0 * 0.071 / 128.0 * Cos(90.0 * bj_DEGTORAD), 50.0 * 0.071 / 128.0 * Sin(90.0 * bj_DEGTORAD), /*
*/false, 5.00, 1.75)
endloop
endif
else
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
set fID = GetUnitUserData(f)
call UnitRemoveAbility(f, ABILITY_ID)
call DestroyEffect(LoadEffectHandle(sd.ht, fID, EFFECT_KEY))
call FlushChildHashtable(sd.ht, fID)
endloop
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
set text = null
set fOwner = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Madness_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local real facing = GetUnitFacing(caster)
local player owner = GetOwningPlayer(caster)
local real targetX = 0.0
local real targetY = 0.0
local real amount = Initial_Amount(level) + (Initial_Amount(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
local unit f = null
local integer fID = 0
local boolean isNull = (Ar[Total] == null)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
if(item1 > 0) then
set amount = amount + UPGRADE1_AMOUNT
endif
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
if(isNull) then
set sd = Madness_Data.create()
set sd.g = CreateGroup()
set sd.ht = InitHashtable()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.p = Percent_Absorb(level)
set sd.t = Duration(level)
set sd.i = 0.0
set sd.im = 2.0
call GroupEnumUnitsInRange(all, targetX, targetY, Radius(level), bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitAlly(f, sd.o) and (not IsUnitInGroup(f, sd.g)) and GetOwningPlayer(f) != Player(PLAYER_NEUTRAL_PASSIVE)) then
set fID = GetUnitUserData(f)
call GroupAddUnit(sd.g, f)
call SaveReal(sd.ht, fID, DAMAGE_KEY, amount)
call SaveEffectHandle(sd.ht, fID, EFFECT_KEY, AddSpecialEffectTarget(SPECIAL_EFFECT, f, "overhead"))
call UnitDamageTarget(f, f, 5.0, true, false, A_TYPE, D_TYPE, null)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, f, "origin"))
call UnitAddAbility(f, ABILITY_ID)
call SetUnitAbilityLevel(f, ABILITY_ID, level)
endif
endloop
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set owner = null
set f = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
function Attack_Madness_onDamage takes unit attacker, unit attacked, real amount returns nothing
local integer attackerId = GetUnitUserData(attacker)
local Madness_Data sd
local integer i = 0
local real damage = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(IsUnitInGroup(attacker, sd.g)) then
set amount = amount * sd.p
set amount = amount + (amount * LoadInteger(MagicDamage_Ht, attackerId, 0) * 0.01)
set damage = LoadReal(sd.ht, attackerId, DAMAGE_KEY)
call SaveReal(sd.ht, attackerId, DAMAGE_KEY, damage + amount)
endif
set i = i + 1
endloop
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
function Defend_Madness_onDamage takes unit attacker, unit attacked, real amount returns nothing
local integer attackedId = GetUnitUserData(attacked)
local Madness_Data sd
local integer i = 0
local real damage = 0.0
local real heal = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(IsUnitInGroup(attacked, sd.g)) then
set damage = LoadReal(sd.ht, attackedId, DAMAGE_KEY)
/*set heal = 0.0
if(damage >= amount) then
set damage = damage - amount
set heal = 0.0
else
set heal = amount - damage
set damage = 0.0
endif*/
if(damage > amount) then
set damage = damage - amount
set heal = amount
else
set heal = damage
set damage = 0.0
endif
call SaveReal(sd.ht, attackedId, DAMAGE_KEY, damage)
call SetUnitState(attacked, UNIT_STATE_LIFE, GetUnitState(attacked, UNIT_STATE_LIFE) + heal)
endif
set i = i + 1
endloop
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(MadnessTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(MadnessTrg, Condition(function Conditions))
call TriggerAddAction(MadnessTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set copy = CreateGroup()
set bexpr = Condition(function Pick)
set loc = Location(0, 0)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
endfunction
endscope
//TESH.scrollpos=71
//TESH.alwaysfold=0
scope Enrage initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A082' //Spell Enrage rawcode
private constant integer UNIT_ID = 'Opgh' //Unit Damned Amok (Infernal) rawcode
private constant real DURATION_INFUSE = 3.0 //Duration to infuse
private constant real INTERVAL_CHECK = 1.0 //Interval madness
private constant real INTERVAL_USE = 2.0 //Interval use madness
private constant integer ITEM1_UPGRADE = 'I01D' //Item Larynxrage
private constant real UPGRADE1_INFUSE = 1.5 //Upgrade 1 effect
private constant string SPELL_EFFECT = "RedCharkaExplosion.mdx" //Move effect
private constant string CHARGED_EFFECT = "Abilities\\Spells\\NightElf\\BattleRoar\\RoarCaster.mdl" //Move effect
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_ENHANCED //Spell damage type
endglobals
//Max damage percent
private function Max_Damage takes integer level returns real
if(level == 1) then
return 100.0
elseif(level == 2) then
return 150.0
elseif(level == 3) then
return 200.0
else
return 0.0
endif
endfunction
//Damage percent increase per second
private function Damage takes integer level returns real
if(level == 1) then
return 20.0
elseif(level == 2) then
return 30.0
elseif(level == 3) then
return 40.0
else
return 0.0
endif
endfunction
//Radius knockback
private function Radius takes integer level returns real
return 300.0 + (0.0 * level)
endfunction
//Move speed increase
private function Move_Speed takes integer level returns real
if(level == 1) then
return 60.0
elseif(level == 2) then
return 90.0
elseif(level == 3) then
return 120.0
else
return 0.0
endif
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Enrage_Data
unit u //Unit caster
integer uId //Caster id
integer l //Level of spell
player o //Owner of caster
group g //Create group
real i //Interval check
real im //Interval max check
real d //Duration to fused
real dm //Duration max
boolean st //Start fusing
boolean ed //End fusing
boolean a //Attacked
boolean c //Charging
real dd //Percent damage deal
real r //Radius knockback
real mv //Movement speed increase
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Enrage_Data array Ar[10]
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Enrage_Data sd
local integer i = 0
local real x = 0.0
local real y = 0.0
local unit f = null
local integer item1 = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if((not IsUnitDead(sd.u)) and GetUnitAbilityLevel(sd.u, SPELL_ID) > 0) then
if(sd.a) then
if(sd.i > 0) then
set sd.i = sd.i - Interval()
else
set sd.d = sd.dm
set sd.c = false
set sd.a = false
set sd.st = false
set sd.ed = false
set sd.dd = 0.0
if(IsUnitHasItemType(sd.u, ITEM1_UPGRADE) > 0) then
set sd.d = sd.d - UPGRADE1_INFUSE
endif
call SetUnitMoveSpeed(sd.u, GetUnitDefaultMoveSpeed(sd.u))
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
endif
else
if(sd.c) then
if(sd.dd < Max_Damage(sd.l)) then
if(sd.i > 0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
set sd.dd = sd.dd + Damage(sd.l)
if(not sd.st) then
if(not IsUnitPaused(sd.u) and (not IsUnitLoaded(sd.u)) and (IsUnitVisible(sd.u, sd.o))) then
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.u, "origin"))
endif
set sd.st = true
endif
endif
else
if(sd.i > 0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
if(not sd.ed) then
if(not IsUnitPaused(sd.u) and (not IsUnitLoaded(sd.u)) and (IsUnitVisible(sd.u, sd.o))) then
call DestroyEffect(AddSpecialEffectTarget(CHARGED_EFFECT, sd.u, "origin"))
endif
set sd.ed = true
endif
endif
endif
else
if(sd.d > 0) then
set sd.d = sd.d - Interval()
if(GetUnitTypeId(sd.u) == UNIT_ID) then
set sd.d = 0.0
endif
else
set sd.c = true
if(GetUnitTypeId(sd.u) == UNIT_ID) then
set sd.dd = Max_Damage(sd.l)
endif
call SetUnitMoveSpeed(sd.u, GetUnitMoveSpeed(sd.u) + sd.mv)
set sd.d = sd.dm
set sd.i = sd.im
endif
endif
endif
else
set sd.i = 0.0
set sd.d = 0.0
set sd.c = false
set sd.dd = 0.0
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
function Enrage_onDamage takes unit attacker, unit attacked, real amount returns nothing
local Enrage_Data sd
local integer i = 0
local real damage = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == attacker and sd.c) then
if(not sd.a) then
set damage = amount * (sd.dd / 100)
set damage = damage// + (damage * LoadInteger(MagicDamage_Ht, sd.uId, 0) * 0.01)
if(not IsUnitInGroup(attacked, sd.g)) then
call GroupAddUnit(sd.g, attacked)
call UnitDamageTarget(sd.u, attacked, damage, true, false, A_TYPE, D_TYPE, null)
endif
set sd.a = true
set sd.d = 0.0
set sd.i = INTERVAL_USE
else
set damage = amount * (sd.dd / 100)
set damage = damage + (damage * LoadInteger(MagicDamage_Ht, sd.uId, 0) * 0.01)
if(not IsUnitInGroup(attacked, sd.g)) then
call GroupAddUnit(sd.g, attacked)
call UnitDamageTarget(sd.u, attacked, damage, true, false, A_TYPE, D_TYPE, null)
endif
endif
set i = Total
endif
set i = i + 1
endloop
set attacked = null
set attacker = null
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local unit learner = GetLearningUnit()
local player owner = GetOwningPlayer(learner)
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
local Enrage_Data sd
local integer i = 0
local boolean exist = false
if(level <= 1) then
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set exist = true
set sd.l = level
set sd.mv = Move_Speed(level)
endif
set i = i + 1
endloop
if(not exist) then
set sd = Enrage_Data.create()
set sd.u = learner
set sd.uId = GetUnitUserData(learner)
set sd.l = level
set sd.o = owner
set sd.g = CreateGroup()
set sd.i = INTERVAL_CHECK
set sd.im = INTERVAL_CHECK
set sd.d = DURATION_INFUSE
set sd.dm = DURATION_INFUSE
set sd.st = false
set sd.ed = false
set sd.a = false
set sd.c = false
set sd.dd = 0.0
set sd.r = Radius(level)
set sd.mv = Move_Speed(level)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
else
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set sd.l = level
set sd.mv = Move_Speed(level)
endif
set i = i + 1
endloop
endif
set learner = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
local unit learner = GetTriggerUnit()
local boolean okey = (GetLearnedSkill() == SPELL_ID) and (not IsUnitIllusion(learner))
set learner = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(EnrageLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(EnrageLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(EnrageLearnTrg, function Learn_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
call Preload(CHARGED_EFFECT)
endfunction
endscope
//TESH.scrollpos=17
//TESH.alwaysfold=0
globals
group InfernalCaster = CreateGroup()
endglobals
scope Infernal initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'AEme' //Spell Infernal rawcode
private constant integer UNIT_ID = 'Opgh' //Unit Damned Amok (Infernal) rawcode
private constant integer ANIME = 13 //Animation change
private constant real KNOCKBACK_DURATION = 1.0 //Knockback duration
private constant real KNOCKBACK_DISTANCE = 300.0 //Knockback distance
private constant integer ITEM1_UPGRADE = 'I025' //Item Encease Siege
private constant real UPGRADE1_STRENGTH = 1.0 //Upgrade 1 effect
private constant string SPELL_EFFECT = "Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl" //Spell effect
private constant string SPECIAL_EFFECT = "Abilities\\Weapons\\RedDragonBreath\\RedDragonMissile.mdl" //Knockback effect
private constant attacktype A_TYPE = ATTACK_TYPE_CHAOS //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_FIRE //Spell attack type
endglobals
//Damage percent strength
private function Damage takes integer level returns real
if(level == 1) then
return 1.0
elseif(level == 2) then
return 1.0
elseif(level == 3) then
return 1.0
else
return 0.0
endif
endfunction
//Life trigger
private function Life takes integer level returns real
return 0.1 + (0.0 * level)
endfunction
//Radius
private function Radius takes integer level returns real
return 200.0 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_ANCIENT) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 1.0
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Infernal_Data
unit u //Unit caster
integer uID //Caster user data
player o //Owner of caster
real l //Life percent trigger
real i //Interval
real im //Interval max
boolean c //Cast
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Infernal_Data array Ar[10]
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Infernal_Data sd
local integer i = 0
local real life = 0.0
local real maxLife = 0.0
local integer level = 0
local unit f = null
local real fAngle = 0.0
local real damage = 0.0
local real x = 0.0
local real y = 0.0
local integer item1 = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if((not IsUnitDead(sd.u))) then
set life = GetUnitState(sd.u, UNIT_STATE_LIFE)
set maxLife = GetUnitState(sd.u, UNIT_STATE_MAX_LIFE)
if(GetUnitTypeId(sd.u) == UNIT_ID) then
if(sd.c) then
set sd.c = false
call SetUnitInvulnerable(sd.u, false)
call SetUnitTimeScale(sd.u, 1.0)
call GroupRemoveUnit(InfernalCaster, sd.u)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.u, "origin"))
set item1 = IsUnitHasItemType(sd.u, ITEM1_UPGRADE)
set level = GetUnitAbilityLevel(sd.u, SPELL_ID)
set damage = Damage(level)// + (Damage(level) * LoadInteger(MagicDamage_Ht, sd.uID, 0) * 0.01)
if(item1 > 0) then
set damage = damage * (GetHeroStr(sd.u, true) + UPGRADE1_STRENGTH)
else
set damage = damage * GetHeroStr(sd.u, true)
endif
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
call GroupEnumUnitsInRange(all, x, y, Radius(level), bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
set fAngle = Atan2(GetUnitY(f) - y, GetUnitX(f) - x) * bj_RADTODEG
call Knockback_NoPause_Effect(f, KNOCKBACK_DISTANCE, fAngle, KNOCKBACK_DURATION, SPECIAL_EFFECT)
call UnitDamageTarget(sd.u, f, damage, true, false, A_TYPE, D_TYPE, null)
endif
endloop
endif
else
if(life < maxLife * sd.l) then
call IssueImmediateOrder(sd.u, "metamorphosis")
endif
endif
endif
set i = i + 1
endloop
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Infernal_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local boolean isNull = (Ar[Total] == null)
local integer i = 0
call SetUnitAnimationByIndex(caster, ANIME)
call SetUnitInvulnerable(caster, true)
call GroupAddUnit(InfernalCaster, caster)
call SetUnitTimeScale(caster, 2.0)
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set sd.c = true
set i = Total
endif
set i = i + 1
endloop
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local unit learner = GetLearningUnit()
local integer learnerType = GetUnitTypeId(learner)
local player owner = GetOwningPlayer(learner)
local integer ownerNum = GetPlayerId(owner)
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
local Infernal_Data sd
local integer i = 0
if(level <= 1) then
set sd = Infernal_Data.create()
set sd.u = learner
set sd.uID = GetUnitUserData(learner)
set sd.o = owner
set sd.l = Life(level)
set sd.i = 0.0
set sd.im = 1.0
set sd.c = false
if(Total <= 0) then
call TimerStart(Tim, 0.5, true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(learner == sd.u) then
set sd.l = Life(level)
endif
set i = i + 1
endloop
endif
set learner = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
return(GetLearnedSkill() == SPELL_ID)
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(InfernalTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(InfernalTrg, Condition(function Conditions))
call TriggerAddAction(InfernalTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(InfernalLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(InfernalLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(InfernalLearnTrg, function Learn_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
endfunction
endscope
//TESH.scrollpos=44
//TESH.alwaysfold=0
globals
group OverkillCaster = CreateGroup()
endglobals
scope Fatal initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A083' //Spell Overkill rawcode
private constant integer DUMMY_ID = 'n01L' //Dummy Overkill rawcode
private constant integer CAST_ID = 'A084' //Cast Overkill (Stun) rawcode
private constant real ANIMATION_SCALE1 = 1.0 //Animation scale before delay
private constant real ANIMATION_SCALE2 = 0.1 //Animation scale while delay
private constant real ANIMATION_SCALE3 = 2.0 //Animation scale while delay
private constant real ANIMATION_TIME1 = 0.2 //Animation time before delay
private constant real ANIMATION_TIME2 = 0.5 //Animation time while delay
private constant real ANIMATION_TIME3 = 0.2 //Animation time after delay
private constant string DAMAGE_EFFECT = "Objects\\Spawnmodels\\Other\\NeutralBuildingExplosion\\NeutralBuildingExplosion.mdl" //Shockwave
private constant integer SMALL_RADIUS_TOTAL_EFFECT = 6 //Small radius number of effects
private constant real SMALL_DISTANCE_OFFSET_EFFECT = 400.0 //Small radius offset from middle
private constant integer LARGE_RADIUS_TOTAL_EFFECT = 12 //Larg radius number of effects
private constant real LARGE_DISTANCE_OFFSET_EFFECT = 800.0 //Larg radius offset from middle
private constant integer ITEM1_UPGRADE = 'I01T' //Item Sneaker of Exzel
private constant integer ITEM2_UPGRADE = 'I002' //Item Amazon Meld
private constant real UPGRADE1_DISTANCE = 300.0 //Upgrade 1 distance increase
private constant real UPGRADE2_RADIUS = 300.0 //Upgrade 2 radius double damage
private constant attacktype A_TYPE = ATTACK_TYPE_CHAOS //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_DEMOLITION //Spell damage type
private constant string UPGRADE_EFFECT = "Abilities\\Weapons\\PhoenixMissile\\Phoenix_Missile.mdl" //Upgrade effect
endglobals
//Distance move
private function Distance_Move takes integer level returns real
return 80.0 + (0.0 * level)
endfunction
//Distance
private function Distance takes integer level returns real
return 800.0 + (0.0 * level)
endfunction
//Damage
private function Damage takes integer level returns real
if(level == 1) then
return 300.0
elseif(level == 2) then
return 500.0
else
return 0.0
endif
endfunction
//Radius
private function Damage_Radius takes integer level returns real
if(level == 1) then
return 400.0
elseif(level == 2) then
return 600.0
else
return 0.0
endif
endfunction
//Targets affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_FLYING) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Overkill_Data
unit u //Unit attacker
integer l //Level of spell
player o //Owner of attacker
real cos //Cos of angle
real sin //Sin of angle
real dm //Distance move
real x //X of graph
real y //Y of graph
real t //Distance
real i //Interval
integer p //Phase
real tX //Target x
real tY //Target y
real dd //Damage deal
real dr //Damage radius
integer it1 //Item 1 upgrade
integer it2 //Item 2 upgrade
effect e //Effect upgrade
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Overkill_Data array Ar[10]
private group all
private boolexpr bexpr
private location loc
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Overkill_Data sd
local integer i = 0
local integer j = 0
local integer k = 0
local real x = 0.0
local real y = 0.0
local real tX = 0.0
local real tY = 0.0
local real rad = 0.0
local unit f = null
local unit dummy = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if((IsUnitDead(sd.u))) then
set sd.x = sd.t
endif
if(sd.p == 0) then
if(sd.x < sd.t) then
set sd.x = sd.x + sd.dm
set sd.y = (-1 / ((3 * sd.t) / 4)) * sd.x * (sd.x - sd.t)
set x = GetUnitX(sd.u) + sd.dm * sd.cos
set y = GetUnitY(sd.u) + sd.dm * sd.sin
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0)) and (not IsBarrel(sd.u, x, y, 100.0))) then
call SetUnitX(sd.u, x)
call SetUnitY(sd.u, y)
else
set sd.x = sd.t
endif
call SetUnitFlyHeight(sd.u, sd.y, 0.0)
elseif(sd.i > 0) then
set sd.i = sd.i - Interval()
else
set sd.p = 1
set sd.i = ANIMATION_TIME2
call SetUnitTimeScale(sd.u, ANIMATION_SCALE2)
endif
elseif(sd.p == 1) then
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.p = 2
set sd.i = ANIMATION_TIME3
call SetUnitTimeScale(sd.u, ANIMATION_SCALE3)
endif
elseif(sd.p == 2) then
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.p = 3
endif
elseif(sd.p == 3) then
set sd.p = 4
set sd.i = 1.0
call PauseUnit(sd.u, false)
call SetUnitTimeScale(sd.u, 1.0)
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
set sd.tX = x
set sd.tY = y
//call TerrainDeformRipple(x, y, sd.dr, 64, 1000, 1, 2.0 * sd.dr / 512, 2.0 * 1 / 1, sd.dr / sd.dr, false)
call HitTree(x, y, sd.dr, 5.0, 1.0)
call GroupEnumUnitsInRange(all, x, y, sd.dr, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
call TargetCast(sd.o, x, y, 0.5, CAST_ID, sd.l, "thunderbolt", 0, f)
endif
endloop
if(sd.it2 > 0) then
call GroupEnumUnitsInRange(all, x, y, UPGRADE2_RADIUS, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
//call TargetCast(sd.o, x, y, 0.5, CAST_ID, sd.l, "thunderbolt", 0, f)
endif
endloop
endif
call DestroyEffect(AddSpecialEffect(DAMAGE_EFFECT, x, y))
set dummy = CreateUnit(sd.o, DUMMY_ID, x, y, bj_UNIT_FACING)
call UnitApplyTimedLife(dummy, 'BTLF', 0.5)
set dummy = null
call GroupRemoveUnit(OverkillCaster, sd.u)
call Pather(sd.u, 1.0)
if(sd.e != null) then
call DestroyEffect(sd.e)
set sd.e = null
endif
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set dummy = null
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Overkill_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local real rad = 0.0
local player owner = GetOwningPlayer(caster)
local real targetX
local real targetY
local real dx
local real dy
local real distance
local integer i = 0
local boolean exist = false
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_DA_Overkill
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
set rad = Atan2(targetY - casterY, targetX - casterX)
set dx = casterX - targetX
set dy = casterY - targetY
set distance = SquareRoot(dx * dx + dy * dy)
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster and sd.x < sd.t) then
set exist = true
set sd.l = level
set sd.cos = Cos(rad)
set sd.sin = Sin(rad)
set sd.dm = Distance_Move(level)
set sd.x = 0
set sd.y = 0
set sd.t = Distance(level)
set sd.i = ANIMATION_TIME1
set sd.p = 0
set sd.tX = 0.0
set sd.tY = 0.0
set sd.dd = sd.dd + Damage(level)// + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.dr = Damage_Radius(level)
set sd.it1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
set sd.it2 = IsUnitHasItemType(caster, ITEM2_UPGRADE)
if(sd.it1 > 0) then
set sd.t = sd.t + UPGRADE1_DISTANCE
if(distance <= sd.t) then
set sd.t = distance
endif
endif
if(sd.e == null) then
if(sd.it1 > 0 or sd.it2 > 0) then
set sd.e = AddSpecialEffectTarget(UPGRADE_EFFECT, sd.u, "weapon")
endif
endif
call PauseUnit(caster, true)
call SetUnitTimeScale(caster, ANIMATION_SCALE1)
call SetUnitAnimation(caster, "slam")
call UnitAddAbility(caster, 'Arav')
call UnitRemoveAbility(caster, 'Arav')
call SetUnitPathing(caster, false)
call SetUnitFlyHeight(caster, 0.0, 0.0)
set i = Total
endif
set i = i + 1
endloop
if(not exist) then
set sd = Overkill_Data.create()
set sd.u = caster
set sd.l = level
set sd.o = owner
set sd.cos = Cos(rad)
set sd.sin = Sin(rad)
set sd.dm = Distance_Move(level)
set sd.x = 0
set sd.y = 0
set sd.t = Distance(level)
set sd.i = ANIMATION_TIME1
set sd.p = 0
set sd.tX = 0.0
set sd.tY = 0.0
set sd.dd = Damage(level) + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.dr = Damage_Radius(level)
set sd.it1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
set sd.it2 = IsUnitHasItemType(caster, ITEM2_UPGRADE)
set sd.e = null
if(sd.it1 > 0) then
set sd.t = sd.t + UPGRADE1_DISTANCE
if(distance <= sd.t) then
set sd.t = distance
endif
endif
if(sd.it1 > 0 or sd.it2 > 0) then
set sd.e = AddSpecialEffectTarget(UPGRADE_EFFECT, sd.u, "weapon")
endif
call PauseUnit(caster, true)
call SetUnitTimeScale(caster, ANIMATION_SCALE1)
call SetUnitAnimation(caster, "slam")
call UnitAddAbility(caster, 'Arav')
call UnitRemoveAbility(caster, 'Arav')
call SetUnitPathing(caster, false)
call SetUnitFlyHeight(caster, 0.0, 0.0)
call GroupAddUnit(OverkillCaster, caster)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
set caster = null
set owner = null
set s = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(OverkillTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(OverkillTrg, Condition(function Conditions))
call TriggerAddAction(OverkillTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
set loc = Location(0.0, 0.0)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call Preload(DAMAGE_EFFECT)
call Preload(UPGRADE_EFFECT)
endfunction
endscope
//TESH.scrollpos=45
//TESH.alwaysfold=0
scope SkyVolley initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A086' //Spell Sky Volley rawcode
private constant integer CAST_ID = 'A096' //Cast Sky Volley (Stun) rawcode
private constant integer DUMMY_ID = 'n01M' //Dummy SkyVolley Volley rawcode
private constant real FLY_HEIGHT = 1500.0 //Dummy height
private constant integer NUMBER_OF_ARROW = 3 //Number of arrow
private constant real HEIGHT_MOVE = 150.0 //Height move
private constant real DAMAGE_TO_TREES = 5.0 //Damage to trees
private constant integer ITEM1_UPGRADE = 'I000' //Item Sharpend Javelin
private constant real UPGRADE1_RADIUS = 50.0 //Upgrade 1 effect
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_NORMAL //Spell attack type
endglobals
//Radius of target
private function Radius takes integer level returns real
return 250.0
endfunction
//Interval per arrow
private function Interval_Arrow takes integer level returns real
if(level == 1) then
return 0.8
elseif(level == 2) then
return 0.8
elseif(level == 3) then
return 0.8
elseif(level == 4) then
return 0.8
else
return 0.0
endif
endfunction
//Change angle
private function Angle_Move takes integer level returns real
if(level == 1) then
return 10.0
elseif(level == 2) then
return 10.0
elseif(level == 3) then
return 10.0
elseif(level == 4) then
return 10.0
else
return 0.0
endif
endfunction
//Damage deal
private function Damage takes integer level returns real
if(level == 1) then
return 12.0
elseif(level == 2) then
return 20.0
elseif(level == 3) then
return 30.0
elseif(level == 4) then
return 42.0
else
return 0.0
endif
endfunction
//Damage radius
private function Damage_Radius takes integer level returns real
return 100.0 + (0.0 * level)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct SkyVolley_Data
unit u //Unit caster
integer uId //Caster id
integer l //Level of spell
player o //Owner of caster
integer a //Arrow
real ct //Casting time
boolean c //Cast
real x //Target x
real y //Target y
real am //Angle move
real rd //Radius of target
integer numA //Number of arrow
real angle //Angle of target
endstruct
//----------------------------------------------------------------
struct SkyVolley_Arrow_Data
unit u //Unit caster
unit dummy //Unit dummy
player o //Owner of caster
integer l //Level of spell
real h //Height
real hm //Height move
real x //Target x
real y //Target y
real dd //Damage
real rd //Damage radius
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private SkyVolley_Data array Ar[10]
private timer Tim2
private integer Total2
private SkyVolley_Arrow_Data array Arrow_Ar[100]
private group all
private boolexpr bexpr
private location loc
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Arrow_Actions_Execute takes nothing returns nothing
local SkyVolley_Arrow_Data sd
local integer i = 0
local unit f = null
loop
exitwhen(i >= Total2)
set sd = Arrow_Ar[i]
if(sd.h > 0) then
set sd.h = sd.h - sd.hm
call SetUnitFlyHeight(sd.dummy, sd.h, 0.0)
else
call KillUnit(sd.dummy)
call GroupEnumUnitsInRange(all, sd.x, sd.y, sd.rd, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
call TargetCast(sd.o, sd.x, sd.y, 0.5, CAST_ID, sd.l, "thunderbolt", 0, f)
endif
endloop
call HitTree(sd.x, sd.y, sd.rd, DAMAGE_TO_TREES, 0.0)
set sd.u = null
set sd.o = null
set Arrow_Ar[i] = Arrow_Ar[Total2 - 1]
set Total2 = Total2 - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total2 == 0 then
call PauseTimer(Tim2)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Launch_Arrow takes unit caster, integer casterId, player owner, integer level, real targetX, real targetY returns nothing
local SkyVolley_Arrow_Data sd = SkyVolley_Arrow_Data.create()
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.dummy = CreateUnit(sd.o, DUMMY_ID, targetX, targetY, bj_UNIT_FACING)
call UnitAddAbility(sd.dummy, 'Arav')
call UnitRemoveAbility(sd.dummy, 'Arav')
call SetUnitX(sd.dummy, targetX)
call SetUnitY(sd.dummy, targetY)
call SetUnitFlyHeight(sd.dummy, FLY_HEIGHT, 0.0)
set sd.h = FLY_HEIGHT
set sd.hm = HEIGHT_MOVE
set sd.x = targetX
set sd.y = targetY
set sd.dd = Damage(level)// + (Damage(level) * LoadInteger(MagicDamage_Ht, casterId, 0) * 0.01)
set sd.rd = Damage_Radius(level)
if(item1 > 0) then
set sd.rd = sd.rd + UPGRADE1_RADIUS
endif
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Arrow_Actions_Execute)
endif
set Total2 = Total2 + 1
set Arrow_Ar[Total2 - 1] = sd
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local SkyVolley_Data sd
local integer i = 0
local integer j = 0
local real tX = 0.0
local real tY = 0.0
local real rad = 0.0
local integer randomInt = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.c) then
if(sd.ct > 0) then
set sd.ct = sd.ct - Interval()
else
set sd.ct = Interval_Arrow(sd.l)
set sd.a = sd.a - 1
set sd.numA = sd.numA + R2I(360/ sd.am)
endif
elseif(sd.numA <= 0) then
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
if(sd.a == 0 and (not (GetUnitState(sd.u, UNIT_STATE_LIFE) <= 0))) then
set sd.c = false
endif
if(sd.numA > 0) then
set rad = bj_DEGTORAD * (sd.angle)
set randomInt = GetRandomInt(0, R2I(sd.rd))
set tX = sd.x + randomInt * Cos(rad)
set tY = sd.y + randomInt * Sin(rad)
set sd.angle = sd.angle + sd.am
if(tX > WorldBounds.minX + 300.0 and /*
*/tX < WorldBounds.maxX - 300.0 and /*
*/tY > WorldBounds.minY + 300.0 and /*
*/tY < WorldBounds.maxY - 300.0 and (not IsWall(tX, tY, 100.0))) then
call Launch_Arrow(sd.u, sd.uId, sd.o, sd.l, tX, tY)
endif
set sd.numA = sd.numA - 1
endif
set i = i + 1
endloop
if(Total == 0) then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local SkyVolley_Data sd = SkyVolley_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real targetX = 0.0
local real targetY = 0.0
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
set sd.u = caster
set sd.uId = GetUnitUserData(caster)
set sd.l = level
set sd.o = owner
set sd.a = NUMBER_OF_ARROW
set sd.ct = Interval_Arrow(level)
set sd.c = true
set sd.x = targetX
set sd.y = targetY
set sd.am = Angle_Move(level)
set sd.rd = Radius(level)
set sd.numA = 0
set sd.angle = GetUnitFacing(caster)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Stop_Actions takes nothing returns nothing
local SkyVolley_Data sd
local integer i = 0
local unit caster = GetTriggerUnit()
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set sd.c = false
endif
set i = i + 1
endloop
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(SkyVolleyTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(SkyVolleyTrg, Condition(function Conditions))
call TriggerAddAction(SkyVolleyTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(SkyVolleyStopTrg, EVENT_PLAYER_UNIT_SPELL_ENDCAST)
call TriggerAddCondition(SkyVolleyStopTrg, Condition(function Conditions))
call TriggerAddAction(SkyVolleyStopTrg, function Stop_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set Tim2 = CreateTimer()
set Total2 = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
set loc = Location(0, 0)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
endfunction
endscope
//TESH.scrollpos=19
//TESH.alwaysfold=0
scope Stride initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A087' //Spell Seven Stride rawcode
private constant real DURATION = 0.05 //Move duration
private constant real DURATION_INCREASE = 0.1 //Duration increase
private constant real ANGLE_OFFSET = 30.0 //Angle offset
private constant integer ANIME = 8 //Move animation
private constant integer ITEM1_UPGRADE = 'I00K' //Item Expidition Footgear
private constant integer UPGRADE1_STRIDE = 2 //Upgrade 1 effect
private constant string SPELL_EFFECT = "Abilities\\Spells\\Other\\Tornado\\Tornado_Target.mdl" //Caster effect
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Human\\FlakCannons\\FlakTarget.mdl" //Spell effect
endglobals
//Stride
private function Stride takes integer level returns integer
return 3 + (3 * level)
endfunction
//Distance travel
private function Distance takes integer level returns real
return 100.0 + (0.0 * level)
endfunction
//Distance travel increase
private function Distance_Increase takes integer level returns real
return 50.0 + (00.0 * level)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
//----------------------------------------------------------------
struct Stride_Data
unit u //Unit caster
integer l //Level of spell
integer s //Strides
integer sm //Strides decrease
real a //Angle
integer f //Facing left or right
real cos //Cos of target
real sin //Sin of target
real q //Time taken
real ds //Distance
real d //Duration
real dm //Duration max
real d1 //Distance travel
real d2 //Distance move per interval
effect e //Effect
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Stride_Data array Ar[10]
private location loc
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Stride_Data sd
local integer i = 0
local real x = 0.0
local real y = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.s > 0) then
if(sd.d1 > 0) then
set x = GetUnitX(sd.u) + sd.d1 * sd.cos
set y = GetUnitY(sd.u) + sd.d1 * sd.sin
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0)) and (not IsBarrel(sd.u, x, y, 100.0))) then
call SetUnitX(sd.u, x)
call SetUnitY(sd.u, y)
else
set sd.d1 = 0
endif
set sd.d1 = sd.d1 - sd.d2
else
set sd.s = sd.s - sd.sm
set sd.f = sd.f * -1
set sd.cos = Cos((sd.a + ANGLE_OFFSET * sd.f) * bj_DEGTORAD)
set sd.sin = Sin((sd.a + ANGLE_OFFSET * sd.f) * bj_DEGTORAD)
set sd.d = sd.d + DURATION_INCREASE
set sd.ds = sd.ds + Distance_Increase(sd.l)
set sd.q = R2I(sd.d / Interval())
set sd.d1 = 2 * sd.ds / (sd.q + 1)
set sd.d2 = sd.d1 / sd.q
call SetUnitAnimationByIndex(sd.u, ANIME)
call DestroyEffect(AddSpecialEffect(SPECIAL_EFFECT, GetUnitX(sd.u), GetUnitY(sd.u)))
endif
else
call SetUnitPathing(sd.u, true)
call SetUnitAnimation(sd.u, "stand")
//call IssueImmediateOrder(sd.u, "stop")
call PauseUnit(sd.u, true)
call PauseUnit(sd.u, false)
call Pather(sd.u, 1.0)
if(sd.e != null) then
call DestroyEffect(sd.e)
set sd.e = null
endif
set sd.u = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Stride_Data sd = Stride_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real targetX = 0.0
local real targetY = 0.0
local real rad = 0.0
local real face = 0.0
local integer q = R2I(DURATION / Interval())
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
call UnitAddAbility(caster, 'Arav')
call UnitRemoveAbility(caster, 'Arav')
call SetUnitPathing(caster, false)
call SetUnitAnimationByIndex(caster, ANIME)
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
set rad = Atan2(targetY - casterY, targetX - casterX)
set face = rad * bj_RADTODEG
set rad = (face + ANGLE_OFFSET * 1) * bj_DEGTORAD
set sd.u = caster
set sd.l = level
set sd.s = Stride(level)
set sd.sm = 1
set sd.a = face
set sd.f = 1
set sd.cos = Cos(rad)
set sd.sin = Sin(rad)
set sd.q = q
set sd.ds = Distance(level)
set sd.d = DURATION
set sd.d1 = 2 * Distance(level) / (q + 1)
set sd.d2 = sd.d1 / q
set sd.e = AddSpecialEffectTarget(SPELL_EFFECT, caster, "chest")
call DestroyEffect(AddSpecialEffect(SPECIAL_EFFECT, casterX, casterY))
if(item1 > 0) then
set sd.s = sd.s + UPGRADE1_STRIDE
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
endfunction
//----------------------------------------------------------------
private function Stop_Actions takes nothing returns nothing
local Stride_Data sd
local integer i = 0
local unit caster = GetTriggerUnit()
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set sd.sm = sd.s
endif
set i = i + 1
endloop
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(StrideTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(StrideTrg, Condition(function Conditions))
call TriggerAddAction(StrideTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(StrideStopTrg, EVENT_PLAYER_UNIT_SPELL_ENDCAST)
call TriggerAddCondition(StrideStopTrg, Condition(function Conditions))
call TriggerAddAction(StrideStopTrg, function Stop_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set loc = Location(0, 0)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
endfunction
endscope
//TESH.scrollpos=18
//TESH.alwaysfold=0
scope Marksmanship initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A08A' //Spell Marksmanship rawcode
private constant integer UPGRADE_ID = 'Rhri' //Upgrade Markmanship rawcode
private constant integer CAST_ID = 'Afae' //Cast Marksmanship (Dummy) rawcode
private constant integer BUFF_ID = 'Bfae' //Buff Marksmanship (Dummy) rawcode
private constant integer UNIT_ID = 'Hvwd' //Unit Lone Ranger rawcode
private constant integer ITEM1_UPGRADE = 'afac' //Item Scoutbow
endglobals
//Distance attack
private function Distance takes integer level returns real
if(level == 0) then
return 700.0
elseif(level == 1) then
return 1100.0
elseif(level == 2) then
return 1300.0
elseif(level == 3) then
return 1500.0
else
return 0.0
endif
endfunction
//Acquire range attack
private function Acquire_Range takes integer level returns real
if(level == 0) then
return 650.0
elseif(level == 1) then
return 1050.0
elseif(level == 2) then
return 1250.0
elseif(level == 3) then
return 1350.0
else
return 0.0
endif
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit attacker = GetAttacker()
local real attackerX = GetUnitX(attacker)
local real attackerY = GetUnitY(attacker)
local integer level = GetUnitAbilityLevel(attacker, SPELL_ID)
local player owner = GetOwningPlayer(attacker)
local unit attacked = GetTriggerUnit()
local integer item1 = IsUnitHasItemType(attacker, ITEM1_UPGRADE)
if(GetUnitAbilityLevel(attacked, BUFF_ID) <= 0) then
if(item1 > 0) then
call TargetCast(owner, attackerX, attackerY, 1.0, CAST_ID, level + 3, "faeriefire", 0, attacked)
else
call TargetCast(owner, attackerX, attackerY, 1.0, CAST_ID, level, "faeriefire", 0, attacked)
endif
endif
set attacker = null
set owner = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit attacker = GetAttacker()
local real attackerX = 0.0
local real attackerY = 0.0
local integer attackerType = GetUnitTypeId(attacker)
local integer level = GetUnitAbilityLevel(attacker, SPELL_ID)
local boolean okey = level > 0
local player owner = null
local integer upgradeLevel = 0
local unit attacked = GetTriggerUnit()
local real attackedX = 0.0
local real attackedY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
if(attackerType == UNIT_ID) then
set owner = GetOwningPlayer(attacker)
set upgradeLevel = GetPlayerTechCount(owner, UPGRADE_ID, true)
if(upgradeLevel > 0) then
call SetUnitAcquireRange(attacker, Acquire_Range(level))
set attackerX = GetUnitX(attacker)
set attackerY = GetUnitY(attacker)
set attackedX = GetUnitX(attacked)
set attackedY = GetUnitY(attacked)
set dx = attackerX - attackedX
set dy = attackerY - attackedY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance > Distance(level)) then
call IssuePointOrder(attacker, "move", attackedX, attackedY)
endif
endif
endif
set attacker = null
set owner = null
set attacked = null
return okey
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local unit learner = GetLearningUnit()
local player owner = GetOwningPlayer(learner)
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
call SetPlayerTechResearched(owner, UPGRADE_ID, level)
call SetUnitAcquireRange(learner, Acquire_Range(level))
set learner = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
return (GetLearnedSkill() == SPELL_ID)
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(MarksmanshipTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(MarksmanshipTrg, Condition(function Conditions))
call TriggerAddAction(MarksmanshipTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(MarksmanshipLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(MarksmanshipLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(MarksmanshipLearnTrg, function Learn_Actions)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
endfunction
endscope
//TESH.scrollpos=21
//TESH.alwaysfold=0
globals
group Eagles = CreateGroup()
group Mates = CreateGroup()
hashtable EaglesHt = InitHashtable()
constant integer EAGLE_LEVEL_KEY = 0 //Eagle level spell key
constant integer EAGLE_ORI_UNIT_KEY = 1 //Owner of eagle id
constant integer EAGLE_UNIT_KEY = 2 //Eagle unit key
constant integer EAGLE_ORDER_KEY = 3 //Ordered eagle key
constant integer EAGLE_TARGET_X_KEY = 4 //Target x
constant integer EAGLE_TARGET_Y_KEY = 5 //Target y
constant integer EAGLE_TARGET_UNIT_KEY = 6 //Target unit
constant integer EAGLE_DEATH_UNIT_KEY = 7 //Target unit
endglobals
scope Wingmate initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'AUcs' //Spell Wingmate rawcode
private constant integer CAST_ID = 'ACsw' //Cast Wingmate (Slow) rawcode
private constant integer EAGLE_ID = 'n01N' //Unit Wingmate rawcode
private constant integer DUMMY_ID = 'n021' //Dummy detector
private constant integer GUARD_SPELL_ID = 'A089' //Spell Guard (Dummy) rawcode
private constant real ANGLE_MOVE = 10.0 //Angle move per interval
private constant real DISTANCE_MOVE = 10.0 //Distance move
private constant real MAX_DISTANCE_MOVE = 50.0 //Max distance move
private constant real RANGE_ANGLE = 20.0 //Range angle
private constant real RADIUS_NEAR = 100.0 //Radius near target
private constant real SPIN_DURATION = 1.0 //Spin duration
private constant real DETECTING = 10.0 //Detecting time
private constant real RESET_TIMER_SCOUT = 5.0 //Reset timer
private constant real RESET_TIMER_DEFEND = 3.0 //Reset timer
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_NORMAL //Spell attack type
private constant real KNOCKBACK_DISTANCE = 200.0 //Distance knock
private constant real KNOCKBACK_DURATION = 0.5 //Duration knock
private constant integer ITEM1_UPGRADE = 'I01L' //Item Windsage
private constant real UPGRADE1_DAMAGE = 100.0 //Upgrade 1 effect
private constant string SUMMON_EFFECT = "Abilities\\Spells\\NightElf\\FaerieDragonInvis\\FaerieDragon_Invis.mdl" //Summon hawk effect
private constant string SPELL_EFFECT = "Abilities\\Spells\\Other\\Tornado\\Tornado_Target.mdl" //Spell effect
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Human\\FlakCannons\\FlakTarget.mdl" //Spell effect
endglobals
//Distance guard
private function Distance_Guard takes integer level returns real
return 200.0 + (0.0 * level)
endfunction
//Distance scout
private function Distance_Scout takes integer level returns real
return 1000.0 + (500.0 * level)
endfunction
//Damage
private function Damage takes integer level returns real
if(level == 1) then
return 40.0
elseif(level == 2) then
return 80.0
elseif(level == 3) then
return 120.0
else
return 0.0
endif
endfunction
//Guard radius
private function Guard_Radius takes integer level returns real
return 300.0 + (0.0 * level)
endfunction
//Damage radius
private function Damage_Radius takes integer level returns real
return 150.0 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Wingmate_Guard_Data
unit u //Unit caster
player o //Owner of caster
integer l //Integer level
integer uId //Caster id
integer io //Issue order
unit h //Hero
group g //Group target
integer p //Phase
real d //Distance near
real s //Spin time
real sm //Spin time max
real x //Target x
real y //Target y
real dm //Distance move
real da //Distance accelerate
real md //Max distance move
real t //Timer
real dd //Damage
real rd //Radius damage
effect e1 //Effect left wing
effect e2 //Effect right wing
endstruct
//----------------------------------------------------------------
globals
private group copy
private group all
private group all2
private boolexpr bexpr
private timer Tim
private integer Total
private Wingmate_Guard_Data array Ar[10]
private trigger WingmateFollowTrg
private location loc
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local unit learner = GetTriggerUnit()
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
local integer learnerId = 0
local real learnerX = 0.0
local real learnerY = 0.0
local real angle = 0.0
local player owner = null
local real rad = 0.0
local unit eagle = null
local integer eagleId = 0
local unit f = null
if(level == 1) then
set learnerId = GetUnitUserData(learner)
set learnerX = GetUnitX(learner)
set learnerY = GetUnitY(learner)
set angle = GetUnitFacing(learner)
set owner = GetOwningPlayer(learner)
set rad = (angle + 90) * bj_DEGTORAD
if(not IsUnitInGroup(learner, Mates)) then
set eagle = CreateUnit(owner, EAGLE_ID, learnerX + 50.0 * Cos(rad), learnerY + 50.0 * Sin(rad), angle)
set eagleId = GetUnitUserData(eagle)
call GroupAddUnit(Mates, learner)
call AddSpecialEffectTarget(SUMMON_EFFECT, eagle, "origin")
call GroupAddUnit(Eagles, eagle)
call SaveUnitHandle(EaglesHt, eagleId, EAGLE_ORI_UNIT_KEY, learner)
call SaveUnitHandle(EaglesHt, learnerId, EAGLE_UNIT_KEY, eagle)
call SaveInteger(EaglesHt, eagleId, EAGLE_ORDER_KEY, 0)
call SaveReal(EaglesHt, eagleId, EAGLE_TARGET_X_KEY, 0.0)
call SaveReal(EaglesHt, eagleId, EAGLE_TARGET_Y_KEY, 0.0)
call SaveBoolean(EaglesHt, eagleId, EAGLE_DEATH_UNIT_KEY, false)
if(not IsTriggerEnabled(WingmateFollowTrg)) then
call EnableTrigger(WingmateFollowTrg)
endif
else
set eagle = LoadUnitHandle(EaglesHt, learnerId, EAGLE_UNIT_KEY)
call ShowUnit(eagle, true)
call PauseUnit(eagle, false)
endif
else
set learnerId = GetUnitUserData(learner)
set eagle = LoadUnitHandle(EaglesHt, learnerId, EAGLE_UNIT_KEY)
set eagleId = GetUnitUserData(eagle)
endif
call SaveInteger(EaglesHt, eagleId, EAGLE_LEVEL_KEY, level)
set learner = null
set eagle = null
set owner = null
set f = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
local unit learner = GetTriggerUnit()
local boolean okey = GetLearnedSkill() == SPELL_ID and (not IsUnitIllusion(learner))
set learner = null
return okey
endfunction
//----------------------------------------------------------------
private function Follow_Actions takes nothing returns nothing
local unit ranger = null
local real rangerX = 0.0
local real rangerY = 0.0
local player owner = null
local unit f = null
local real fX = 0.0
local real fY = 0.0
local integer fId = 0
local real rad = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local unit g = null
local boolean attack = false
local integer level = 0
local integer order = 0
local boolean dead = false
local real tX = 0.0
local real tY = 0.0
set copy = CopyGroup(Eagles)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not IsUnitPaused(f)) then
set fId = GetUnitUserData(f)
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set ranger = LoadUnitHandle(EaglesHt, fId, EAGLE_ORI_UNIT_KEY)
if(GetUnitAbilityLevel(ranger, SPELL_ID) > 0) then
set rangerX = GetUnitX(ranger)
set rangerY = GetUnitY(ranger)
set owner = GetOwningPlayer(ranger)
set dx = fX - rangerX
set dy = fY - rangerY
set distance = SquareRoot(dx * dx + dy * dy)
set rad = (GetUnitFacing(ranger) + 90) * bj_DEGTORAD
set level = LoadInteger(EaglesHt, fId, EAGLE_LEVEL_KEY)
set order = LoadInteger(EaglesHt, fId, EAGLE_ORDER_KEY)
set dead = LoadBoolean(EaglesHt, fId, EAGLE_DEATH_UNIT_KEY)
set tX = rangerX + 50.0 * Cos(rad)
set tY = rangerY + 50.0 * Sin(rad)
if(not IsUnitDead(ranger)) then
if(dead) then
set order = -1
call SaveBoolean(EaglesHt, fId, EAGLE_DEATH_UNIT_KEY, false)
endif
if(order == 0) then
if(distance > 300.0) then
call IssuePointOrder(f, "move", tX, tY)
call SetUnitMoveSpeed(f, 999.0)
else
call SetUnitMoveSpeed(f, GetUnitMoveSpeed(ranger))
call GroupEnumUnitsInRange(all, rangerX, rangerY, Distance_Guard(level), bexpr)
set attack = false
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
if(IsUnitEnemy(g, owner) and (not attack) and (not IsUnitType(g, UNIT_TYPE_SLEEPING))) then
set attack = true
call SaveInteger(EaglesHt, fId, EAGLE_ORDER_KEY, 2)
call SaveUnitHandle(EaglesHt, fId, EAGLE_TARGET_UNIT_KEY, ranger)//g)
call SetUnitAbilityLevel(f, GUARD_SPELL_ID, level)
endif
endloop
endif
elseif(order == 1) then
set tX = LoadReal(EaglesHt, fId, EAGLE_TARGET_X_KEY)
set tY = LoadReal(EaglesHt, fId, EAGLE_TARGET_Y_KEY)
call IssuePointOrder(f, "carrionswarm", tX, tY)
elseif(order == 2) then
call IssueTargetOrder(f, "carrionswarm", LoadUnitHandle(EaglesHt, fId, EAGLE_TARGET_UNIT_KEY))
endif
else
call SaveBoolean(EaglesHt, fId, EAGLE_DEATH_UNIT_KEY, true)
endif
else
call ShowUnit(f, false)
call PauseUnit(f, true)
endif
endif
endloop
set ranger = null
set owner = null
set f = null
set g = null
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Wingmate_Guard_Data ed
local integer i = 0
local real cX = 0.0
local real cY = 0.0
local real tX = 0.0
local real tY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local real x = 0.0
local real y = 0.0
local real face = 0.0
local real rad = 0.0
local real angle = 0.0
local real nAngle = 0.0
local unit f = null
local real fAngle = 0.0
local real fly = 0.0
local real dFly = 0.0
loop
exitwhen(i >= Total)
set ed = Ar[i]
set x = GetUnitX(ed.u)
set y = GetUnitY(ed.u)
if(ed.p == 0 or ed.p == 2 or ed.p == 4) then
call GroupEnumUnitsInRange(all2, x, y, ed.rd * 2, bexpr)
loop
set f = FirstOfGroup(all2)
exitwhen(f == null)
call GroupRemoveUnit(all2, f)
if(IsUnitEnemy(f, ed.o) and (not IsUnitInGroup(f, ed.g))) then
call GroupAddUnit(ed.g, f)
//set fAngle = Atan2(GetUnitY(f) - y, GetUnitX(f) - x) * bj_RADTODEG
//call Knockback_NoPause_Effect(f, KNOCKBACK_DISTANCE * 2, fAngle, KNOCKBACK_DURATION * 2, SPECIAL_EFFECT)
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(ed.u, f, ed.dd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(ed.u, f, ed.dd, true, false, A_TYPE, D_TYPE, null)
endif
call TargetCast(ed.o, x, y, 0.5, CAST_ID, ed.l, "slow", 0, f)
endif
endloop
else
call GroupEnumUnitsInRange(all2, x, y, ed.rd, bexpr)
loop
set f = FirstOfGroup(all2)
exitwhen(f == null)
call GroupRemoveUnit(all2, f)
if(IsUnitEnemy(f, ed.o) and (not IsUnitInGroup(f, ed.g))) then
call GroupAddUnit(ed.g, f)
//set fAngle = Atan2(GetUnitY(f) - y, GetUnitX(f) - x) * bj_RADTODEG
//call Knockback_NoPause_Effect(f, KNOCKBACK_DISTANCE, fAngle, KNOCKBACK_DURATION, SPECIAL_EFFECT)
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(ed.u, f, ed.dd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(ed.u, f, ed.dd, true, false, A_TYPE, D_TYPE, null)
endif
call TargetCast(ed.o, x, y, 0.5, CAST_ID, ed.l, "slow", 0, f)
endif
endloop
endif
if(ed.t > 0.0) then
set ed.t = ed.t - Interval()
else
set ed.p = 5
set ed.s = 0.0
set ed.dm = DISTANCE_MOVE
endif
if(ed.p == 0) then
set cX = GetUnitX(ed.u)
set cY = GetUnitY(ed.u)
set tX = GetUnitX(ed.h)
set tY = GetUnitY(ed.h)
set dx = tX - cX
set dy = tY - cY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance > ed.d + 50.0) then
set rad = GetUnitFacing(ed.u) * bj_DEGTORAD
set x = cX + ed.dm * Cos(rad)
set y = cY + ed.dm * Sin(rad)
set rad = Atan2(tY - cY, tX - cX)
call SetUnitFacing(ed.u, rad * bj_RADTODEG)
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
call SetUnitX(ed.u, x)
call SetUnitY(ed.u, y)
endif
if(ed.dm < ed.md) then
set ed.dm = ed.dm + ed.da
endif
else
set ed.p = 1
set ed.s = ed.sm
set ed.dm = DISTANCE_MOVE
endif
elseif(ed.p == 1) then
if(ed.s > 0.0) then
set ed.s = ed.s - Interval()
set cX = GetUnitX(ed.u)
set cY = GetUnitY(ed.u)
set face = GetUnitFacing(ed.u)
set rad = face * bj_DEGTORAD
set x = cX + ed.dm * Cos(rad)
set y = cY + ed.dm * Sin(rad)
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
call SetUnitX(ed.u, x)
call SetUnitY(ed.u, y)
endif
set tX = ed.x
set tY = ed.y
set rad = Atan2(tY - cY, tX - cX)
call SetUnitFacing(ed.u, rad * bj_RADTODEG)
if(face - rad * bj_DEGTORAD <= 30.0) then
set ed.s = 0.0
endif
if(ed.dm < ed.md) then
set ed.dm = ed.dm + ed.da
endif
else
set ed.p = 2
endif
elseif(ed.p == 2) then
set cX = GetUnitX(ed.u)
set cY = GetUnitY(ed.u)
set tX = ed.x
set tY = ed.y
set dx = tX - cX
set dy = tY - cY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance > ed.d + 50.0) then
set rad = GetUnitFacing(ed.u) * bj_DEGTORAD
set x = cX + ed.dm * Cos(rad)
set y = cY + ed.dm * Sin(rad)
set rad = Atan2(tY - cY, tX - cX)
call SetUnitFacing(ed.u, rad * bj_RADTODEG)
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
call SetUnitX(ed.u, x)
call SetUnitY(ed.u, y)
endif
if(ed.dm < ed.md) then
set ed.dm = ed.dm + ed.da
endif
else
set ed.p = 3
set ed.s = ed.sm
set ed.dm = DISTANCE_MOVE
endif
elseif(ed.p == 3) then
if(ed.s > 0.0) then
set ed.s = ed.s - Interval()
set cX = GetUnitX(ed.u)
set cY = GetUnitY(ed.u)
set face = GetUnitFacing(ed.u)
set rad = face * bj_DEGTORAD
set x = cX + ed.dm * Cos(rad)
set y = cY + ed.dm * Sin(rad)
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
call SetUnitX(ed.u, x)
call SetUnitY(ed.u, y)
endif
set tX = ed.x
set tY = ed.y
set rad = Atan2(tY - cY, tX - cX)
call SetUnitFacing(ed.u, rad * bj_RADTODEG)
if(face - rad * bj_DEGTORAD <= 30.0) then
set ed.s = 0.0
endif
if(ed.dm < ed.md) then
set ed.dm = ed.dm + ed.da
endif
else
set ed.p = 4
set f = CreateUnit(ed.o, DUMMY_ID, ed.x, ed.y, bj_UNIT_FACING)
call UnitApplyTimedLife(f, 'BTLF', DETECTING)
endif
elseif(ed.p == 4) then
set cX = GetUnitX(ed.u)
set cY = GetUnitY(ed.u)
set tX = GetUnitX(ed.h)
set tY = GetUnitY(ed.h)
set dx = tX - cX
set dy = tY - cY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance > ed.d + 50.0) then
set rad = GetUnitFacing(ed.u) * bj_DEGTORAD
set x = cX + ed.dm * Cos(rad)
set y = cY + ed.dm * Sin(rad)
set rad = Atan2(tY - cY, tX - cX)
call SetUnitFacing(ed.u, rad * bj_RADTODEG)
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
call SetUnitX(ed.u, x)
call SetUnitY(ed.u, y)
endif
if(ed.dm < ed.md) then
set ed.dm = ed.dm + ed.da
endif
else
set ed.p = 5
set ed.s = ed.sm
set ed.dm = DISTANCE_MOVE
endif
elseif(ed.p == 5) then
if(ed.s > 0.0) then
set ed.s = ed.s - Interval()
set cX = GetUnitX(ed.u)
set cY = GetUnitY(ed.u)
set face = GetUnitFacing(ed.u)
set rad = face * bj_DEGTORAD
set x = cX + ed.dm * Cos(rad)
set y = cY + ed.dm * Sin(rad)
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
call SetUnitX(ed.u, x)
call SetUnitY(ed.u, y)
endif
set tX = ed.x
set tY = ed.y
set rad = Atan2(tY - cY, tX - cX)
call SetUnitFacing(ed.u, rad * bj_RADTODEG)
if(face - rad * bj_DEGTORAD <= 30.0) then
set ed.s = 0.0
endif
else
loop
set f = FirstOfGroup(ed.g)
exitwhen(f == null)
call GroupRemoveUnit(ed.g, f)
endloop
if(ed.e1 != null) then
call DestroyEffect(ed.e1)
set ed.e1 = null
endif
if(ed.e2 != null) then
call DestroyEffect(ed.e2)
set ed.e2 = null
endif
call IssueImmediateOrder(ed.u, "stop")
call SetUnitTimeScale(ed.u, 1.0)
call PauseUnit(ed.u, false)
set ed.u = null
set ed.o = null
set ed.h = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = ed
set Total = Total - 1
set i = i - 1
endif
endif
set i = i + 1
endloop
if(Total == 0) then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Guard_Actions takes nothing returns nothing
local Wingmate_Guard_Data ed
local unit caster = GetTriggerUnit()
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, GUARD_SPELL_ID)
local player owner = GetOwningPlayer(caster)
local unit hero = GetHero(owner)
local integer heroID = 0
local unit target = GetSpellTargetUnit()
local real targetX = 0.0
local real targetY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local real rad = 0.0
local unit f = null
local boolean isNull = (Ar[Total] == null)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
if(target == null) then //Order = 1 Scout
if(hero != null) then
set heroID = GetUnitUserData(hero)
endif
if(isNull) then
set ed = Wingmate_Guard_Data.create()
set ed.g = CreateGroup()
else
set ed = Ar[Total]
endif
set ed.u = caster
set ed.o = owner
set ed.l = level
set ed.uId = casterID
set ed.h = hero
set ed.io = 0
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
set dx = targetX - casterX
set dy = targetY - casterY
set distance = SquareRoot(dx * dx + dy * dy)
set rad = Atan2(dy, dx)
set ed.p = 0
set ed.d = RADIUS_NEAR
set ed.s = 0.0
set ed.sm = SPIN_DURATION
set ed.x = targetX
set ed.y = targetY
set ed.dm = DISTANCE_MOVE
set ed.da = 2.0
set ed.md = MAX_DISTANCE_MOVE
set ed.t = RESET_TIMER_SCOUT
set ed.dd = Damage(level)
if(item1 > 0) then
set ed.dd = ed.dd + UPGRADE1_DAMAGE
endif
set ed.dd = ed.dd + (ed.dd * LoadInteger(MagicDamage_Ht, heroID, 0) * 0.01)
set ed.rd = Damage_Radius(level)
set ed.e1 = AddSpecialEffectTarget(SPELL_EFFECT, caster, "hand, left")
set ed.e2 = AddSpecialEffectTarget(SPELL_EFFECT, caster, "hand, right")
call SaveInteger(EaglesHt, ed.uId, EAGLE_ORDER_KEY, 0)
call PauseUnit(caster, true)
call SetUnitTimeScale(caster, 0.5)
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = ed
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
else //Order = 2 Defend
if(hero != null) then
call SaveInteger(EaglesHt, casterID, EAGLE_ORDER_KEY, 0)
set targetX = GetUnitX(hero)
set targetY = GetUnitY(hero)
call PauseUnit(caster, true)
call SetUnitAnimation(caster, "attack")
call QueueUnitAnimation(caster, "stand")
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, caster, "hand, left"))
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, caster, "hand, right"))
call GroupEnumUnitsInRange(all, targetX, targetY, Guard_Radius(level), bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, owner)) then
set rad = Atan2(GetUnitY(f) - targetY, GetUnitX(f) - targetX) * bj_RADTODEG
call Knockback(f, KNOCKBACK_DISTANCE, rad, KNOCKBACK_DURATION)
call UnitDamageTarget(hero, f, Damage(level)/2, true, false, A_TYPE, D_TYPE, null)
call TargetCast(owner, targetX, targetY, 0.5, CAST_ID, level, "slow", 0, f)
endif
endloop
call PauseUnit(caster, false)
endif
endif
set caster = null
set owner = null
set target = null
set hero = null
endfunction
//----------------------------------------------------------------
private function Guard_Conditions takes nothing returns boolean
return GetSpellAbilityId() == GUARD_SPELL_ID
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local real targetX = 0.0
local real targetY = 0.0
local real rad = 0.0
local real x = 0.0
local real y = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local unit f = null
local integer fId = 0
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
set dx = casterX - targetX
set dy = casterY - targetY
set distance = SquareRoot(dx * dx + dy * dy)
set rad = Atan2(targetY - casterY, targetX - casterX)
//set x = casterX + Distance_Scout(level) * Cos(rad)
//set y = casterY + Distance_Scout(level) * Sin(rad)
if(distance < Distance_Scout(level)) then
set x = targetX
set y = targetY
else
set x = casterX + Distance_Scout(level) * Cos(rad)
set y = casterY + Distance_Scout(level) * Sin(rad)
endif
set copy = CopyGroup(Eagles)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(owner == GetOwningPlayer(f)) then
set fId = GetUnitUserData(f)
call SaveInteger(EaglesHt, fId, EAGLE_ORDER_KEY, 1)
call SaveReal(EaglesHt, fId, EAGLE_TARGET_X_KEY, x)
call SaveReal(EaglesHt, fId, EAGLE_TARGET_Y_KEY, y)
call IssueImmediateOrder(f, "stop")
call SetUnitAbilityLevel(f, GUARD_SPELL_ID, level)
endif
endloop
set caster = null
set owner = null
set f = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set WingmateFollowTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(WingmateTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(WingmateTrg, Condition(function Conditions))
call TriggerAddAction(WingmateTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(WingmateLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(WingmateLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(WingmateLearnTrg, function Learn_Actions)
call TriggerRegisterTimerEventPeriodic(WingmateFollowTrg, 0.1)
call TriggerAddAction(WingmateFollowTrg, function Follow_Actions)
call DisableTrigger(WingmateFollowTrg)
call TriggerRegisterAnyUnitEventBJ(WingmateGuardTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(WingmateGuardTrg, Condition(function Guard_Conditions))
call TriggerAddAction(WingmateGuardTrg, function Guard_Actions)
//Setting globals
set copy = CreateGroup()
set all = CreateGroup()
set all2 = CreateGroup()
set bexpr = Condition(function Pick)
set Tim = CreateTimer()
set Total = 0
set loc = Location(0, 0)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call AbilityPreload(GUARD_SPELL_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
call Preload(SUMMON_EFFECT)
endfunction
endscope
//TESH.scrollpos=15
//TESH.alwaysfold=0
scope Ultrabolt initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A088' //Spell Ultrabolt rawcode
private constant real DISTANCE_MOVE = 100.0 //Distance move per interval
private constant real DAMAGE_RADIUS = 150.0 //Radius of damage
private constant integer DUMMY_ID = 'n01O' //Dummy arrow rawcode
private constant integer DUMMY1_ID = 'n028' //Dummy arrow (upgrade) rawcode
private constant integer HIT_COUNT = 20 //Hit count for effect
private constant integer ITEM1_UPGRADE = 'ajen' //Item Ralex of Sharpstrike
private constant integer ITEM2_UPGRADE = 'I002' //Item Amazon Meld
private constant real UPGRADE2_DURATION = 10.0 //Increase duration
private constant attacktype A_TYPE = ATTACK_TYPE_CHAOS //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_UNIVERSAL //Spell attack type
private constant string SPELL_EFFECT = "Abilities\\Weapons\\GryphonRiderMissile\\GryphonRiderMissileTarget.mdl" //Hit effect
private constant string UPGRADE_EFFECT = "war3mapImported\\Power_Orb.mdx" //Upgrade effect
endglobals
//Distance
private function Distance takes integer level returns real
return 6000.0 + (0.0 * level)
endfunction
//Damage deal
private function Damage takes integer level returns real
return 0.0 + (100.0 * level)
endfunction
//Hit duration
private function Hit_Duration takes integer level returns real
return 10.0 + (0.0 * level)
endfunction
//Hit damage per distance
private function Hit_Damage takes integer level returns real
return 0.2 + (0.2 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (GetWidgetLife(target) > 0.405) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Ultrabolt_Data
unit u //Unit caster
integer uId //Caster id
unit dummy //Unit dummy
player o //Owner of caster
unit t //Unit target
real x //Target x
real y //Target y
real cos //Cos of angle
real sin //Sin of angle
real d //Distance travel
real a //Angle to target
real cd //Cooldown
boolean h //Hit
real dd //Damage
real rd //Damage radius
real hi //Interval hit
real ha //Angle hit
real hd //Damage
integer dc //Damage count
integer dm //Damage max count
integer it1 //Item 1 upgrade
integer it2 //Item 2 upgrade
endstruct
//----------------------------------------------------------------
globals
private integer Total
private timer Tim
private Ultrabolt_Data array Ar[100]
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Ultrabolt_Data sd
local integer i = 0
local unit f = null
local real x = 0.0
local real y = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.d > 0) then
set sd.d = sd.d - DISTANCE_MOVE
set sd.x = sd.x + DISTANCE_MOVE * sd.cos
set sd.y = sd.y + DISTANCE_MOVE * sd.sin
if(sd.x > WorldBounds.minX + 300.0 and /*
*/sd.x < WorldBounds.maxX - 300.0 and /*
*/sd.y > WorldBounds.minY + 300.0 and /*
*/sd.y < WorldBounds.maxY - 300.0 and (not IsWall(sd.x, sd.y, 100.0))) then
call SetUnitX(sd.dummy, sd.x)
call SetUnitY(sd.dummy, sd.y)
else
set sd.d = 0
endif
call GroupEnumUnitsInRange(all, sd.x, sd.y, sd.rd, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o) and not sd.h) then
if(IsUnitType(f, UNIT_TYPE_HERO)) then
set sd.d = 0
set sd.h = true
set sd.x = GetUnitX(f)
set sd.y = GetUnitY(f)
set sd.ha = GetUnitFacing(f) - GetUnitFacing(sd.dummy)
set sd.t = f
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.t, "origin"))
else
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.t, "origin"))
endif
endif
endloop
elseif(sd.h) then
if(sd.hi > 0.0) then
set sd.hi = sd.hi - Interval()
if(sd.t != null) then
if(not IsUnitDead(sd.t) and (not IsUnitType(sd.t, UNIT_TYPE_MAGIC_IMMUNE))) then
set x = GetUnitX(sd.t)
set y = GetUnitY(sd.t)
call SetUnitX(sd.dummy, x)
call SetUnitY(sd.dummy, y)
call SetUnitFacing(sd.dummy, GetUnitFacing(sd.t) + sd.ha)
if(x != sd.x or y != sd.y) then
set dx = x - sd.x
set dy = y - sd.y
set distance = SquareRoot(dx * dx + dy * dy)
set sd.x = x
set sd.y = y
if(distance > 0) then
if(sd.dc > 0) then
set sd.dc = sd.dc - 1
else
set sd.dc = sd.dm
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.t, "origin"))
endif
call UnitDamageTarget(sd.u, sd.t, sd.hd * distance, true, false, A_TYPE, D_TYPE, null)
endif
endif
else
set sd.hi = 0.0
endif
else
set sd.hi = 0.0
endif
else
set sd.h = false
endif
else
call RemoveUnit(sd.dummy)
set sd.u = null
set sd.dummy = null
set sd.o = null
set sd.t = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Ultrabolt_Data sd = Ultrabolt_Data.create()
local unit caster = GetTriggerUnit()
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local real targetX = GetSpellTargetX()
local real targetY = GetSpellTargetY()
local real rad = Atan2(targetY - casterY, targetX - casterX)
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_LR_Ultrabolt
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
call SetUnitAnimation(caster, "spell")
set sd.u = caster
set sd.uId = GetUnitUserData(caster)
set sd.o = owner
set sd.t = null
set sd.x = casterX
set sd.y = casterY
set sd.cos = Cos(rad)
set sd.sin = Sin(rad)
set sd.d = Distance(level)
set sd.a = bj_RADTODEG * rad
set sd.cd = 0.4
set sd.h = false
set sd.dd = Damage(level)// + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.rd = DAMAGE_RADIUS
set sd.hi = Hit_Duration(level)
set sd.ha = rad * bj_RADTODEG
set sd.hd = Hit_Damage(level)// + (Hit_Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.dc = 0
set sd.dm = HIT_COUNT
set sd.it1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
set sd.it2 = IsUnitHasItemType(caster, ITEM2_UPGRADE)
if(sd.it1 > 0) then
set sd.dd = Damage(level) + GetHeroAgi(caster, true) * 5
endif
if(sd.it2 > 0) then
set sd.hi = sd.hi + UPGRADE2_DURATION
endif
if(sd.it1 > 0 or sd.it2 > 0) then
set sd.dummy = CreateUnit(sd.o, DUMMY1_ID, sd.x, sd.y, sd.a)
else
set sd.dummy = CreateUnit(sd.o, DUMMY_ID, sd.x, sd.y, sd.a)
endif
call SetUnitAnimation(sd.dummy, "stand")
call UnitAddAbility(sd.dummy, 'Arav')
call UnitRemoveAbility(sd.dummy, 'Arav')
call SetUnitX(sd.dummy, sd.x)
call SetUnitY(sd.dummy, sd.y)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
set s = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(UltraboltTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(UltraboltTrg, Condition(function Conditions))
call TriggerAddAction(UltraboltTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
call Preload(UPGRADE_EFFECT)
endfunction
endscope
//TESH.scrollpos=42
//TESH.alwaysfold=0
scope CrippleGraze initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A08T' //Spell Cripple Graze rawcode
private constant integer CAST_ID = 'Apg2' //Ability Cripple Graze (Stacking) rawcode
private constant integer BUFF_ID = 'B02Z' //Buff Cripple Graze (Dummy) rawcode
private constant real DAMAGE_TO_TREES = 10.0 //Damage to trees
private constant real KNOCKBACK_DURATION = 1.0 //Knockback duration
private constant real KNOCKBACK_DISTANCE = 1200.0 //Max knockback distance
private constant string LIGHTNING_ID = "AFOD" //Lightning rawcode
private constant real NIGHT_DAMAGE = 50.0 //Night damage
private constant integer ITEM1_UPGRADE = 'gcel' //Item Gauntlet of Brawler
private constant real UPGRADE1_DAMAGE = 15.0 //Upgrade 1 effect
private constant string SPELL_EFFECT = "Abilities\\Weapons\\VengeanceMissile\\VengeanceMissile.mdl" //Spell effect
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Demon\\DemonBoltImpact\\DemonBoltImpact.mdl" //Special effect
private constant damagetype D_TYPE = DAMAGE_TYPE_NORMAL //Spell attack type
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
endglobals
//Distance move division
private function Distance_Move takes integer level returns real
return 10.0 + (0.0 * level)
endfunction
//Damage deal
private function Damage takes integer level returns real
if(level == 1) then
return 50.0
elseif(level == 2) then
return 65.0
elseif(level == 3) then
return 85.0
elseif(level == 4) then
return 110.0
else
return 0.0
endif
endfunction
//Damage deal while regeneration
private function Damage_Regeneration takes integer level returns real
if(level == 1) then
return 15.0
elseif(level == 2) then
return 15.0
elseif(level == 3) then
return 15.0
elseif(level == 4) then
return 15.0
else
return 0.0
endif
endfunction
//Regenerating movespeed after knock
private function Regenerating_Movespeed takes integer level returns integer
if(level == 1) then
return 20
elseif(level == 2) then
return 15
elseif(level == 3) then
return 10
elseif(level == 4) then
return 5
else
return 0
endif
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct CrippleGraze_Data
unit u //Unit caster
integer l //Level of spell
player o //Owner of caster
unit t //Unit target
destructable tt //Tree
group w //Wolves
integer m //Mode
boolean c //Casting
integer p //Phase
real d //Distance close
real dm //Distance move
real dd //Damage deal
real dr //Damage regeneration
real kd //Knockback distance
boolean e //Cripple
real i //Interval
real im //Interval max
integer rm //Regenerating movement speed
lightning lg //Lightning
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private CrippleGraze_Data array Ar[10]
private group copy
private boolexpr bexpr
private location loc1
private location loc2
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local CrippleGraze_Data sd
local integer i = 0
local real cX = 0.0
local real cY = 0.0
local real tX = 0.0
local real tY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local real rad1 = 0.0
local real rad2 = 0.0
local real move = 0.0
local unit f = null
local boolean night = false
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.c) then
if(sd.p == 0) then
set cX = GetUnitX(sd.u)
set cY = GetUnitY(sd.u)
set tX = GetUnitX(sd.t)
set tY = GetUnitY(sd.t)
set rad1 = Atan2(tY - cY, tX - cX)
set rad2 = Atan2(cY - tY, cX - tX)
set dx = cX - tX
set dy = cY - tY
set distance = SquareRoot(dx * dx + dy * dy)
call MoveLightning(sd.lg, true, cX, cY, tX, tY)
if(distance <= sd.d) then
set sd.p = 1
else
set cX = cX + sd.dm * Cos(rad1)
set cY = cY + sd.dm * Sin(rad1)
call SetUnitX(sd.u, cX)
call SetUnitY(sd.u, cY)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.u, "chest"))
set tX = tX + sd.dm * Cos(rad2)
set tY = tY + sd.dm * Sin(rad2)
call SetUnitX(sd.t, tX)
call SetUnitY(sd.t, tY)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.t, "chest"))
endif
elseif(sd.p == 1) then
if(sd.m == 0) then
set sd.p = 2
set sd.e = true
set sd.c = false
call DestroyLightning(sd.lg)
set sd.lg = null
set rad1 = GetUnitFacing(sd.u)
call TargetCast(sd.o, GetUnitX(sd.t), GetUnitY(sd.t), 1.0, CAST_ID, sd.l, "purge", 0, sd.t)
call KnockbackEx(sd.t, sd.kd, rad1, KNOCKBACK_DURATION, 0.0, SPELL_EFFECT, true)
set night = (GetFloatGameState(GAME_STATE_TIME_OF_DAY) < 6.00 or GetFloatGameState(GAME_STATE_TIME_OF_DAY) > 18.00)
set sd.dd = sd.dd + NIGHT_DAMAGE
if(not IsUnitType(sd.t, UNIT_TYPE_MAGIC_IMMUNE)) then
if(IsUnitType(sd.t, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, sd.t, sd.dd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, sd.t, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
endif
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, sd.t, "origin"))
elseif(sd.m == 2) then
set sd.p = 2
set sd.e = false
set sd.c = false
call DestroyLightning(sd.lg)
set sd.lg = null
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, sd.tt, "origin"))
elseif(sd.m == 1) then
set sd.p = 2
set sd.e = false
set sd.c = false
call DestroyLightning(sd.lg)
set sd.lg = null
call KillDestructable(sd.tt)
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, sd.tt, "origin"))
endif
endif
elseif(sd.e) then
if(sd.p == 2) then
if(not IsUnitDead(sd.t)) then
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
if(GetUnitAbilityLevel(sd.t, BUFF_ID) > 0) then
set night = (GetFloatGameState(GAME_STATE_TIME_OF_DAY) < 6.00 or GetFloatGameState(GAME_STATE_TIME_OF_DAY) > 18.00)
if(not IsUnitType(sd.t, UNIT_TYPE_MAGIC_IMMUNE)) then
if(IsUnitType(sd.t, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, sd.t, sd.dr, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, sd.t, sd.dr, true, false, A_TYPE, D_TYPE, null)
endif
endif
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, sd.t, "origin"))
else
set sd.e = false
endif
set copy = CopyGroup(sd.w)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == sd.o) then
if(not IsUnitDead(f)) then
call IssueTargetOrder(f, "smart", sd.t)
endif
endif
endloop
endif
else
set sd.e = false
endif
endif
else
if(sd.lg != null) then
call DestroyLightning(sd.lg)
set sd.lg = null
endif
set copy = CopyGroup(sd.w)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == sd.o) then
if(not IsUnitDead(f)) then
call GroupRemoveUnit(sd.w, f)
call GroupAddUnit(Wolves, f)
endif
endif
endloop
set sd.u = null
set sd.o = null
set sd.t = null
set sd.tt = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if(Total == 0) then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local CrippleGraze_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local unit target = GetSpellTargetUnit()
local real targetX = GetUnitX(target)
local real targetY = GetUnitY(target)
local real dx = casterX - targetX
local real dy = casterY - targetY
local real distance = SquareRoot(dx * dx + dy * dy)
local boolean isNull = (Ar[Total] == null)
local unit f = null
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_BL_CrippleGraze
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
if(isNull) then
set sd = CrippleGraze_Data.create()
set sd.w = CreateGroup()
else
set sd = Ar[Total]
endif
set copy = CopyGroup(Wolves)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == owner) then
if(not IsUnitDead(f)) then
call GroupAddUnit(sd.w, f)
call GroupRemoveUnit(Wolves, f)
call IssueTargetOrder(f, "smart", target)
endif
endif
endloop
set sd.u = caster
set sd.l = level
set sd.o = owner
set sd.t = target
set sd.tt = GetSpellTargetDestructable()
if(sd.tt == null) then
if(sd.t != null) then
if(IsUnitAlly(sd.t, owner)) then
set sd.m = 1
else
set sd.m = 0
endif
else
set sd.m = 1
endif
else
set sd.m = 2
endif
set sd.c = true
set sd.p = 0
set sd.d = (distance / Distance_Move(level)) * 2
set sd.dm = (distance / Distance_Move(level))
set sd.dd = Damage(level)
set sd.dr = Damage_Regeneration(level) + (Damage_Regeneration(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.kd = KNOCKBACK_DISTANCE - distance
set sd.e = false
set sd.i = 1.0
set sd.im = 1.0
set sd.rm = Regenerating_Movespeed(level)
call MoveLocation(loc1, casterX, casterY)
call MoveLocation(loc2, targetX, targetY)
set sd.lg = AddLightningEx(LIGHTNING_ID, true, casterX, casterY, GetLocationZ(loc1), targetX, targetY, GetLocationZ(loc2))
if(item1 > 0) then
set sd.dd = sd.dd + UPGRADE1_DAMAGE
endif
set sd.dd = sd.dd + (sd.dd * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set owner = null
set target = null
set s = null
set f = null
endfunction
//----------------------------------------------------------------
private function Stop_Actions takes nothing returns nothing
local CrippleGraze_Data sd
local integer i = 0
local unit caster = GetTriggerUnit()
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set sd.c = false
endif
set i = i + 1
endloop
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(CrippleGrazeTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(CrippleGrazeTrg, Condition(function Conditions))
call TriggerAddAction(CrippleGrazeTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(CrippleGrazeStopTrg, EVENT_PLAYER_UNIT_SPELL_ENDCAST)
call TriggerAddCondition(CrippleGrazeStopTrg, Condition(function Conditions))
call TriggerAddAction(CrippleGrazeStopTrg, function Stop_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set copy = CreateGroup()
set bexpr = Condition(function Pick)
set loc1 = Location(0.0, 0.0)
set loc2 = Location(0.0, 0.0)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
endfunction
endscope
//TESH.scrollpos=167
//TESH.alwaysfold=0
globals
group Brutelords = CreateGroup()
group Wolves = CreateGroup()
trigger FeralChargeTrg = CreateTrigger()
endglobals
scope FeralWolves initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer ABILITY_ID = 'AOsf' //Ability Feral Wolves rawcode
private constant integer SPELL1_ID = 'A08W' //Spell Ferocious Maul rawcode
private constant integer ABILITY1_ID = 'A05O' //Ability Ferocious Maul (Damage +1) rawcode
private constant integer ABILITY2_ID = 'A05P' //Ability Ferocious Maul (Damage +10) rawcode
private constant integer ABILITY3_ID = 'A05Q' //Ability Ferocious Maul (Damage +100) rawcode
private constant integer SUMMON1_ID = 'osw1' //Summon wolf level 1 rawcode
private constant integer SUMMON2_ID = 'osw2' //Summon wolf level 2 rawcode
private constant integer SUMMON3_ID = 'osw3' //Summon wolf level 3 rawcode
private constant real MAX_DISTANCE = 500.0 //Max distance from Lycanthrope
private constant real EXTRA_MOVE_SPEED = 50.0 //Extra move speed when adapt to Brutelord
private constant integer ITEM1_UPGRADE = 'I00N' //Item Mortise Timbercutter
private constant real UPGRADE1_REGENERATION = 0.1 //Upgrade 1 effect
endglobals
//Regeneration
private function Regeneration takes integer level returns real
return 0.0 + (0.1 * level)
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private group copy
private location loc
private trigger FeralWolvesChargeTrg
endglobals
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit summoned = GetTriggerUnit()
local unit summoner = GetSummoningUnit()
local integer summonerID = GetUnitUserData(summoner)
local player owner = GetOwningPlayer(summoned)
local real time = GetFloatGameState(GAME_STATE_TIME_OF_DAY)
local unit f = null
if(time < 6.00 or time > 18.00) then
call UnitPauseTimedLife(summoned, true)
endif
call GroupAddUnit(Wolves, summoned)
call UnitAddAbility(summoned, 'Aloc')
call SetUnitPathing(summoned, false)
if(GetUnitAbilityLevel(summoner, SPELL1_ID) > 0) then
call UnitAddAbility(summoned, ABILITY1_ID)
call UnitAddAbility(summoned, ABILITY2_ID)
call UnitAddAbility(summoned, ABILITY3_ID)
call UnitAddAbility(summoned, SPELL1_ID)
call SetUnitAbilityLevel(summoned, SPELL1_ID, GetUnitAbilityLevel(summoner, SPELL1_ID))
endif
set summoned = null
set owner = null
set summoner = null
set f = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local integer summonID = GetUnitTypeId(GetSummonedUnit())
return summonID == SUMMON1_ID or /*
*/summonID == SUMMON2_ID or /*
*/summonID == SUMMON3_ID
endfunction
//----------------------------------------------------------------
private function Die_Actions takes nothing returns nothing
local unit dying = GetDyingUnit()
call GroupRemoveUnit(Wolves, dying)
set dying = null
endfunction
//----------------------------------------------------------------
private function Die_Conditions takes nothing returns boolean
local unit dying = GetDyingUnit()
local integer dyingID = GetUnitTypeId(dying)
local boolean okey = dyingID == SUMMON1_ID or /*
*/dyingID == SUMMON2_ID or /*
*/dyingID == SUMMON3_ID
set dying = null
return okey
endfunction
//----------------------------------------------------------------
private function Die_Actions2 takes nothing returns nothing
local unit dying = GetTriggerUnit()
local player owner = GetOwningPlayer(dying)
local unit f = null
set copy = CopyGroup(Wolves)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if GetOwningPlayer(f) == owner then
call KillUnit(f)
endif
endloop
set dying = null
set owner = null
set f = null
endfunction
//----------------------------------------------------------------
private function Die_Conditions2 takes nothing returns boolean
local unit dying = GetTriggerUnit()
local boolean okey = IsUnitInGroup(dying, Brutelords)
set dying = null
return okey
endfunction
//----------------------------------------------------------------
private function Attack_Actions takes nothing returns nothing
local unit attacker = GetAttacker()
local player owner = GetOwningPlayer(attacker)
local unit attacked = GetTriggerUnit()
local unit f = null
set copy = CopyGroup(Wolves)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == owner) then
call IssueTargetOrder(f, "smart", attacked)
endif
endloop
set attacker = null
set owner = null
set attacked = null
set f = null
endfunction
//----------------------------------------------------------------
private function Attack_Conditions takes nothing returns boolean
local unit attacker = GetAttacker()
local boolean okey = IsUnitInGroup(attacker, Brutelords)
set attacker = null
return okey
endfunction
//----------------------------------------------------------------
private function Follow_Actions takes nothing returns nothing
local unit ordered = GetTriggerUnit()
local real orderedX = GetUnitX(ordered)
local real orderedY = GetUnitY(ordered)
local player owner = GetOwningPlayer(ordered)
local integer orderID = GetIssuedOrderId()
local unit f = null
local real fX = 0.0
local real fY = 0.0
local unit target = GetOrderTargetUnit()
local real randomDistance = 0.0
local real randomRad = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
set loc = GetOrderPointLoc()
set copy = CopyGroup(Wolves)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == owner) then
if(not IsUnitPaused(f)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set randomDistance = GetRandomReal(50.0, 100.0)
set randomRad = GetRandomReal(0.0, 360.0) * bj_DEGTORAD
if(target == null) then
if(loc == null) then
call IssuePointOrder(f, "smart", orderedX + randomDistance * Cos(randomRad), orderedY + randomDistance * Sin(randomRad))
//call IssueImmediateOrderById(f, orderID)
else
set dx = fX - GetLocationX(loc)
set dy = fY - GetLocationY(loc)
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= MAX_DISTANCE) then
call IssuePointOrder(f, "smart", GetLocationX(loc) + randomDistance * Cos(randomRad), GetLocationY(loc) + randomDistance * Sin(randomRad))
else
call IssueTargetOrder(f, "move", ordered)
endif
//call IssuePointOrderById(f, orderID, GetLocationX(loc), GetLocationY(loc))
endif
else
set dx = fX - GetUnitX(target)
set dy = fY - GetUnitY(target)
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= MAX_DISTANCE) then
call IssueTargetOrder(f, "smart", target)
else
call IssueTargetOrder(f, "move", ordered)
endif
endif
endif
endif
endloop
set ordered = null
set target = null
set owner = null
set f = null
endfunction
//----------------------------------------------------------------
private function Follow_Conditions takes nothing returns boolean
local unit ordered = GetTriggerUnit()
local boolean okey = IsUnitInGroup(ordered, Brutelords)
set ordered = null
return okey
endfunction
//----------------------------------------------------------------
private function Charge_Actions takes nothing returns nothing
local unit f = null
local integer fId = 0
local boolean upgrade = false
local real fX = 0.0
local real fY = 0.0
local player owner = null
local integer level = 0
local integer charge = 0
local real value = 0.0
local real time = GetFloatGameState(GAME_STATE_TIME_OF_DAY)
local unit g = null
local real move = 0.0
local integer item1 = 0
set copy = CopyGroup(Brutelords)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set fId = GetUnitUserData(f)
set owner = GetOwningPlayer(f)
set level = GetUnitAbilityLevel(f, ABILITY_ID)
if(level > 0) then
set move = GetUnitMoveSpeed(f)
set item1 = IsUnitHasItemType(f, ITEM1_UPGRADE)
if(time > 18.00 and time < 19.00) then
set charge = 1
elseif(time >= 19.00 and time < 20.00) then
set charge = 2
elseif(time >= 20.00 and time < 21.00) then
set charge = 3
elseif(time >= 21.00 and time < 22.00) then
set charge = 4
elseif(time >= 22.00 and time < 23.00) then
set charge = 5
elseif(time >= 23.00 and time < 24.00) then
set charge = 6
elseif(time >= 0.00 and time < 1.00) then
set charge = 6
elseif(time >= 1.00 and time < 2.00) then
set charge = 5
elseif(time >= 2.00 and time < 3.00) then
set charge = 4
elseif(time >= 3.00 and time < 4.00) then
set charge = 3
elseif(time >= 4.00 and time < 5.00) then
set charge = 2
elseif(time >= 5.00 and time < 6.00) then
set charge = 1
else
set charge = 0
endif
set value = level * 1.0
if(item1 > 0) then
set value = value + UPGRADE1_REGENERATION
endif
set copy = CopyGroup(Wolves)
loop
set g = FirstOfGroup(copy)
exitwhen(g == null)
call GroupRemoveUnit(copy, g)
if(GetOwningPlayer(g) == owner) then
call SetUnitMoveSpeed(g, move + EXTRA_MOVE_SPEED)
call SetUnitState(f, UNIT_STATE_LIFE, GetUnitState(f, UNIT_STATE_LIFE) + value * Regeneration(level))
endif
endloop
endif
endloop
if(time < 6.00 or time > 18.00) then
set copy = CopyGroup(Wolves)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not IsUnitPaused(f)) then
call UnitPauseTimedLife(f, true)
endif
endloop
else
set copy = CopyGroup(Wolves)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not IsUnitPaused(f)) then
call UnitPauseTimedLife(f, false)
endif
endloop
endif
set owner = null
set f = null
set g = null
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local unit learner = GetLearningUnit()
if(not IsUnitInGroup(learner, Brutelords)) then
call GroupAddUnit(Brutelords, learner)
endif
if(not IsTriggerEnabled(FeralWolvesChargeTrg)) then
call EnableTrigger(FeralWolvesChargeTrg)
endif
set learner = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
return (GetLearnedSkill() == ABILITY_ID)
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set FeralWolvesChargeTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(FeralWolvesTrg, EVENT_PLAYER_UNIT_SUMMON)
call TriggerAddCondition(FeralWolvesTrg, Condition(function Conditions))
call TriggerAddAction(FeralWolvesTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(FeralWolvesLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(FeralWolvesLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(FeralWolvesLearnTrg, function Learn_Actions)
call TriggerRegisterAnyUnitEventBJ(FeralWolvesDieTrg, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(FeralWolvesDieTrg, Condition(function Die_Conditions))
call TriggerAddAction(FeralWolvesDieTrg, function Die_Actions)
call TriggerRegisterAnyUnitEventBJ(FeralWolvesDieTrg2, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(FeralWolvesDieTrg2, Condition(function Die_Conditions2))
call TriggerAddAction(FeralWolvesDieTrg2, function Die_Actions2)
call TriggerRegisterAnyUnitEventBJ(FeralWolvesAttackTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(FeralWolvesAttackTrg, Condition(function Attack_Conditions))
call TriggerAddAction(FeralWolvesAttackTrg, function Attack_Actions)
call TriggerRegisterAnyUnitEventBJ(FeralWolvesFollowTrg, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER )
call TriggerRegisterAnyUnitEventBJ(FeralWolvesFollowTrg, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER )
call TriggerRegisterAnyUnitEventBJ(FeralWolvesFollowTrg, EVENT_PLAYER_UNIT_ISSUED_ORDER )
call TriggerAddCondition(FeralWolvesFollowTrg, Condition(function Follow_Conditions))
call TriggerAddAction(FeralWolvesFollowTrg, function Follow_Actions)
call TriggerRegisterTimerEventPeriodic(FeralWolvesChargeTrg, 0.1)
call DisableTrigger(FeralWolvesChargeTrg)
call TriggerAddAction(FeralWolvesChargeTrg, function Charge_Actions)
//Setting globals
set copy = CreateGroup()
set loc = Location(0, 0)
//Preload
call AbilityPreload(SPELL1_ID)
call AbilityPreload(ABILITY_ID)
call AbilityPreload(ABILITY1_ID)
call AbilityPreload(ABILITY2_ID)
call AbilityPreload(ABILITY3_ID)
endfunction
endscope
//TESH.scrollpos=1
//TESH.alwaysfold=0
scope FerociousMaul initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A08W' //Spell Ferocious Maul rawcode
private constant integer ABILITY1_ID = 'A05O' //Ability Ferocious Maul (Damage +1) rawcode
private constant integer ABILITY2_ID = 'A05P' //Ability Ferocious Maul (Damage +10) rawcode
private constant integer ABILITY3_ID = 'A05Q' //Ability Ferocious Maul (Damage +100) rawcode
private constant integer ANIME = 6 //Animation attack
private constant integer ITEM1_UPGRADE = 'I008' //Item Mania Cestus
private constant real UPGRADE1_TIME = 3.0 //Upgrade 1 effect
private constant string SPELL_EFFECT = "Abilities\\Weapons\\VengeanceMissile\\VengeanceMissile.mdl" //Spell effect
endglobals
//Time remain
private function Time takes integer level returns real
return 5.0 + (0.0 * level)
endfunction
//Attack damage increase
private function Attack_Damage takes integer level returns integer
return 0 + (1 * level)
endfunction
//Max damage
private function Max_Damage takes integer level returns integer
return 200 + (100 * level)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct FerociousMaul_Data
player o //Owner o
real t //Duration end
integer d //Damage
integer md //Max damage
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private FerociousMaul_Data array Ar[10]
private group copy
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local FerociousMaul_Data sd
local integer i = 0
local unit f = null
local boolean night = false
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t > 0) then
set night = (GetFloatGameState(GAME_STATE_TIME_OF_DAY) < 6.00 or GetFloatGameState(GAME_STATE_TIME_OF_DAY) > 18.00)
if(not night) then
set sd.t = sd.t - Interval()
else
set sd.t = sd.t - (Interval() / 2)
endif
else
set copy = CopyGroup(Brutelords)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if GetOwningPlayer(f) == sd.o then
call SetUnitAbilityLevel(f, ABILITY1_ID, 1)
call SetUnitAbilityLevel(f, ABILITY2_ID, 1)
call SetUnitAbilityLevel(f, ABILITY3_ID, 1)
endif
endloop
set copy = CopyGroup(Wolves)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if GetOwningPlayer(f) == sd.o then
call SetUnitAbilityLevel(f, ABILITY1_ID, 1)
call SetUnitAbilityLevel(f, ABILITY2_ID, 1)
call SetUnitAbilityLevel(f, ABILITY3_ID, 1)
endif
endloop
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local FerociousMaul_Data sd
local unit attacker = GetAttacker()
local integer level = GetUnitAbilityLevel(attacker, SPELL_ID)
local player owner = GetOwningPlayer(attacker)
local integer i = 0
local boolean exist = false
local unit f = null
local integer damage = 0
local integer lvl1 = 0
local integer lvl2 = 0
local integer lvl3 = 0
set exist = false
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.o == owner) then
set sd.t = Time(level)
if(IsUnitHasItemType(attacker, ITEM1_UPGRADE) > 0) then
set sd.t = sd.t + UPGRADE1_TIME
endif
set sd.d = IMinBJ(sd.d + Attack_Damage(level), 999)
set sd.md = Max_Damage(level)
set exist = true
if(sd.d > sd.md) then
set sd.d = sd.md
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, attacker, "hand, left"))
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, attacker, "hand, right"))
endif
set damage = sd.d
set lvl3 = damage / 100
set damage = ModuloInteger(damage, 100)
set lvl2 = damage / 10
set damage = ModuloInteger(damage, 10)
set lvl1 = damage / 1
set damage = ModuloInteger(damage, 1)
set copy = CopyGroup(Brutelords)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if GetOwningPlayer(f) == owner then
call SetUnitAbilityLevel(f, ABILITY1_ID, lvl1 + 1)
call SetUnitAbilityLevel(f, ABILITY2_ID, lvl2 + 1)
call SetUnitAbilityLevel(f, ABILITY3_ID, lvl3 + 1)
endif
endloop
set copy = CopyGroup(Wolves)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if GetOwningPlayer(f) == owner then
call SetUnitAbilityLevel(f, ABILITY1_ID, lvl1 + 1)
call SetUnitAbilityLevel(f, ABILITY2_ID, lvl2 + 1)
call SetUnitAbilityLevel(f, ABILITY3_ID, lvl3 + 1)
endif
endloop
set i = Total
endif
set i = i + 1
endloop
if(not exist) then
set sd = FerociousMaul_Data.create()
set sd.o = owner
set sd.t = Time(level)
if(IsUnitHasItemType(attacker, ITEM1_UPGRADE) > 0) then
set sd.t = sd.t + UPGRADE1_TIME
endif
set sd.d = Attack_Damage(level)
set sd.md = Max_Damage(level)
set damage = sd.d
set lvl3 = damage / 100
set damage = ModuloInteger(damage, 100)
set lvl2 = damage / 10
set damage = ModuloInteger(damage, 10)
set lvl1 = damage / 1
set damage = ModuloInteger(damage, 1)
set copy = CopyGroup(Brutelords)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if GetOwningPlayer(f) == owner then
call SetUnitAbilityLevel(f, ABILITY1_ID, lvl1 + 1)
call SetUnitAbilityLevel(f, ABILITY2_ID, lvl2 + 1)
call SetUnitAbilityLevel(f, ABILITY3_ID, lvl3 + 1)
endif
endloop
set copy = CopyGroup(Wolves)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if GetOwningPlayer(f) == owner then
call SetUnitAbilityLevel(f, ABILITY1_ID, lvl1 + 1)
call SetUnitAbilityLevel(f, ABILITY2_ID, lvl2 + 1)
call SetUnitAbilityLevel(f, ABILITY3_ID, lvl3 + 1)
endif
endloop
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
set attacker = null
set owner = null
set f = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit attacker = GetAttacker()
local boolean okey = GetUnitAbilityLevel(attacker, SPELL_ID) > 0
set attacker = null
return okey
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local unit learner = GetLearningUnit()
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
local player owner = GetOwningPlayer(learner)
local unit f = null
if(level == 1 and (not IsUnitInGroup(learner, Brutelords))) then
call GroupAddUnit(Brutelords, learner)
call UnitAddAbility(learner, ABILITY1_ID)
call UnitAddAbility(learner, ABILITY2_ID)
call UnitAddAbility(learner, ABILITY3_ID)
call UnitMakeAbilityPermanent(learner, true, ABILITY1_ID)
call UnitMakeAbilityPermanent(learner, true, ABILITY2_ID)
call UnitMakeAbilityPermanent(learner, true, ABILITY3_ID)
endif
set copy = CopyGroup(Wolves)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if GetOwningPlayer(f) == owner then
call SetUnitAbilityLevel(f, SPELL_ID, level)
endif
endloop
set learner = null
set owner = null
set f = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
local unit learner = GetTriggerUnit()
local boolean okey = (GetLearnedSkill() == SPELL_ID) and (not IsUnitIllusion(learner))
set learner = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(FerociousMaulTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(FerociousMaulTrg, Condition(function Conditions))
call TriggerAddAction(FerociousMaulTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(FerociousMaulLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(FerociousMaulLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(FerociousMaulLearnTrg, function Learn_Actions)
//setting globals
set Tim = CreateTimer()
set Total = 0
set copy = CreateGroup()
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY1_ID)
call AbilityPreload(ABILITY2_ID)
call AbilityPreload(ABILITY3_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=6
//TESH.alwaysfold=0
scope Howl initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A08X' //Spell Howl rawcode
private constant integer ABILITY_ID = 'A05K' //Ability Howl (Attack Speed) rawcode
private constant integer ITEM1_UPGRADE = 'sbch' //Item Moonstalker
private constant real UPGRADE1_MANA = 0.05 //Upgrade 1 effect
private constant string SPELL_EFFECT = "Abilities\\Spells\\Other\\HowlOfTerror\\HowlCaster.mdl" //Spell effect
endglobals
//Radius
private function Radius takes integer level returns real
return 500.0 + (0.0 * level)
endfunction
//Increasing radius
private function Radius_Increase takes integer level returns real
return 50.0 + (0.0 * level)
endfunction
//Time buff
private function Duration takes integer level returns real
return 30.0 + (10.0 * level)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_HERO) == true) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false)
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Howl_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of spell
group g //Group target
integer p //Phase
integer st //Stack
real r //Area radius
real ir //Increasing radius
real x //X of caster
real y //Y of caster
real t //Time buff
integer it1 //Item 1 upgrade
endstruct
//----------------------------------------------------------------
globals
private integer Total
private timer Tim
private Howl_Data array Ar[10]
private boolexpr bexpr
private group all
private group copy
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Howl_Data sd
local integer i = 0
local unit f = null
local boolean night = false
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.p == 0) then
set night = (GetFloatGameState(GAME_STATE_TIME_OF_DAY) < 6.00 or GetFloatGameState(GAME_STATE_TIME_OF_DAY) > 18.00)
if(night) then
set sd.r = 10000.0
else
set sd.r = sd.r + sd.ir
endif
set sd.t = Duration(sd.l)
elseif(sd.p == 1) then
if(sd.st < 5) then
set sd.st = sd.st + 1
endif
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.u, "origin"))
call GroupEnumUnitsInRange(all, sd.x, sd.y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitAlly(f, sd.o) and (GetOwningPlayer(f) != Player(PLAYER_NEUTRAL_PASSIVE))) then
if(not IsUnitInGroup(f, sd.g)) then
call GroupAddUnit(sd.g, f)
call UnitAddAbility(f, ABILITY_ID)
call SetUnitAbilityLevel(f, ABILITY_ID, ((sd.l - 1) * 5) + sd.st)
else
if(GetUnitAbilityLevel(f, ABILITY_ID) <= 0) then
call UnitAddAbility(f, ABILITY_ID)
endif
call SetUnitAbilityLevel(f, ABILITY_ID, ((sd.l - 1) * 5) + sd.st)
endif
if(sd.it1 > 0) then
call SetUnitState(f, UNIT_STATE_MANA, GetUnitState(f, UNIT_STATE_MANA) + GetUnitState(f, UNIT_STATE_MAX_MANA) * UPGRADE1_MANA)
endif
endif
endloop
set copy = CopyGroup(Wolves)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if GetOwningPlayer(f) == sd.o then
call SetUnitAnimation(f, "slam")
if(not IsUnitInGroup(f, sd.g)) then
call GroupAddUnit(sd.g, f)
call UnitAddAbility(f, ABILITY_ID)
call SetUnitAbilityLevel(f, ABILITY_ID, ((sd.l - 1) * 5) + sd.st)
else
if(GetUnitAbilityLevel(f, ABILITY_ID) <= 0) then
call UnitAddAbility(f, ABILITY_ID)
endif
call SetUnitAbilityLevel(f, ABILITY_ID, ((sd.l - 1) * 5) + sd.st)
endif
endif
endloop
set sd.r = 0.0
set sd.p = 2
endif
if(sd.t > 0.0) then
set sd.t = sd.t - Interval()
set copy = CopyGroup(sd.g)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not IsUnitDead(f)) then
if(GetUnitAbilityLevel(f, ABILITY_ID) <= 0) then
call UnitAddAbility(f, ABILITY_ID)
call SetUnitAbilityLevel(f, ABILITY_ID, ((sd.l - 1) * 5) + sd.st)
else
call SetUnitAbilityLevel(f, ABILITY_ID, ((sd.l - 1) * 5) + sd.st)
endif
if(sd.it1 > 0) then
call SetUnitState(f, UNIT_STATE_MANA, GetUnitState(f, UNIT_STATE_MANA) + GetUnitState(f, UNIT_STATE_MAX_MANA) * UPGRADE1_MANA)
endif
else
call GroupRemoveUnit(sd.g, f)
call UnitRemoveAbility(f, ABILITY_ID)
endif
endloop
else
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
call UnitRemoveAbility(f, ABILITY_ID)
endloop
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Howl_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer casterType = GetUnitTypeId(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local boolean isNull = (Ar[Total] == null)
local boolean exist = false
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set sd.o = owner
set sd.l = level
set sd.p = 0
set sd.r = sd.r + Radius(level)
set sd.ir = Radius_Increase(level)
set sd.x = GetUnitX(caster)
set sd.y = GetUnitY(caster)
set exist = true
set i = Total
endif
set i = i + 1
endloop
if(not exist) then
if(isNull) then
set sd = Howl_Data.create()
set sd.g = CreateGroup()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.p = 0
set sd.st = 0
set sd.r = Radius(level)
set sd.ir = Radius_Increase(level)
set sd.x = GetUnitX(caster)
set sd.y = GetUnitY(caster)
set sd.it1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
endif
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Stop_Actions takes nothing returns nothing
local Howl_Data sd
local unit caster = GetTriggerUnit()
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set sd.p = 1
endif
set i = i + 1
endloop
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(HowlTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(HowlTrg, Condition(function Conditions))
call TriggerAddAction(HowlTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(HowlStopTrg, EVENT_PLAYER_UNIT_SPELL_ENDCAST)
call TriggerAddCondition(HowlStopTrg, Condition(function Conditions))
call TriggerAddAction(HowlStopTrg, function Stop_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set bexpr = Condition(function Pick)
set all = CreateGroup()
set copy = CreateGroup()
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=24
//TESH.alwaysfold=0
scope Frenzy initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A08V' //Spell Frenzy rawcode
private constant integer ABILITY1_ID = 'A08P' //Ability Frenzy (Frenzy Form) rawcode
private constant integer ABILITY2_ID = 'A08U' //Ability Frenzy (Normal Form) rawcode
private constant integer ANIME = 8 //Animate attack
private constant real UP_DISTANCE = 400.0 //Upgrade distance
private constant real INTERVAL_REFRENZY = 3.0 //Interval before another frenzy
private constant integer ITEM1_UPGRADE = 'I002' //Item Amazon Meld
private constant integer ITEM2_UPGRADE = 'anfg' //Item Brutalic
private constant real UPGRADE2_DISTANCE = 300.0 //Upgrade item 2 extra distance
private constant string SPELL_EFFECT = "Abilities\\Spells\\Orc\\FeralSpirit\\feralspiritdone.mdl" //Effect of spell
private constant string SPECIAL_EFFECT = "Abilities\\Weapons\\VengeanceMissile\\VengeanceMissile.mdl" //Effect at hand
private constant string FORM_EFFECT = "Abilities\\Spells\\Orc\\FeralSpirit\\feralspirittarget.mdl" //Transform effect
private constant attacktype A_TYPE = ATTACK_TYPE_CHAOS //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_MAGIC //Spell damage type
endglobals
//Attack count
private function Attack_Count takes integer level returns integer
return 3 + (0 * level)
endfunction
//Distance travel
private function Distance takes integer level returns real
return 600.0 + (0 * level)
endfunction
//Distance travel per interval
private function DistancePerInterval takes integer level returns real
return 50.0 + (0 * level)
endfunction
//Damage base
private function Damage_Base takes integer level returns real
return 0.0 + (1.0 * level)
endfunction
//Radius of effect
private function Radius takes integer level returns real
return 200.0 + (0 * level)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_FLYING) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Frenzy_Data
unit u //Unit caster
player o //Owner of caster
group g //Enemy group
integer lv //Level of spell
integer a //Attack count
real i //Interval
real im //Interval max
boolean l //Launch
boolean k //Ok to go
real t //Distance travel
real tm //Max distance travel
real m //Distance travel per interval
real x //Caster x
real y //Caster y
real cos //Cos angle of direction
real sin //Sin angle of direction
boolean p //Pull
real d //Damage deal
real r //Radius of damage
boolean e //Effect at hand
endstruct
//----------------------------------------------------------------
struct Frenzy_Rush_Data
unit u //Unit caster
player o //Owner of caster
group g //Enemy group
real t //Distance travel
real m //Distance travel per interval
real x //Caster x
real y //Caster y
real cos //Cos angle of direction
real sin //Sin angle of direction
real d //Damage deal
real r //Radius of damage
boolean e //Effect at hand
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Frenzy_Data array Ar[10]
private timer Tim2
private integer Total2
private Frenzy_Rush_Data array Ar2[10]
private group all
private boolexpr bexpr
private group copy
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute2 takes nothing returns nothing
local Frenzy_Rush_Data sd
local integer i = 0
local unit f = null
local real fAngle = 0.0
loop
exitwhen(i >= Total2)
set sd = Ar2[i]
if(sd.t > 0) then
set sd.x = GetUnitX(sd.u) + sd.m * sd.cos
set sd.y = GetUnitY(sd.u) + sd.m * sd.sin
if(sd.x > WorldBounds.minX + 300.0 and /*
*/sd.x < WorldBounds.maxX - 300.0 and /*
*/sd.y > WorldBounds.minY + 300.0 and /*
*/sd.y < WorldBounds.maxY - 300.0 and (not IsWall(sd.x, sd.y, 100.0)) and (not IsBarrel(sd.u, sd.x, sd.y, 100.0))) then
call SetUnitPosition(sd.u, sd.x, sd.y)
else
set sd.t = 0
endif
set sd.t = sd.t - sd.m
if(sd.e) then
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, sd.u, "hand, left"))
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, sd.u, "hand, right"))
endif
call GroupEnumUnitsInRange(all, sd.x, sd.y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (IsUnitEnemy(f, sd.o)) then
if(not IsUnitInGroup(f, sd.g)) then
call GroupAddUnit(sd.g, f)
call UnitDamageTarget(sd.u, f, sd.d, true, false, A_TYPE, D_TYPE, null)
endif
endif
endloop
call HitTree(sd.x, sd.y, sd.r, 1.0, 0.0)
else
call PauseUnit(sd.u, false)
call SetUnitPathing(sd.u, true)
call SetUnitAnimation(sd.u, "stand")
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
call Pather(sd.u, 1.0)
set sd.u = null
set sd.o = null
set Ar2[i] = Ar2[Total2 - 1]
set Ar2[Total2 - 1] = sd
set Total2 = Total2 - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total2 == 0 then
call PauseTimer(Tim2)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Register_Frenzy takes unit caster, real distance, real move, real angle, real damage, real radius returns nothing
local Frenzy_Rush_Data sd
local integer casterID = GetUnitUserData(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
local real rad = angle * bj_DEGTORAD
local unit f = null
local boolean isNull = (Ar2[Total2] == null)
call DestroyEffect(AddSpecialEffectTarget(FORM_EFFECT, caster, "origin"))
if(isNull) then
set sd = Frenzy_Rush_Data.create()
set sd.g = CreateGroup()
else
set sd = Ar2[Total2]
endif
set sd.u = caster
set sd.o = GetOwningPlayer(caster)
set sd.t = distance
set sd.m = move
set sd.x = 0.0
set sd.y = 0.0
set sd.cos = Cos(rad)
set sd.sin = Sin(rad)
set sd.d = damage
set sd.r = radius
set sd.e = true
call PauseUnit(sd.u, true)
call SetUnitAnimationByIndex(sd.u, ANIME)
call SetUnitFacing(sd.u, angle)
call UnitAddAbility(sd.u, 'Arav')
call UnitRemoveAbility(sd.u, 'Arav')
call SetUnitPathing(sd.u, false)
call DestroyEffect(AddSpecialEffectTarget(FORM_EFFECT, sd.u, "origin"))
if(isNull) then
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = sd
else
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
endif
set caster = null
set owner = null
set f = null
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Frenzy_Data sd
local integer i = 0
local unit f = null
local real fAngle = 0.0
local real x = 0.0
local real y = 0.0
local real randomDistance = 0.0
local real randomAngle = 0.0
local real angle = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(not IsUnitDead(sd.u)) then
if(sd.a > 0) then
if(sd.i > 0) then
set sd.i = sd.i - Interval()
else
if(not sd.l) then
set sd.l = true
set sd.a = sd.a - 1
else
if(not sd.k) then
if(IsUnitVisible(sd.u, sd.o) and (not IsUnitPaused(sd.u))) then
set sd.k = true
set sd.t = sd.tm
set angle = GetUnitFacing(sd.u)
set sd.cos = Cos(angle*bj_DEGTORAD)
set sd.sin = Sin(angle*bj_DEGTORAD)
call PauseUnit(sd.u, true)
call SetUnitFacing(sd.u, angle)
call SetUnitAnimationByIndex(sd.u, ANIME)
call DestroyEffect(AddSpecialEffectTarget(FORM_EFFECT, sd.u, "origin"))
endif
else
if(sd.t > 0) then
set sd.x = GetUnitX(sd.u) + sd.m * sd.cos
set sd.y = GetUnitY(sd.u) + sd.m * sd.sin
if(sd.x > WorldBounds.minX + 300.0 and /*
*/sd.x < WorldBounds.maxX - 300.0 and /*
*/sd.y > WorldBounds.minY + 300.0 and /*
*/sd.y < WorldBounds.maxY - 300.0 and (not IsWall(sd.x, sd.y, 100.0)) and (not IsBarrel(sd.u, sd.x, sd.y, 100.0))) then
call SetUnitPosition(sd.u, sd.x, sd.y)
else
set sd.t = 0
endif
set sd.t = sd.t - sd.m
if(sd.e) then
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, sd.u, "hand, left"))
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, sd.u, "hand, right"))
endif
call GroupEnumUnitsInRange(all, sd.x, sd.y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if (IsUnitEnemy(f, sd.o)) then
if(not IsUnitInGroup(f, sd.g)) then
call GroupAddUnit(sd.g, f)
call UnitDamageTarget(sd.u, f, sd.d, true, false, A_TYPE, D_TYPE, null)
endif
call GroupAddUnit(sd.g, f)
if(sd.p) then
call SetUnitX(f, sd.x + sd.m * sd.cos)
call SetUnitY(f, sd.y + sd.m * sd.sin)
endif
endif
endloop
call HitTree(sd.x, sd.y, sd.r, 1.0, 0.0)
else
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
set copy = CopyGroup(Wolves)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if GetOwningPlayer(f) == sd.o then
set randomDistance = GetRandomInt(100, 200)
set randomAngle = GetRandomInt(0, 360)
call SetUnitX(f, x + randomDistance * Cos(randomAngle * bj_DEGTORAD))
call SetUnitY(f, y + randomDistance * Sin(randomAngle * bj_DEGTORAD))
call Register_Frenzy(f, sd.tm, sd.m, GetUnitFacing(f), sd.d/2, sd.r)
endif
endloop
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
call PauseUnit(sd.u, false)
set sd.k = false
set sd.l = false
set sd.i = sd.im
set sd.d = GetHeroStr(sd.u, true) * Damage_Base(sd.lv)// + (sd.d * LoadInteger(MagicDamage_Ht, GetUnitUserData(sd.u), 0) * 0.01)
endif
endif
endif
endif
else
call UnitAddAbility(sd.u, ABILITY2_ID)
call UnitRemoveAbility(sd.u, ABILITY2_ID)
call SetUnitX(sd.u, GetUnitX(sd.u))
call SetUnitY(sd.u, GetUnitY(sd.u))
call SetUnitPathing(sd.u, true)
call SetUnitAnimation(sd.u, "stand")
call DestroyEffect(AddSpecialEffectTarget(FORM_EFFECT, sd.u, "origin"))
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
endloop
call Pather(sd.u, 1.0)
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Frenzy_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real angle = GetUnitFacing(caster)
local real rad = angle * bj_DEGTORAD
local unit f = null
local boolean night = (GetFloatGameState(GAME_STATE_TIME_OF_DAY) < 6.00 or GetFloatGameState(GAME_STATE_TIME_OF_DAY) > 18.00)
local boolean isNull = (Ar[Total] == null)
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
local integer item2 = IsUnitHasItemType(caster, ITEM2_UPGRADE)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_BL_Frenzy
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
call DestroyEffect(AddSpecialEffectTarget(FORM_EFFECT, caster, "origin"))
if(isNull) then
set sd = Frenzy_Data.create()
set sd.g = CreateGroup()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.o = GetOwningPlayer(caster)
set sd.lv = level
set sd.a = Attack_Count(level) + 1
set sd.i = 0.0
set sd.im = INTERVAL_REFRENZY
set sd.l = false
set sd.k = false
set sd.t = Distance(level)
set sd.tm = Distance(level)
set sd.m = DistancePerInterval(level)
set sd.x = 0.0
set sd.y = 0.0
set sd.cos = Cos(rad)
set sd.sin = Sin(rad)
set sd.p = false
set sd.d = (GetHeroStr(caster, true) + GetHeroAgi(caster, true)) * Damage_Base(level)
set sd.d = sd.d// + (sd.d * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.r = Radius(level)
set sd.e = true
if(night) then
set sd.a = sd.a + 2
endif
if(item1 > 0) then
set sd.p = true
endif
if(item2 > 0) then
set sd.tm = sd.tm + UPGRADE2_DISTANCE
endif
call UnitAddAbility(sd.u, ABILITY1_ID)
call UnitRemoveAbility(sd.u, ABILITY1_ID)
call UnitAddAbility(sd.u, 'Arav')
call UnitRemoveAbility(sd.u, 'Arav')
call SetUnitPathing(sd.u, false)
call SetUnitX(sd.u, casterX)
call SetUnitY(sd.u, casterY)
call SetUnitAnimationByIndex(sd.u, ANIME)
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set owner = null
set f = null
set s = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(FrenzyTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(FrenzyTrg, Condition(function Conditions))
call TriggerAddAction(FrenzyTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set Tim2 = CreateTimer()
set Total2 = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
set copy = CreateGroup()
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY1_ID)
call AbilityPreload(ABILITY2_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
call Preload(FORM_EFFECT)
endfunction
endscope
//TESH.scrollpos=75
//TESH.alwaysfold=0
scope WaterRemnant initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A092' //Spell Water Remnant rawcode
private constant integer DUMMY_ID = 'n01T' //Dummy Water Remnant rawcode
private constant integer WAVE_ID = 'n01Q' //Dummy Tidal Wave rawcode
private constant integer ABILITY_ID = 'A08Z' //Ability Tidal Wave rawcode
private constant real INTERVAL_CHECK = 0.2 //Interval check
private constant integer ITEM1_UPGRADE = 'rwiz' //Item Amethyst Ring
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_NORMAL //Spell attack type
private constant string SPELL_EFFECT = "Abilities\\Spells\\Other\\TidalWave\\TidalWaveDamage.mdl" //Special effect target
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Other\\CrushingWave\\CrushingWaveMissile.mdl" //Special effect wave
endglobals
//Duration
private function Duration takes integer level returns real
return 300.0
endfunction
//Radius
private function Radius takes integer level returns real
return 200.0 + (0.0 * level)
endfunction
//Radius detect water
private function Radius_Detect takes integer level returns real
return 100.0 + (0.0 * level)
endfunction
//Radius to find combine
private function Radius_Combine takes integer level returns real
return 500.0 + (0.0 * level)
endfunction
//Damage from attributes
private function Damage takes integer level returns real
if(level == 1) then
return 1.0
elseif(level == 2) then
return 1.0
elseif(level == 3) then
return 2.0
elseif(level == 4) then
return 3.0
else
return 0.0
endif
endfunction
//Damage
private function Base_Damage takes integer level returns real
if(level == 1) then
return 5.0
elseif(level == 2) then
return 5.0
elseif(level == 3) then
return 5.0
elseif(level == 4) then
return 5.0
else
return 0.0
endif
endfunction
//Distance
private function Distance takes integer level returns real
return 600.0 + (0.0 * level)
endfunction
//Distance move
private function Distance_Move takes integer level returns real
return 50.0 + (0.0 * level)
endfunction
//Damage multiple decreasing
private function Damage_Wave takes integer level returns real
if(level == 1) then
return 80.0
elseif(level == 2) then
return 40.0
elseif(level == 3) then
return 40.0
elseif(level == 4) then
return 40.0
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Unit affected
private function Targets_Water takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(GetUnitTypeId(target) == DUMMY_ID)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct WaterRemnant_Data
unit u //Unit caster
integer l //Level of spell
player o //Owner of caster
unit dum //Unit dummy
unit dum2 //Unit dummy wave
boolean c //Launch wave
real d //Duration
real a //Angle face
real r //Radius
real rd //Radius detect
real rc //Radius find combine
real i //Interval
real im //Max interval
real ds //Distance
real dm //Distance move
real dg //Damage wave decreasing
real dd //Damage
real bd //Base damage
integer it1 //Item upgrade 1
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private WaterRemnant_Data array Ar[100]
private group all
private boolexpr bexpr
private boolexpr bexprWater
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Pick_Water takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets_Water(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local WaterRemnant_Data sd
local WaterRemnant_Data wd
local integer i = 0
local integer j = 0
local real x = 0.0
local real y = 0.0
local real tX = 0.0
local real tY = 0.0
local unit f = null
local real fX = 0.0
local real fY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local unit minTarget = null
local real minDistance = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(not IsUnitDead(sd.dum)) then
if(not sd.c) then
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
set x = GetUnitX(sd.dum)
set y = GetUnitY(sd.dum)
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
if(IsUnitType(f, UNIT_TYPE_HERO)) then
set sd.c = true
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
else
call UnitDamageTarget(sd.u, f, sd.dd/25, true, false, A_TYPE, D_TYPE, null)
endif
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, f, "head"))
call SetUnitX(f, x)
call SetUnitY(f, y)
endif
endloop
if(sd.c) then
call SetUnitAnimation(sd.dum, "attack")
//call SetUnitVertexColor(sd.dum, 255, 255, 255, 0)
set sd.dum2 = CreateUnit(sd.o, WAVE_ID, x, y, GetUnitFacing(sd.dum))
call SetUnitVertexColor(sd.dum2, 0, 0, 255, 255)
call SetUnitScale(sd.dum2, 1.0, 1.0, 1.0)
set sd.a = GetUnitFacing(sd.dum)
call SetUnitAnimation(sd.dum, "death")
call SetUnitTimeScale(sd.dum, 10.0)
call SetUnitInvulnerable(sd.dum, true)
//if(sd.it1 > 0) then
//set sd.a = GetUnitFacing(sd.dum)
//endif
endif
endif
else
if(sd.ds > 0.0) then
set sd.ds = sd.ds - sd.dm
if(sd.dd > sd.bd + sd.dg) then
set sd.dd = sd.dd - sd.dg
else
set sd.dd = sd.bd
endif
set tX = GetUnitX(sd.dum2)
set tY = GetUnitY(sd.dum2)
//call DestroyEffect(AddSpecialEffect(SPECIAL_EFFECT, tX, tY))
call GroupEnumUnitsInRange(all, tX, tY, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
call SetUnitX(f, tX)
call SetUnitY(f, tY)
//call SetUnitPosition(f, x, y)
endif
endloop
set minTarget = null
set minDistance = 0.0
call GroupEnumUnitsInRange(all, tX, tY, sd.rc, bexprWater)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitAlly(f, sd.o) and f != sd.dum) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = tX - fX
set dy = tY - fY
set distance = SquareRoot(dx * dx + dy * dy)
if(minTarget == null) then
set minTarget = f
set minDistance = distance
else
if(distance <= minDistance) then
set minTarget = f
set minDistance = distance
endif
endif
endif
endloop
if(minTarget != null) then
set fX = GetUnitX(minTarget)
set fY = GetUnitY(minTarget)
set sd.a = Atan2(fY - tY, fX - tX) * bj_RADTODEG
endif
call GroupEnumUnitsInRange(all, tX, tY, sd.rd, bexprWater)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitAlly(f, sd.o) and f != sd.dum) then
set sd.a = GetUnitFacing(f)
endif
endloop
set x = tX + sd.dm * Cos(sd.a * bj_DEGTORAD)
set y = tY + sd.dm * Sin(sd.a * bj_DEGTORAD)
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
call SetUnitX(sd.dum2, x)
call SetUnitY(sd.dum2, y)
call SetUnitX(sd.dum, x)
call SetUnitY(sd.dum, y)
else
set sd.ds = 0.0
endif
else
call KillUnit(sd.dum2)
call KillUnit(sd.dum)
call SetUnitTimeScale(sd.dum, 1.0)
endif
endif
else
call KillUnit(sd.dum2)
call KillUnit(sd.dum)
call SetUnitTimeScale(sd.dum, 1.0)
set sd.u = null
set sd.o = null
set sd.dum = null
set sd.dum2 = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
set minTarget = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local WaterRemnant_Data sd = WaterRemnant_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local real face = GetUnitFacing(caster)
local real rad = face * bj_DEGTORAD
local integer str = GetHeroStr(caster, true)
local integer agi = GetHeroAgi(caster, true)
local integer int = GetHeroInt(caster, true)
local player owner = GetOwningPlayer(caster)
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_AQ_WaterRemnant
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
set sd.u = caster
set sd.l = level
set sd.o = owner
set sd.dum = CreateUnit(owner, DUMMY_ID, casterX, casterY, face)
set sd.dum2 = null
call UnitAddType(sd.dum, UNIT_TYPE_SUMMONED)
call UnitApplyTimedLife(sd.dum, 'BHwe', Duration(level))
call UnitAddAbility(sd.dum, 'Arav')
call UnitRemoveAbility(sd.dum, 'Arav')
call SetUnitPathing(sd.dum, false)
call SetUnitX(sd.dum, casterX)
call SetUnitY(sd.dum, casterY)
call SetUnitMoveSpeed(sd.dum, 0.0)
set sd.c = false
set sd.a = face
set sd.r = Radius(level)
set sd.rd = Radius_Detect(level)
set sd.rc = Radius_Combine(level)
set sd.i = 0.0
set sd.im = INTERVAL_CHECK
set sd.ds = Distance(level)
set sd.dm = Distance_Move(level)
set sd.dg = Damage_Wave(level)
set sd.dd = Damage(level) * (str + agi + int)
set sd.dd = sd.dd + (sd.dd * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.bd = Base_Damage(level)
set sd.it1 = item1
if(item1 > 0) then
call SetUnitMoveSpeed(sd.dum, 50.0)
endif
call SetUnitAnimation(sd.dum, "birth")
call QueueUnitAnimation(sd.dum, "stand")
//call SetUnitVertexColor(sd.dum, 255, 255, 255, 100)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
set s = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(WaterRemnantTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(WaterRemnantTrg, Condition(function Conditions))
call TriggerAddAction(WaterRemnantTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
set bexprWater = Condition(function Pick_Water)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
endfunction
endscope
//TESH.scrollpos=14
//TESH.alwaysfold=0
scope Portal initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A090' //Spell Portal First rawcode
private constant integer ABILITY_ID = 'A091' //Spell Portal Second rawcode
private constant integer ABILITY1_ID = 'Aret' //Ability Tome of Retraining rawcode
private constant integer DUMMY1_ID = 'n01R' //Dummy Portal First rawcode
private constant integer DUMMY2_ID = 'n01S' //Dummy Portal Second rawcode
private constant integer MAX_PORTAL = 2 //Maximum portal
private constant real HERO_DISTANCE_OFFSET = 0.0 //Distance teleport away from original point for hero
private constant real UNIT_DISTANCE_OFFSET = 100.0 //Distance teleport away from original point for hero
private constant real PING_DURATION = 1.0 //Ping duration
private constant integer ITEM1_UPGRADE = 'I01Z' //Item Zestflux
private constant real UPGRADE1_DELAY = 1.0 //Upgrade 1 effect
private constant string SPELL_EFFECT = "Abilities\\Spells\\Human\\MassTeleport\\MassTeleportTarget.mdl" //Spell effect
endglobals
//Delay spawn
private function Delay takes integer level returns real
return 8.0 - (2.0 * level)
endfunction
//Radius teleport
private function Radius takes integer level returns real
return 100.0 + (0.0 * level)
endfunction
//Interval cooldown
private function Interval_Cooldown takes integer level returns real
return 2.0 - (0.0 * level)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and /*
*/(GetUnitTypeId(target) != DUMMY1_ID and /*
*/GetUnitTypeId(target) != DUMMY2_ID)
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Portal_First_Data
unit u //Unit caster
player o //Owner of caster
unit dum //Unit dummy
unit part //Unit partner
boolean n //New spawn
boolean y //Ready
real d //Delay
real r //Radius
real i //Interval
real im //Interval max
endstruct
//----------------------------------------------------------------
struct Portal_Second_Data
unit u //Unit caster
player o //Owner of caster
unit dum //Unit dummy
unit part //Unit partner
boolean n //New spawn
boolean y //Ready
real d //Delay
real r //Radius
real i //Interval
real im //Interval max
endstruct
//----------------------------------------------------------------
globals
private integer Total1
private timer Tim1
private Portal_First_Data array Ar1[10]
private integer Total2
private timer Tim2
private Portal_Second_Data array Ar2[10]
private boolexpr bexpr
private group all
private location loc
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function First_Actions_Execute takes nothing returns nothing
local Portal_First_Data sd1
local integer i = 0
local real x = 0.0
local real y = 0.0
local real tX = 0.0
local real tY = 0.0
local real rad = 0.0
local boolean exist = false
local unit target = null
local unit f = null
loop
exitwhen(i >= Total1)
set sd1 = Ar1[i]
if(sd1.d > 0.0) then
set sd1.d = sd1.d - Interval()
elseif(not sd1.y) then
call SetUnitTimeScale(sd1.dum, 0.5)
call SetUnitVertexColor(sd1.dum, 255, 255, 255, 255)
call PauseUnit(sd1.dum, false)
set x = GetUnitX(sd1.dum)
set y = GetUnitY(sd1.dum)
if(IsPlayerInForce(GetLocalPlayer(), Players) and IsPlayerAlly(sd1.o, GetLocalPlayer())) then
call PingMinimap(x, y, PING_DURATION)
endif
set sd1.y = true
else
if(sd1.i > 0.0) then
set sd1.i = sd1.i - Interval()
else
if(not IsUnitPaused(sd1.dum)) then
if(sd1.part != null) then
if(not IsUnitPaused(sd1.part)) then
set x = GetUnitX(sd1.dum)
set y = GetUnitY(sd1.dum)
set exist = false
call GroupEnumUnitsInRange(all, x, y, sd1.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(not exist) then
if(f != sd1.dum and f != sd1.part) then
if(IsUnitAlly(f, sd1.o)) then
if(GetOwningPlayer(f) != Player(PLAYER_NEUTRAL_PASSIVE)) then
set exist = true
set target = f
endif
else
set exist = true
set target = f
endif
endif
endif
endloop
if(exist) then
call UnitAddAbility(sd1.part, 'Arav')
call UnitRemoveAbility(sd1.part, 'Arav')
call SetUnitPathing(sd1.part, false)
set rad = GetUnitFacing(target) * bj_DEGTORAD
if(IsUnitType(target, UNIT_TYPE_HERO)) then
set tX = GetUnitX(sd1.part) + (HERO_DISTANCE_OFFSET) * Cos(rad)
set tY = GetUnitY(sd1.part) + (HERO_DISTANCE_OFFSET) * Sin(rad)
else
set tX = GetUnitX(sd1.part) + (UNIT_DISTANCE_OFFSET) * Cos(rad)
set tY = GetUnitY(sd1.part) + (UNIT_DISTANCE_OFFSET) * Sin(rad)
endif
if(IsUnitType(target, UNIT_TYPE_HERO) and IsUnitEnemy(target, sd1.o)) then
call SetUnitVertexColor(sd1.dum, 255, 0, 0, 150)
call SetUnitVertexColor(sd1.part, 255, 0, 0, 150)
call PauseUnit(sd1.dum, true)
call PauseUnit(sd1.part, true)
else
call PauseUnit(sd1.part, true)
call SetUnitAnimation(sd1.dum, "birth")
call QueueUnitAnimation(sd1.dum, "stand")
call SetUnitAnimation(sd1.part, "birth")
call QueueUnitAnimation(sd1.part, "stand")
endif
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, GetUnitX(target), GetUnitY(target)))
call SetUnitX(target, tX)
call SetUnitY(target, tY)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, target, "origin"))
if(IsUnitType(target, UNIT_TYPE_HERO)) then
if(IsUnitEnemy(target, sd1.o)) then
set sd1.i = 3600.0
else
set sd1.i = 2.0
endif
else
set sd1.i = 0.0
endif
endif
endif
endif
else
set sd1.i = sd1.im
call PauseUnit(sd1.dum, false)
endif
endif
endif
set i = i + 1
endloop
if Total1 == 0 then
call PauseTimer(Tim1)
endif
set target = null
set f = null
endfunction
//----------------------------------------------------------------
private function First_Actions takes nothing returns nothing
local Portal_First_Data sd1
local Portal_Second_Data sd2
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer casterType = GetUnitTypeId(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local real targetX = 0.0
local real targetY = 0.0
local integer total = 0
local integer i = 0
local boolean exist = false
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
if(targetX > WorldBounds.minX + 300.0 and /*
*/targetX < WorldBounds.maxX - 300.0 and /*
*/targetY > WorldBounds.minY + 300.0 and /*
*/targetY < WorldBounds.maxY - 300.0 and (not IsWall(targetX, targetY, 100.0))) then
loop
exitwhen(i >= Total1)
set sd1 = Ar1[i]
if(sd1.u == caster) then
set sd1.d = Delay(level)
set sd1.y = false
set sd1.i = 0.0
set sd1.im = Interval_Cooldown(level)
if(item1 > 0) then
set sd1.d = sd1.d - UPGRADE1_DELAY
endif
call SetUnitX(sd1.dum, targetX)
call SetUnitY(sd1.dum, targetY)
call SetUnitAnimation(sd1.dum, "birth")
call SetUnitTimeScale(sd1.dum, 1.0/sd1.d)
call QueueUnitAnimation(sd1.dum, "stand")
call Pather(sd1.dum, 0.1)
call PauseUnit(sd1.dum, true)
//call ShowUnit(sd1.dum, true)
call SetUnitVertexColor(sd1.dum, 255, 255, 255, 150)
set exist = true
set i = Total1
endif
set i = i + 1
endloop
if(not exist) then
set sd1 = Portal_First_Data.create()
set sd1.u = caster
set sd1.o = owner
set sd1.dum = CreateUnit(owner, DUMMY1_ID, targetX, targetY, GetRandomReal(0.0, 360.0))
call SetUnitAnimation(sd1.dum, "birth")
call QueueUnitAnimation(sd1.dum, "stand")
call Pather(sd1.dum, 0.1)
call PauseUnit(sd1.dum, true)
call SetUnitVertexColor(sd1.dum, 255, 255, 255, 150)
//call SetUnitTimeScale(sd1.dum, 0.5)
set sd1.n = true
set sd1.y = false
set sd1.d = Delay(level)
set sd1.r = Radius(level)
set sd1.i = 0.0
set sd1.im = Interval_Cooldown(level)
call SetUnitTimeScale(sd1.dum, 1.0/sd1.d)
if(item1 > 0) then
set sd1.d = sd1.d - UPGRADE1_DELAY
endif
if(Total1 <= 0) then
call TimerStart(Tim1, Interval(), true, function First_Actions_Execute)
endif
set Total1 = Total1 + 1
set Ar1[Total1 - 1] = sd1
set i = 0
loop
exitwhen(i >= Total2)
set sd2 = Ar2[i]
if(sd2.u == caster) then
set sd2.part = sd1.dum
set sd1.part = sd2.dum
set i = Total2
endif
set i = i + 1
endloop
endif
endif
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function First_Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Second_Actions_Execute takes nothing returns nothing
local Portal_Second_Data sd2
local integer i = 0
local real x = 0.0
local real y = 0.0
local real tX = 0.0
local real tY = 0.0
local real rad = 0.0
local boolean exist = false
local unit target = null
local unit f = null
loop
exitwhen(i >= Total2)
set sd2 = Ar2[i]
if(sd2.d > 0.0) then
set sd2.d = sd2.d - Interval()
elseif(not sd2.y) then
call SetUnitTimeScale(sd2.dum, 0.5)
call SetUnitVertexColor(sd2.dum, 255, 0, 255, 255)
call PauseUnit(sd2.dum, false)
set x = GetUnitX(sd2.dum)
set y = GetUnitY(sd2.dum)
if(IsPlayerInForce(GetLocalPlayer(), Players) and IsPlayerAlly(sd2.o, GetLocalPlayer())) then
call PingMinimap(x, y, PING_DURATION)
endif
set sd2.y = true
else
if(sd2.i > 0.0) then
set sd2.i = sd2.i - Interval()
else
if(not IsUnitPaused(sd2.dum)) then
if(sd2.part != null) then
if(not IsUnitPaused(sd2.part)) then
set x = GetUnitX(sd2.dum)
set y = GetUnitY(sd2.dum)
set exist = false
call GroupEnumUnitsInRange(all, x, y, sd2.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(not exist) then
if(f != sd2.dum and f != sd2.part) then
if(IsUnitAlly(f, sd2.o)) then
if(GetOwningPlayer(f) != Player(PLAYER_NEUTRAL_PASSIVE)) then
set exist = true
set target = f
endif
else
set exist = true
set target = f
endif
endif
endif
endloop
if(exist) then
call UnitAddAbility(sd2.part, 'Arav')
call UnitRemoveAbility(sd2.part, 'Arav')
call SetUnitPathing(sd2.part, false)
set rad = GetUnitFacing(target) * bj_DEGTORAD
if(IsUnitType(target, UNIT_TYPE_HERO)) then
set tX = GetUnitX(sd2.part) + (HERO_DISTANCE_OFFSET) * Cos(rad)
set tY = GetUnitY(sd2.part) + (HERO_DISTANCE_OFFSET) * Sin(rad)
else
set tX = GetUnitX(sd2.part) + (UNIT_DISTANCE_OFFSET) * Cos(rad)
set tY = GetUnitY(sd2.part) + (UNIT_DISTANCE_OFFSET) * Sin(rad)
endif
if(IsUnitType(target, UNIT_TYPE_HERO) and IsUnitEnemy(target, sd2.o)) then
call SetUnitVertexColor(sd2.dum, 255, 0, 0, 150)
call SetUnitVertexColor(sd2.part, 255, 0, 0, 150)
call PauseUnit(sd2.dum, true)
call PauseUnit(sd2.part, true)
else
call PauseUnit(sd2.part, true)
call SetUnitAnimation(sd2.dum, "birth")
call QueueUnitAnimation(sd2.dum, "stand")
call SetUnitAnimation(sd2.part, "birth")
call QueueUnitAnimation(sd2.part, "stand")
endif
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, GetUnitX(target), GetUnitY(target)))
call SetUnitX(target, tX)
call SetUnitY(target, tY)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, target, "origin"))
if(IsUnitType(target, UNIT_TYPE_HERO)) then
if(IsUnitEnemy(target, sd2.o)) then
set sd2.i = 3600.0
else
set sd2.i = 2.0
endif
else
set sd2.i = 0
endif
endif
endif
endif
else
set sd2.i = sd2.im
call PauseUnit(sd2.dum, false)
endif
endif
endif
set i = i + 1
endloop
if Total2 == 0 then
call PauseTimer(Tim2)
endif
set target = null
set f = null
endfunction
//----------------------------------------------------------------
private function Second_Actions takes nothing returns nothing
local Portal_First_Data sd1
local Portal_Second_Data sd2
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer casterType = GetUnitTypeId(caster)
local integer level = GetUnitAbilityLevel(caster, ABILITY_ID)
local player owner = GetOwningPlayer(caster)
local real targetX = 0.0
local real targetY = 0.0
local integer total = 0
local integer i = 0
local boolean exist = false
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
if(targetX > WorldBounds.minX + 300.0 and /*
*/targetX < WorldBounds.maxX - 300.0 and /*
*/targetY > WorldBounds.minY + 300.0 and /*
*/targetY < WorldBounds.maxY - 300.0 and (not IsWall(targetX, targetY, 100.0))) then
loop
exitwhen(i >= Total2)
set sd2 = Ar2[i]
if(sd2.u == caster) then
set sd2.d = Delay(level)
set sd2.y = false
set sd2.i = 0.0
set sd2.im = Interval_Cooldown(level)
if(item1 > 0) then
set sd2.d = sd2.d - UPGRADE1_DELAY
endif
call SetUnitX(sd2.dum, targetX)
call SetUnitY(sd2.dum, targetY)
call SetUnitAnimation(sd2.dum, "birth")
call SetUnitTimeScale(sd2.dum, 1.0/sd2.d)
call QueueUnitAnimation(sd2.dum, "stand")
call Pather(sd2.dum, 0.1)
call PauseUnit(sd2.dum, true)
call SetUnitVertexColor(sd2.dum, 255, 255, 255, 150)
set exist = true
set i = Total2
endif
set i = i + 1
endloop
if(not exist) then
set sd2 = Portal_Second_Data.create()
set sd2.u = caster
set sd2.o = owner
set sd2.dum = CreateUnit(owner, DUMMY2_ID, targetX, targetY, GetRandomReal(0.0, 360.0))
call SetUnitAnimation(sd2.dum, "birth")
call QueueUnitAnimation(sd2.dum, "stand")
call Pather(sd2.dum, 0.1)
call PauseUnit(sd2.dum, true)
call SetUnitVertexColor(sd2.dum, 255, 255, 255, 150)
//call SetUnitTimeScale(sd1.dum, 0.5)
set sd2.n = true
set sd2.y = false
set sd2.d = Delay(level)
set sd2.r = Radius(level)
set sd2.i = 0.0
set sd2.im = Interval_Cooldown(level)
call SetUnitTimeScale(sd2.dum, 1.0/sd2.d)
if(item1 > 0) then
set sd2.d = sd2.d - UPGRADE1_DELAY
endif
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Second_Actions_Execute)
endif
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = sd2
set i = 0
loop
exitwhen(i >= Total1)
set sd1 = Ar1[i]
if(sd1.u == caster) then
set sd2.part = sd1.dum
set sd1.part = sd2.dum
set i = Total1
endif
set i = i + 1
endloop
endif
endif
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Second_Conditions takes nothing returns boolean
return GetSpellAbilityId() == ABILITY_ID
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local unit learner = GetLearningUnit()
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
if(level == 1) then
if(GetUnitAbilityLevel(learner, ABILITY_ID) <= 0) then
call UnitAddAbility(learner, ABILITY_ID)
call UnitMakeAbilityPermanent(learner, true, ABILITY_ID)
endif
else
call SetUnitAbilityLevel(learner, ABILITY_ID, level)
endif
set learner = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
return (GetLearnedSkill() == SPELL_ID)
endfunction
//----------------------------------------------------------------
private function Train_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
call TriggerSleepAction(0.5)
if(GetUnitAbilityLevel(caster, SPELL_ID) <= 0) then
call UnitRemoveAbility(caster, ABILITY_ID)
endif
set caster = null
endfunction
//----------------------------------------------------------------
private function Train_Conditions takes nothing returns boolean
return GetSpellAbilityId() == ABILITY1_ID and /*
*/(GetUnitAbilityLevel(GetTriggerUnit(), ABILITY_ID) > 0)
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(PortalLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(PortalLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(PortalLearnTrg, function Learn_Actions)
call TriggerRegisterAnyUnitEventBJ(PortalFirstTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(PortalFirstTrg, Condition(function First_Conditions))
call TriggerAddAction(PortalFirstTrg, function First_Actions)
call TriggerRegisterAnyUnitEventBJ(PortalSecondTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(PortalSecondTrg, Condition(function Second_Conditions))
call TriggerAddAction(PortalSecondTrg, function Second_Actions)
call TriggerRegisterAnyUnitEventBJ(PortalTrainTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(PortalTrainTrg, Condition(function Train_Conditions))
call TriggerAddAction(PortalTrainTrg, function Train_Actions)
//Setting globals
set Tim1 = CreateTimer()
set Total1 = 0
set Tim2 = CreateTimer()
set Total2 = 0
set bexpr = Condition(function Pick)
set all = CreateGroup()
set loc = Location(0.0, 0.0)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY_ID)
call AbilityPreload(ABILITY1_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=49
//TESH.alwaysfold=0
scope Aquashield initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A093' //Spell Aquashield rawcode
private constant integer CAST_ID = 'Acri' //Ability Aquashield (Slow) rawcode
private constant integer DUMMY_ID = 'n01U' //Dummy Aquashield rawcode
private constant integer ITEM1_UPGRADE = 'rhth' //Item Zemi of Eternal
private constant real UPGRADE1_COOLDOWN = 1.0 //Upgrade 1 effect
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_NORMAL //Spell attack type
private constant string SPELL_EFFECT = "Abilities\\Spells\\Other\\Drain\\ManaDrainCaster.mdl" //Spell effect
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Items\\AIma\\AImaTarget.mdl" //Spell effect
endglobals
//Cooldown
private function Cooldown takes integer level returns real
if(level == 1) then
return 10.0
elseif(level == 2) then
return 8.0
elseif(level == 3) then
return 4.0
else
return 0.0
endif
endfunction
//Heal amount
private function Heal takes integer level returns real
if(level == 1) then
return 80.0
elseif(level == 2) then
return 120.0
elseif(level == 3) then
return 200.0
else
return 0.0
endif
endfunction
//Cast time
private function Cast takes integer level returns real
return 0.5 + (0.0 * level)
endfunction
//Blast amount
private function Blast takes integer level returns integer
if(level == 1) then
return 8
elseif(level == 2) then
return 10
elseif(level == 3) then
return 12
else
return 0
endif
endfunction
//Distance
private function Distance takes integer level returns real
return 600.0 + (0.0 * level)
endfunction
//Distance move
private function Distance_Move takes integer level returns real
return 80.0 + (0.0 * level)
endfunction
//Radius minimum
private function Radius takes integer level returns real
return 200.0 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Aquashield_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of spell
group dum //Group dummy
group g //Group target
integer p //Phase
real cd //Time cooldown
real t //Time before launch
real d //Distance blast
real dm //Distance move
real r //Radius
real dd //Damage
effect e //Effect caster
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Aquashield_Data array Ar[10]
private group all
private group copy
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Aquashield_Data sd
local integer i = 0
local integer j = 0
local unit f = null
local unit g = null
local real rad = 0.0
local real x = 0.0
local real y = 0.0
local integer time = 0
local string s = null
local integer item1 = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(not IsUnitDead(sd.u)) then
if(GetUnitAbilityLevel(sd.u, SPELL_ID) > 0) then
if(sd.p == 0) then
if(sd.cd > 0.0) then
set sd.cd = sd.cd - Interval()
if(ModuloInteger(R2I(sd.cd * 100.0), 100) == 99) then
set time = R2I(sd.cd)
set s = ""
if(GetLocalPlayer() == sd.o) then
set s = I2S(time)
endif
call TextTag_AttachUnit(s, 10.0 * 0.023 / 10.0, sd.u, 30.0, /*
*/R2I(10.0 * 255.0 * 0.01), R2I(50.0 * 255.0 * 0.01), R2I(100.0 * 255.0 * 0.01), R2I(100.0 * 255.0 * 0.01), /*
*/50.0 * 0.071 / 128.0 * Cos(90.0 * bj_DEGTORAD), 50.0 * 0.071 / 128.0 * Sin(90.0 * bj_DEGTORAD), /*
*/false, 5.00, 1.75)
endif
else
set sd.cd = 0.0
set sd.t = Cast(sd.l)
set sd.p = 1
if(sd.e != null) then
call DestroyEffect(sd.e)
set sd.e = null
endif
set sd.e = AddSpecialEffectTarget(SPELL_EFFECT, sd.u, "overhead")
endif
elseif(sd.p == 1) then
if(sd.t > 0.0) then
set sd.t = sd.t - Interval()
else
set sd.p = 2
endif
elseif(sd.p == 2) then
elseif(sd.p == 3) then
if(sd.d > 0.0) then
set sd.d = sd.d - sd.dm
set copy = CopyGroup(sd.dum)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set rad = GetUnitFacing(f) * bj_DEGTORAD
set x = GetUnitX(f) + sd.dm * Cos(rad)
set y = GetUnitY(f) + sd.dm * Sin(rad)
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
if(IsUnitEnemy(g, sd.o) and (not IsUnitInGroup(g, sd.g))) then
if(IsUnitType(g, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, g, sd.dd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, g, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
call TargetCast(sd.o, x, y, 0.5, CAST_ID, sd.l, "cripple", 0, g)
call GroupAddUnit(sd.g, g)
endif
endloop
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
call SetUnitX(f, x)
call SetUnitY(f, y)
endif
endloop
else
set item1 = IsUnitHasItemType(sd.u, ITEM1_UPGRADE)
loop
set f = FirstOfGroup(sd.dum)
exitwhen(f == null)
call GroupRemoveUnit(sd.dum, f)
call KillUnit(f)
endloop
set sd.p = 0
set sd.cd = Cooldown(sd.l)
set sd.t = 0.0
set sd.d = Distance(sd.l)
set sd.dm = Distance_Move(sd.l)
set sd.r = Radius(sd.l)
set sd.dd = 0.0
if(item1 > 0) then
set sd.cd = sd.cd - UPGRADE1_COOLDOWN
endif
endif
endif
else
if(sd.e != null) then
call DestroyEffect(sd.e)
set sd.e = null
endif
set sd.p = 0
set sd.cd = Cooldown(sd.l)
set sd.t = 0.0
set sd.d = Distance(sd.l)
set sd.dm = Distance_Move(sd.l)
set sd.r = Radius(sd.l)
set sd.dd = 0.0
endif
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
set g = null
set s = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Aquashield_Data sd
local unit learner = GetTriggerUnit()
local integer learnerID = GetUnitUserData(learner)
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
local player owner = GetOwningPlayer(learner)
local integer i = 0
local boolean exist = false
if(level == 1) then
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set exist = true
set sd.l = level
set i = Total
endif
set i = i + 1
endloop
if(not exist) then
set sd = Aquashield_Data.create()
set sd.u = learner
set sd.o = owner
set sd.l = level
set sd.dum = CreateGroup()
set sd.g = CreateGroup()
set sd.p = 0
set sd.cd = Cooldown(level)
set sd.t = 0.0
set sd.d = Distance(level)
set sd.dm = Distance_Move(level)
set sd.r = Radius(level)
set sd.dd = 0.0
set sd.e = null
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
else
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set sd.l = level
set i = Total
endif
set i = i + 1
endloop
endif
set learner = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit learner = GetTriggerUnit()
local boolean okey = (GetLearnedSkill() == SPELL_ID) and (not IsUnitIllusion(learner))
set learner = null
return okey
endfunction
//----------------------------------------------------------------
function Aquashield_onDamage takes unit attacker, unit attacked, real amount returns nothing
local integer attackedID = GetUnitUserData(attacked)
local Aquashield_Data sd
local integer i = 0
local integer j = 0
local integer count = 0
local real x = 0.0
local real y = 0.0
local real angle = 0.0
local unit dummy = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(attacked == sd.u) then
if(sd.p == 2) then
set sd.p = 3
set sd.dd = Heal(sd.l) + amount + (amount * LoadInteger(MagicDamage_Ht, attackedID, 0) * 0.01)
set sd.d = Distance(sd.l)
set sd.dm = Distance_Move(sd.l)
if(sd.e != null) then
call DestroyEffect(sd.e)
set sd.e = null
endif
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
set count = Blast(sd.l)
set angle = 360.0/count
set j = 0
loop
exitwhen(j >= count)
set dummy = CreateUnit(sd.o, DUMMY_ID, x, y, j * angle)
call GroupAddUnit(sd.dum, dummy)
set j = j + 1
endloop
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, sd.u, "head"))
call SetUnitState(sd.u, UNIT_STATE_LIFE, GetUnitState(sd.u, UNIT_STATE_LIFE) + Heal(sd.l))
endif
set i = Total
endif
set i = i + 1
endloop
set dummy = null
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(AquashieldTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(AquashieldTrg, Condition(function Conditions))
call TriggerAddAction(AquashieldTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set copy = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
endfunction
endscope
//TESH.scrollpos=17
//TESH.alwaysfold=0
scope Adaptation initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A094' //Spell Water Remnant rawcode
private constant real INTERVAL_INCREASE = 1.0 //Interval check
private constant integer ITEM1_UPGRADE = 'spsh' //Item Dream Sphere
private constant integer UPGRADE1_ATTRIBUTE = 1 //Upgrade 1 effect
private constant string SPELL_EFFECT = "Abilities\\Spells\\Human\\ControlMagic\\ControlMagicTarget.mdl" //Special effect target
private constant string SPECIAL_EFFECT = "war3mapImported\\Arcane Disperse Aura.mdx" //Special effect finish target
endglobals
//Duration
private function Duration takes integer level returns real
if(level == 1) then
return 30.0
elseif(level == 2) then
return 45.0
elseif(level == 3) then
return 60.0
else
return 0.0
endif
endfunction
//Attributes increase per interval
private function Attribute takes integer level returns integer
if(level == 1) then
return 3
elseif(level == 2) then
return 6
elseif(level == 3) then
return 9
else
return 0
endif
endfunction
//Interval increase attribute
private function Interval_Increase takes integer level returns real
return 1.0
endfunction
//Interval
private function Interval takes nothing returns real
return 0.5
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Adaptation_Data
unit u //Unit caster
integer l //Level of spell
player o //Owner of caster
unit t //Unit target
real d //Duration
real i //Interval
real im //Interval max
integer up //Up attribute
integer str //Strength
integer agi //Agility
integer int //Intelligence
integer s //Strength
integer a //Agility
integer n //Intelligence
effect e //Effect target
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Adaptation_Data array Ar[10]
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Adaptation_Data sd
local integer i = 0
local boolean exist = false
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.d > 0.0) then
set sd.d = sd.d - Interval()
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
set exist = false
if(sd.str > 0) then
set exist = true
if(sd.str > sd.up) then
set sd.str = sd.str - sd.up
set sd.s = sd.s + sd.up
call SetHeroStr(sd.t, GetHeroStr(sd.t, false) + sd.up, false)
else
set sd.s = sd.s + sd.str
call SetHeroStr(sd.t, GetHeroStr(sd.t, false) + sd.str, false)
set sd.str = 0
endif
endif
if(sd.agi > 0) then
set exist = true
if(sd.agi > sd.up) then
set sd.agi = sd.agi - sd.up
set sd.a = sd.a + sd.up
call SetHeroAgi(sd.t, GetHeroAgi(sd.t, false) + sd.up, false)
else
set sd.a = sd.a + sd.agi
call SetHeroAgi(sd.t, GetHeroAgi(sd.t, false) + sd.agi, false)
set sd.agi = 0
endif
endif
if(sd.int > 0) then
set exist = true
if(sd.int > sd.up) then
set sd.int = sd.int - sd.up
set sd.n = sd.n + sd.up
call SetHeroInt(sd.t, GetHeroInt(sd.t, false) + sd.up, false)
else
set sd.n = sd.n + sd.int
call SetHeroInt(sd.t, GetHeroInt(sd.t, false) + sd.int, false)
set sd.int = 0
endif
endif
if(exist) then
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.t, "overhead"))
endif
endif
else
call SetHeroStr(sd.t, GetHeroStr(sd.t, false) - sd.s, false)
call SetHeroAgi(sd.t, GetHeroAgi(sd.t, false) - sd.a, false)
call SetHeroInt(sd.t, GetHeroInt(sd.t, false) - sd.n, false)
if(sd.e != null) then
call DestroyEffect(sd.e)
set sd.e = null
endif
set sd.u = null
set sd.o = null
set sd.t = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Adaptation_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local unit target = GetSpellTargetUnit()
local integer str = 0
local integer agi = 0
local integer int = 0
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
local integer i = 0
local boolean exist = false
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t == target) then
set exist = true
set sd.d = Duration(level)
set sd.im = Interval_Increase(level)
set sd.up = Attribute(level)
set str = GetHeroStr(target, true)
set agi = GetHeroAgi(target, true)
set int = GetHeroInt(target, true)
if(str > agi) then
if(str > int) then
set sd.str = sd.str + 0
set sd.agi = sd.agi + str - agi
set sd.int = sd.int + str - int
else
set sd.str = sd.str + int - str
set sd.agi = sd.agi + int - agi
set sd.int = sd.int + 0
endif
else
if(agi > int) then
set sd.str = sd.str + agi - str
set sd.agi = sd.agi + 0
set sd.int = sd.int + agi - int
else
set sd.str = sd.str + int - str
set sd.agi = sd.agi + int - agi
set sd.int = sd.int + 0
endif
endif
if(item1 > 0) then
set sd.up = sd.up + UPGRADE1_ATTRIBUTE
endif
endif
set i = i + 1
endloop
if(not exist) then
set sd = Adaptation_Data.create()
set sd.u = caster
set sd.l = level
set sd.o = owner
set sd.t = target
set sd.d = Duration(level)
set sd.i = 0.0
set sd.im = Interval_Increase(level)
set sd.up = Attribute(level)
if(item1 > 0) then
set sd.up = sd.up + UPGRADE1_ATTRIBUTE
endif
set sd.s = 0
set sd.a = 0
set sd.n = 0
set str = GetHeroStr(target, true)
set agi = GetHeroAgi(target, true)
set int = GetHeroInt(target, true)
if(str > agi) then
if(str > int) then
set sd.str = 0
set sd.agi = str - agi
set sd.int = str - int
else
set sd.str = int - str
set sd.agi = int - agi
set sd.int = 0
endif
else
if(agi > int) then
set sd.str = agi - str
set sd.agi = 0
set sd.int = agi - int
else
set sd.str = int - str
set sd.agi = int - agi
set sd.int = 0
endif
endif
set sd.e = AddSpecialEffectTarget(SPECIAL_EFFECT, sd.t, "origin")
//call BJDebugMsg(I2S(sd.str) + " " + I2S(sd.agi) + " " + I2S(sd.int))
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, target, "overhead"))
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
set caster = null
set owner = null
set target = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(AdaptationTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(AdaptationTrg, Condition(function Conditions))
call TriggerAddAction(AdaptationTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
endfunction
endscope
//TESH.scrollpos=46
//TESH.alwaysfold=0
scope TidalWave initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A08Z' //Spell Tidal Wave rawcode
private constant integer DUMMY_ID = 'n01Q' //Dummy Tidal Wave rawcode
private constant real STARTING_DELAY = 0.0 //Starting delay before first wave
private constant real CAST_OFFSET_DISTANCE = 200.0 //Offset distance from caster to launch wave
private constant integer ITEM1_UPGRADE = 'I00W' //Item Atlantic Darktrident
private constant integer UPGRADE1_COUNT = 12 //Upgrade 1 effect
private constant integer ITEM2_UPGRADE = 'I009' //Item Prime Lucent
private constant real UPGRADE2_SPAWN = 0.01 //Upgrade 2 effect
private constant attacktype A_TYPE = ATTACK_TYPE_CHAOS //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_UNIVERSAL //Spell attack type
private constant string SPELL_EFFECT = "Abilities\\Spells\\NightElf\\Blink\\BlinkTarget.mdl" //Spell effect
private constant string UPGRADE_EFFECT = "Objects\\Spawnmodels\\Naga\\NagaDeath\\NagaDeath.mdl" //Spell effect
endglobals
//Number summon
private function Count takes integer level returns integer
if(level == 1) then
return 12
elseif(level == 2) then
return 24
else
return 0
endif
endfunction
//Interval summon
private function Interval_Summon takes integer level returns real
return 0.2 - (0.0 * level)
endfunction
//Distance move
private function Distance_Move takes integer level returns real
return 50.0 + (0.0 * level)
endfunction
//Damage multiple
private function Damage takes integer level returns real
if(level == 1) then
return 24.0
elseif(level == 2) then
return 36.0
else
return 0.0
endif
endfunction
//Radius target
private function Radius takes integer level returns real
return 100.0
endfunction
//Radius of damage
private function Radius_Damage takes integer level returns real
return 100.0
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct TidalWave_Data
unit u //Unit caster
player o //Owner of caster
integer c //Number summon
real cx //Caster x
real cy //Caster y
real x //Target x
real y //Target y
real i //Interval
real im //Interval max
real f //Facing
real off //Offset spawn
real dm //Distance move
real rd //Radius damage
real d //Damage
boolean up //Upgrade
endstruct
//----------------------------------------------------------------
struct Wave_Data
unit u //Unit caster
player o //Owner of caster
unit dum //Unit dummy
real tX //Target x
real tY //Target y
real df //Distance final
real dm //Distance move
real rd //Radius damage
real d //Damage
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private TidalWave_Data array Ar[10]
private timer Tim2
private integer Total2
private Wave_Data array Ar2[100]
private group all
private boolexpr bexpr
private location loc
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute2 takes nothing returns nothing
local Wave_Data wd
local integer i = 0
local real x = 0.0
local real y = 0.0
local real tX = 0.0
local real tY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local real facing = 0.0
local real cos = 0.0
local real sin = 0.0
local unit f = null
loop
exitwhen(i >= Total2)
set wd = Ar2[i]
set x = GetUnitX(wd.dum)
set y = GetUnitY(wd.dum)
set dx = x - wd.tX
set dy = y - wd.tY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance > wd.df) then
set wd.df = wd.df + 0.5
set facing = GetUnitFacing(wd.dum)
set cos = Cos(facing * bj_DEGTORAD)
set sin = Sin(facing * bj_DEGTORAD)
set x = x + wd.dm * cos
set y = y + wd.dm * sin
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
call SetUnitX(wd.dum, x)
call SetUnitY(wd.dum, y)
else
set wd.tX = x
set wd.tY = y
set x = GetUnitX(wd.dum)
set y = GetUnitY(wd.dum)
endif
call GroupEnumUnitsInRange(all, x, y, wd.rd, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, wd.o)) then
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(wd.u, f, wd.d, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(wd.u, f, wd.d, true, false, A_TYPE, D_TYPE, null)
endif
if(IsUnitType(f, UNIT_TYPE_HERO)) then
call SetUnitX(f, x)
call SetUnitY(f, y)
else
set tX = GetUnitX(f) + wd.dm * cos
set tY = GetUnitY(f) + wd.dm * sin
call SetUnitX(f, tX)
call SetUnitY(f, tY)
endif
/*elseif(GetOwningPlayer(f) != Player(PLAYER_NEUTRAL_PASSIVE)) then
if(IsUnitType(f, UNIT_TYPE_HERO)) then
call SetUnitX(f, x)
call SetUnitY(f, y)
else
set tX = GetUnitX(f) + wd.dm * cos
set tY = GetUnitY(f) + wd.dm * sin
call SetUnitX(f, tX)
call SetUnitY(f, tY)
endif*/
endif
endloop
call SetUnitFacing(wd.dum, bj_RADTODEG * Atan2(wd.tY - y, wd.tX - x))
else
set facing = GetUnitFacing(wd.dum)
set cos = Cos(facing * bj_DEGTORAD)
set sin = Sin(facing * bj_DEGTORAD)
set x = x + wd.dm * cos
set y = y + wd.dm * sin
call GroupEnumUnitsInRange(all, x, y, wd.rd, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, wd.o)) then
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(wd.u, f, wd.d, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(wd.u, f, wd.d, true, false, A_TYPE, D_TYPE, null)
endif
if(IsUnitType(f, UNIT_TYPE_HERO)) then
call SetUnitX(f, x)
call SetUnitY(f, y)
else
set tX = GetUnitX(f) + wd.dm * cos
set tY = GetUnitY(f) + wd.dm * sin
call SetUnitX(f, tX)
call SetUnitY(f, tY)
endif
call Knockback_NoPause(f, wd.df, facing, 1.0)
/*elseif(GetOwningPlayer(f) != Player(PLAYER_NEUTRAL_PASSIVE)) then
if(IsUnitType(f, UNIT_TYPE_HERO)) then
call SetUnitX(f, x)
call SetUnitY(f, y)
else
set tX = GetUnitX(f) + wd.dm * cos
set tY = GetUnitY(f) + wd.dm * sin
call SetUnitX(f, tX)
call SetUnitY(f, tY)
endif*/
endif
endloop
call KillUnit(wd.dum)
set wd.u = null
set wd.o = null
set wd.dum = null
set Ar2[i] = Ar2[Total2 - 1]
set Total2 = Total2 - 1
call wd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total2 == 0 then
call PauseTimer(Tim2)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local TidalWave_Data sd
local Wave_Data wd
local integer i = 0
local real x = 0.0
local real y = 0.0
local real face = 0.0
local real rad = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.c > 0) then
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
set sd.c = sd.c - 1
set face = I2R(GetRandomInt(0, 360))
set rad = face * bj_DEGTORAD
set x = sd.cx + sd.off * Cos(rad)
set y = sd.cy + sd.off * Sin(rad)
if(sd.up) then
call DestroyEffect(AddSpecialEffect(UPGRADE_EFFECT, x, y))
else
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, x, y))
endif
set wd = Wave_Data.create()
set wd.u = sd.u
set wd.o = sd.o
set wd.dum = CreateUnit(sd.o, DUMMY_ID, x, y, face)
set wd.tX = sd.x
set wd.tY = sd.y
set wd.df = 50.0
set wd.dm = sd.dm
set wd.rd = sd.rd
set wd.d = sd.d
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = wd
endif
else
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local TidalWave_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
local real targetX = 0.0
local real targetY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local real rad = 0.0
local boolean isNull = (Ar[Total] == null)
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
local integer item2 = IsUnitHasItemType(caster, ITEM2_UPGRADE)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_AQ_TidalWave
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
if(isNull) then
set sd = TidalWave_Data.create()
//set sd.g = CreateGroup()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.o = owner
set sd.c = Count(level)
set sd.x = targetX
set sd.y = targetY
set sd.i = STARTING_DELAY
set sd.im = Interval_Summon(level)
set sd.f = bj_RADTODEG * Atan2(targetY - casterY, targetX - casterX)
set sd.off = 0.0
set sd.dm = Distance_Move(level)
set sd.rd = Radius_Damage(level)
set sd.d = Damage(level)
set sd.d = sd.d + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set rad = sd.f * bj_DEGTORAD
set sd.cx = casterX + CAST_OFFSET_DISTANCE * Cos(rad)
set sd.cy = casterY + CAST_OFFSET_DISTANCE * Sin(rad)
set sd.up = false
set dx = sd.cx - targetX
set dy = sd.cy - targetY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance < sd.rd) then
set sd.off = sd.rd
endif
if(item1 > 0) then
set sd.c = sd.c + UPGRADE1_COUNT
set sd.up = true
endif
if(item2 > 0) then
set sd.im = sd.im - UPGRADE2_SPAWN
set sd.up = true
endif
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set owner = null
set s = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(TidalWaveTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(TidalWaveTrg, Condition(function Conditions))
call TriggerAddAction(TidalWaveTrg, function Actions)
//Setting globals
set all = CreateGroup()
set bexpr = Condition(function Pick)
set Tim = CreateTimer()
set Total = 0
set Tim2 = CreateTimer()
set Total2 = 0
set loc = Location(0, 0)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
call Preload(UPGRADE_EFFECT)
endfunction
endscope
//TESH.scrollpos=33
//TESH.alwaysfold=0
scope Haunt initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A09C' //Spell Haunt rawcode
private constant integer CAST_ID = 'Auhf' //Cast Haunt (Dummy) rawcode
private constant integer BUFF_ID = 'Buhf' //Dummy Haunt (Dummy) rawcode
private constant integer ABILITY_ID = 'A09H' //Ability Haunt (Attack Speed) rawcode
private constant integer ABILITY1_ID = 'A0A3' //Ability Haunt (Stacking) rawcode
private constant real DISTANCE_OFFSET = 900.0 //Distance offset
private constant integer ITEM1_UPGRADE = 'rag1' //Item Walking Slippers
private constant real UPGRADE1_DURATION = 5.0 //Upgrade 1 effect
private constant string SPELL_EFFECT = "Abilities\\Spells\\Undead\\Curse\\CurseTarget.mdl" //Target effect
endglobals
//Movespeed decrease percentage
private function Movespeed takes integer level returns real
if(level == 1) then
return 0.3
elseif(level == 2) then
return 0.4
elseif(level == 3) then
return 0.55
elseif(level == 4) then
return 0.75
else
return 0.0
endif
endfunction
//Duration
private function Duration takes integer level returns real
if(level == 1) then
return 20.0
elseif(level == 2) then
return 20.0
elseif(level == 3) then
return 20.0
elseif(level == 4) then
return 20.0
else
return 0.0
endif
endfunction
//Distance from target
private function Distance takes integer level returns real
if(level == 1) then
return 900.0
elseif(level == 2) then
return 900.0
elseif(level == 3) then
return 900.0
elseif(level == 4) then
return 900.0
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.5
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Haunt_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of spell
unit g //Unit target
unit dum //Unit dummy
real t //Timer
real d //Distance activation
effect e //Effect
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Haunt_Data array Ar[10]
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Haunt_Data sd
local integer i = 0
local real cX = 0.0
local real cY = 0.0
local real tX = 0.0
local real tY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local unit target = null
local real targetDistance = 0.0
local unit f = null
local real speed = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t > 0.0 and (not IsUnitType(sd.g, UNIT_TYPE_MAGIC_IMMUNE))) then
set sd.t = sd.t - Interval()
set cX = GetUnitX(sd.u)
set cY = GetUnitY(sd.u)
if(IsUnitDead(sd.g)) then
if(sd.e != null) then
call DestroyEffect(sd.e)
set sd.e = null
endif
//call SetUnitMoveSpeed(sd.g, GetUnitDefaultMoveSpeed(sd.g))
call UnitRemoveAbility(sd.g, ABILITY1_ID)
set target = null
set targetDistance = 0.0
call GroupEnumUnitsInRange(all, cX, cY, sd.d, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o) and IsUnitType(f, UNIT_TYPE_HERO)) then
set tX = GetUnitX(f)
set tY = GetUnitY(f)
set dx = cX - tX
set dy = cY - tY
set distance = SquareRoot(dx * dx + dy * dy)
if(target == null) then
set target = f
set targetDistance = distance
elseif(distance < targetDistance) then
set target = f
set targetDistance = distance
endif
endif
endloop
if(target != null) then
set speed = GetUnitMoveSpeed(target)
//call SetUnitMoveSpeed(target, speed - speed * Movespeed(sd.l))
call UnitAddAbility(target, ABILITY1_ID)
call SetUnitAbilityLevel(target, ABILITY1_ID, sd.l)
set sd.g = target
set sd.e = AddSpecialEffectTarget(SPELL_EFFECT, target, "overhead")
else
call GroupEnumUnitsInRange(all, cX, cY, sd.d, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
set tX = GetUnitX(f)
set tY = GetUnitY(f)
set dx = cX - tX
set dy = cY - tY
set distance = SquareRoot(dx * dx + dy * dy)
if(target == null) then
set target = f
set targetDistance = distance
elseif(distance < targetDistance) then
set target = f
set targetDistance = distance
endif
endif
endloop
if(target != null) then
set speed = GetUnitMoveSpeed(target)
//call SetUnitMoveSpeed(target, speed - speed * Movespeed(sd.l))
call UnitAddAbility(target, ABILITY1_ID)
call SetUnitAbilityLevel(target, ABILITY1_ID, sd.l)
set sd.g = target
set sd.e = AddSpecialEffectTarget(SPELL_EFFECT, target, "overhead")
else
set sd.t = 0.0
endif
endif
endif
set tX = GetUnitX(sd.g)
set tY = GetUnitY(sd.g)
set dx = cX - tX
set dy = cY - tY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance < sd.d) then
/*if(GetUnitAbilityLevel(sd.u, ABILITY_ID) <= 0) then
call UnitAddAbility(sd.u, ABILITY_ID)
endif
call SetUnitAbilityLevel(sd.u, ABILITY_ID, sd.l)*/
if(GetUnitAbilityLevel(sd.u, BUFF_ID) <= 0) then
call TargetCast(sd.o, cX, cY, 0.5, CAST_ID, sd.l, "unholyfrenzy", 0, sd.u)
endif
//call SetUnitAbilityLevel(sd.u, ABILITY_ID, sd.l)
else
call UnitRemoveAbility(sd.u, BUFF_ID)
//call UnitRemoveAbility(sd.u, ABILITY_ID)
endif
else
//call UnitRemoveAbility(sd.u, ABILITY_ID)
//call SetUnitMoveSpeed(sd.g, GetUnitDefaultMoveSpeed(sd.g))
call UnitRemoveAbility(sd.g, ABILITY1_ID)
if(sd.e != null) then
call DestroyEffect(sd.e)
set sd.e = null
endif
if(sd.dum != null) then
call KillUnit(sd.dum)
endif
set sd.u = null
set sd.o = null
set sd.g = null
set sd.dum = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set target = null
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Haunt_Data sd = Haunt_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local unit target = GetSpellTargetUnit()
local real speed = GetUnitMoveSpeed(target)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.g = target
set sd.t = Duration(level)
set sd.d = Distance(level)
set sd.e = AddSpecialEffectTarget(SPELL_EFFECT, target, "overhead")
//call SetUnitMoveSpeed(target, speed - speed * Movespeed(level))
call UnitAddAbility(target, ABILITY1_ID)
call SetUnitAbilityLevel(target, ABILITY1_ID, level)
if(item1 > 0) then
set sd.t = sd.t + UPGRADE1_DURATION
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
set target = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(HauntTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(HauntTrg, Condition(function Conditions))
call TriggerAddAction(HauntTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call AbilityPreload(ABILITY_ID)
call AbilityPreload(ABILITY1_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=3
//TESH.alwaysfold=0
scope Desolation initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'AEpa' //Spell Desolation rawcode
private constant integer BUFF_ID = 'B02O' //Buff Desolation rawcode
private constant integer ITEM1_UPGRADE = 'mcou' //Item Ankh of Virtue
private constant real UPGRADE1_TIME = 10.0 //Upgrade 1 effect
endglobals
//Time absorb
private function Time takes integer level returns real
if(level == 1) then
return 20.0
elseif(level == 2) then
return 30.0
elseif(level == 3) then
return 50.0
else
return 0.0
endif
endfunction
//Strength
private function Strength takes integer level returns integer
return 1 + (0 * level)
endfunction
//Agility
private function Agility takes integer level returns integer
return 1 + (0 * level)
endfunction
//Intelligence
private function Intelligence takes integer level returns integer
return 1 + (0 * level)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.5
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Desolation_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level
unit g //Unit target
integer m //Mode
real t //Time
integer str //Strength
integer agi //Agility
integer int //Intelligence
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Desolation_Data array Ar[1000]
private location target
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Desolation_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t > 0.0) then
set sd.t = sd.t - Interval()
else
call SetHeroAgi(sd.u, GetHeroAgi(sd.u, false) - (sd.str + sd.agi + sd.int), false)
if(sd.m == 0) then
call SetHeroStr(sd.g, GetHeroStr(sd.g, false) + sd.str, false)
call SetHeroAgi(sd.g, GetHeroAgi(sd.g, false) + sd.agi, false)
call SetHeroInt(sd.g, GetHeroInt(sd.g, false) + sd.int, false)
endif
set sd.u = null
set sd.o = null
set sd.g = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
function Desolation_onDamage takes unit attacker, unit attacked, real amount returns nothing
local Desolation_Data sd
local integer i = 0
local integer item1 = IsUnitHasItemType(attacker, ITEM1_UPGRADE)
call UnitRemoveAbility(attacked, BUFF_ID)
if(IsUnitType(attacked, UNIT_TYPE_HERO)) then
set sd = Desolation_Data.create()
set sd.u = attacker
set sd.o = GetOwningPlayer(attacker)
set sd.l = GetUnitAbilityLevel(attacker, SPELL_ID)
set sd.g = attacked
set sd.m = 0
set sd.t = Time(sd.l)
set sd.str = Strength(sd.l)
set sd.agi = Agility(sd.l)
set sd.int = Intelligence(sd.l)
if(item1 > 0) then
set sd.t = sd.t + UPGRADE1_TIME
endif
if(GetHeroStr(sd.g, false) > sd.str) then
call SetHeroStr(sd.g, GetHeroStr(sd.g, false) - sd.str, false)
else
set sd.str = 0
endif
if(GetHeroAgi(sd.g, false) > sd.agi) then
call SetHeroAgi(sd.g, GetHeroAgi(sd.g, false) - sd.agi, false)
else
set sd.agi = 0
endif
if(GetHeroInt(sd.g, false) > sd.int) then
call SetHeroInt(sd.g, GetHeroInt(sd.g, false) - sd.int, false)
else
set sd.int = 0
endif
call SetHeroAgi(sd.u, GetHeroAgi(sd.u, false) + sd.str + sd.agi + sd.int, false)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
set sd = Desolation_Data.create()
set sd.u = attacker
set sd.o = GetOwningPlayer(attacker)
set sd.l = GetUnitAbilityLevel(attacker, SPELL_ID)
set sd.m = 1
set sd.t = Time(sd.l)
set sd.str = 0
set sd.agi = 1
set sd.int = 0
if(item1 > 0) then
set sd.t = sd.t + UPGRADE1_TIME
endif
call SetHeroAgi(sd.u, GetHeroAgi(sd.u, false) + sd.str + sd.agi + sd.int, false)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Setting globals
set Tim = CreateTimer()
set Total = 0
set target = Location(0, 0)
//Preload
call AbilityPreload(SPELL_ID)
endfunction
endscope
//TESH.scrollpos=24
//TESH.alwaysfold=0
scope Apparitions initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A099' //Spell Miraging Apparitions rawcode
private constant integer DUMMY_ID = 'n01W' //Dummy rawcode
private constant integer DUMMY1_ID = 'n01X' //Dummy Hero rawcode
private constant string SPELL_EFFECT = "" //Move effect
private constant integer ITEM1_UPGRADE = 'I01X' //Item Oversurge
private constant integer UPGRADE1_MIRAGE = 2 //Upgrade 1 effect
endglobals
//Apparitions count
private function Mirage takes integer level returns integer
return 3 + (0 * level)
endfunction
//Move speed of dummy
private function Move_Speed takes integer level returns real
return 60.0 + (0.0 * level)
endfunction
//Distance maximum of dummy
private function Distance takes integer level returns real
if(level == 1) then
return 400.0
elseif(level == 2) then
return 600.0
elseif(level == 3) then
return 1000.0
else
return 0.0
endif
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Apparitions_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level
boolean s //Cast
real i //Interval
boolean a //Cast jump
real f //Caster facing
real rf //Random facing
real cX //Caster x
real cY //Caster y
integer c //Count mirage
real ms //Move speed
real d //Distance
real dm //Distance max
real x //Target x
real y //Target y
unit array dum1[11] //Dummy mirage
unit array dum2[11] //Dummy hero
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Apparitions_Data array Ar[100]
private location target
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Apparitions_Data sd
local integer i = 0
local integer j = 0
local real x = 0.0
local real y = 0.0
local real rad = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(not sd.s) then
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set j = 0
loop
exitwhen(j >= sd.c)
call RemoveUnit(sd.dum2[j])
set sd.dum2[j] = null
set j = j + 1
endloop
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
elseif(not sd.a) then
if(sd.i > 0) then
set sd.i = sd.i - Interval()
/*set rad = bj_DEGTORAD * sd.rf
set x = GetUnitX(sd.u) + sd.ms * Cos(rad)
set y = GetUnitY(sd.u) + sd.ms * Sin(rad)
call SetUnitX(sd.u, x)
call SetUnitY(sd.u, y)*/
else
set sd.a = true
set sd.cX = GetUnitX(sd.u)
set sd.cY = GetUnitY(sd.u)
set sd.ms = Move_Speed(sd.l)
//call ShowUnit(sd.u, false)
call PauseUnit(sd.u, true)
call SetUnitInvulnerable(sd.u, true)
call SetUnitVertexColor(sd.u, 255, 255, 255, 0)
call AddSpecialEffectTarget(SPELL_EFFECT, sd.u, "origin")
set j = 0
loop
exitwhen(j >= sd.c)
set sd.dum1[j] = CreateUnit(sd.o, DUMMY_ID, sd.cX, sd.cY, sd.f+j*(360/sd.c))
set j = j + 1
endloop
set j = 0
loop
exitwhen(j >= sd.c)
call RemoveUnit(sd.dum2[j])
set sd.dum2[j] = null
set j = j + 1
endloop
endif
else
if(sd.d < sd.dm) then
set j = 0
loop
exitwhen(j >= sd.c)
set rad = bj_DEGTORAD * GetUnitFacing(sd.dum1[j])
set x = GetUnitX(sd.dum1[j]) + sd.ms * Cos(rad)
set y = GetUnitY(sd.dum1[j]) + sd.ms * Sin(rad)
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0)) and (not IsBarrel(sd.dum1[j], x, y, 100.0))) then
call SetUnitX(sd.dum1[j], x)
call SetUnitY(sd.dum1[j], y)
endif
set j = j + 1
endloop
set sd.d = sd.d + sd.ms
else
//call ShowUnit(sd.u, true)
//if (GetLocalPlayer() == sd.o) then
//call SelectUnit(sd.u, true)
//endif
call PauseUnit(sd.u, false)
call SetUnitInvulnerable(sd.u, false)
call SetUnitVertexColor(sd.u, 255, 255, 255, 255)
call Pather(sd.u, 1.0)
set rad = bj_DEGTORAD * sd.f
set x = GetUnitX(sd.dum1[0])
set y = GetUnitY(sd.dum1[0])
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0)) and (not IsBarrel(sd.u, x, y, 100.0))) then
call SetUnitX(sd.u, x)
call SetUnitY(sd.u, y)
endif
set j = 0
loop
exitwhen(j >= sd.c)
//call UnitApplyTimedLife(sd.dum1[j], 'BTLF', 1.0)
set x = GetUnitX(sd.dum1[j])
set y = GetUnitY(sd.dum1[j])
call AddSpecialEffect(SPELL_EFFECT, x, y)
call KillUnit(sd.dum1[j])
set sd.dum1[j] = null
set j = j + 1
endloop
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Apparitions_Data sd
local unit caster = GetTriggerUnit()
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(caster == sd.u) then
set sd.s = true
set sd.i = 0.0
set i = Total
endif
set i = i + 1
endloop
set caster = null
endfunction
//----------------------------------------------------------------
private function Cast_Actions takes nothing returns nothing
local Apparitions_Data sd = Apparitions_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local real face = GetUnitFacing(caster)
local real rad = 0.0
local real x = 0.0
local real y = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local integer i = 0
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
set target = GetSpellTargetLoc()
set sd.u = caster
set sd.o = GetOwningPlayer(caster)
set sd.l = level
set sd.s = false
set sd.i = 0.5
set sd.a = false
set sd.cX = casterX
set sd.cY = casterY
set sd.c = Mirage(level)
if(item1 > 0) then
set sd.c = sd.c + UPGRADE1_MIRAGE
endif
set sd.ms = GetUnitMoveSpeed(caster)/10
set sd.d = 0
set sd.dm = Distance(level)
set sd.x = GetLocationX(target)
set sd.y = GetLocationY(target)
set sd.rf = sd.f+(i+1)*(360/sd.c)
set sd.f = Atan2(sd.y - casterY, sd.x - casterX) * bj_RADTODEG
set dx = sd.cX - sd.x
set dy = sd.cY - sd.y
set distance = SquareRoot(dx * dx + dy * dy)
if(distance < sd.dm) then
set sd.dm = distance
endif
//call PauseUnit(caster, true)
//call SetUnitAnimation(caster, "walk")
set rad = bj_DEGTORAD * sd.rf
set x = casterX + 10.0 * Cos(rad)
set y = casterY + 10.0 * Sin(rad)
//call IssuePointOrder(sd.u, "move", x, y)
set i = 0
loop
exitwhen(i >= sd.c)
set sd.dum2[i] = CreateUnit(sd.o, DUMMY1_ID, sd.cX, sd.cY, sd.f+(i+1)*(360/sd.c))
set rad = bj_DEGTORAD * GetUnitFacing(sd.dum2[i])
call UnitAddAbility(sd.dum2[i], 'Arav')
call UnitRemoveAbility(sd.dum2[i], 'Arav')
call SetUnitPathing(sd.dum2[i], false)
call SetUnitX(sd.dum2[i], sd.cX)
call SetUnitY(sd.dum2[i], sd.cY)
set x = GetUnitX(sd.dum2[i]) + 10.0 * Cos(rad)
set y = GetUnitY(sd.dum2[i]) + 10.0 * Sin(rad)
call IssuePointOrder(sd.dum2[i], "move", x, y)
set i = i + 1
endloop
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(ApparitionsTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(ApparitionsTrg, Condition(function Conditions))
call TriggerAddAction(ApparitionsTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(ApparitionsCastTrg, EVENT_PLAYER_UNIT_SPELL_CAST)
call TriggerAddCondition(ApparitionsCastTrg, Condition(function Conditions))
call TriggerAddAction(ApparitionsCastTrg, function Cast_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set target = Location(0, 0)
//Preload
call AbilityPreload(SPELL_ID)
endfunction
endscope
//TESH.scrollpos=32
//TESH.alwaysfold=0
scope Ghostring initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A09D' //Spell Ghostring rawcode
private constant integer CAST_ID = 'ANsi' //Spell Ghostring (Dummy) rawcode
private constant integer BUFF_ID = 'BNsi' //Buff Ghostring (Dummy) rawcode
private constant integer ITEM1_UPGRADE = 'I00D' //Item Assassin Hood
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_NORMAL //Spell attack type
private constant string SPELL_EFFECT = "war3mapImported\\PurpleZigguratMissile.mdx"
private constant string SPECIAL_EFFECT = "Abilities\\Weapons\\AvengerMissile\\AvengerMissile.mdl"
endglobals
//Distance
private function Distance takes integer level returns real
return 900.0 - (200.0 * level)
endfunction
//Radius
private function Radius takes integer level returns real
return 300.0 + (0.0 * level)
endfunction
//Max damage
private function Max_Damage takes integer level returns real
if(level == 1) then
return 200.0
elseif(level == 2) then
return 300.0
elseif(level == 3) then
return 400.0
else
return 0.0
endif
endfunction
//Damage hit
private function Damage takes integer level returns real
if(level == 1) then
return 15.0
elseif(level == 2) then
return 30.0
elseif(level == 3) then
return 60.0
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Ghostring_Data
unit u //Unit caster
integer uID //Caster id
player o //Owner of caster
integer l //Level of spell
integer m //Mode
real x //Caster x
real y //Caster y
real d //Distance
real ds //Distance summon
real t //Duration
real r //Radius
real dd //Damage
real dm //Max damage
effect e1 //Effect
effect e2 //Effect
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Ghostring_Data array Ar[10]
private group ghost
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Ghostring_Data sd
local integer i = 0
local real cX = 0.0
local real cY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local unit f = null
local boolean exist = false
local string sfx = ""
local integer item1 = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(not IsUnitDead(sd.u)) then
if(GetUnitAbilityLevel(sd.u, SPELL_ID) > 0) then
if(sd.m == 0) then
set cX = GetUnitX(sd.u)
set cY = GetUnitY(sd.u)
if(cX != sd.x or cY != sd.y) then
set dx = cX - sd.x
set dy = cY - sd.y
set distance = SquareRoot(dx * dx + dy * dy)
set sd.d = sd.d + distance
if(sd.d > sd.ds) then
set sd.d = 0.0
set sd.m = 1
set sd.dd = Damage(sd.l) + (Damage(sd.l) * LoadInteger(MagicDamage_Ht, sd.uID, 0) * 0.01)
set sd.dm = Max_Damage(sd.l) + (Max_Damage(sd.l) * LoadInteger(MagicDamage_Ht, sd.uID, 0) * 0.01)
set sfx = SPECIAL_EFFECT
if(IsPlayerAlly(GetLocalPlayer(), sd.o)) then
set sfx = SPELL_EFFECT
endif
set sd.e1 = AddSpecialEffectTarget(sfx, sd.u, "hand, left")
set sd.e2 = AddSpecialEffectTarget(sfx, sd.u, "hand, right")
endif
set sd.x = cX
set sd.y = cY
endif
else
if(sd.dm > 0) then
set sd.dm = sd.dm - Interval()
set cX = GetUnitX(sd.u)
set cY = GetUnitY(sd.u)
set item1 = IsUnitHasItemType(sd.u, ITEM1_UPGRADE)
set exist = false
call GroupEnumUnitsInRange(all, cX, cY, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
if(IsUnitType(f, UNIT_TYPE_HERO) and GetUnitAbilityLevel(f, BUFF_ID) <= 0) then
set exist = true
endif
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
set sd.dm = sd.dm - sd.dd
endif
endloop
if(exist) then
if(item1 > 0) then
call PointCast(sd.o, cX, cY, 1.0, CAST_ID, sd.l + 3, "silence", 0, cX, cY)
else
call PointCast(sd.o, cX, cY, 1.0, CAST_ID, sd.l, "silence", 0, cX, cY)
endif
endif
else
set sd.m = 0
if(sd.e1 != null) then
call DestroyEffect(sd.e1)
set sd.e1 = null
endif
if(sd.e2 != null) then
call DestroyEffect(sd.e2)
set sd.e2 = null
endif
endif
endif
else
set sd.m = 0
set sd.d = 0.0
if(sd.e1 != null) then
call DestroyEffect(sd.e1)
set sd.e1 = null
endif
if(sd.e2 != null) then
call DestroyEffect(sd.e2)
set sd.e2 = null
endif
endif
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
set sfx = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Ghostring_Data sd
local unit learner = GetTriggerUnit()
local integer learnerID = GetUnitUserData(learner)
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
local player owner = GetOwningPlayer(learner)
local integer i = 0
local boolean exist = false
if(level == 1) then
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set exist = true
set sd.l = level
set sd.ds = Distance(level)
set i = Total
endif
set i = i + 1
endloop
if(not exist) then
set sd = Ghostring_Data.create()
set sd.u = learner
set sd.uID = learnerID
set sd.o = owner
set sd.l = level
set sd.m = 0
set sd.x = GetUnitX(learner)
set sd.y = GetUnitY(learner)
set sd.d = 0.0
set sd.ds = Distance(level)
set sd.r = Radius(level)
set sd.dd = 0.0
set sd.dm = 0.0
set sd.e1 = null
set sd.e2 = null
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
else
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set sd.l = level
set sd.ds = Distance(level)
set i = Total
endif
set i = i + 1
endloop
endif
set learner = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit learner = GetTriggerUnit()
local boolean okey = (GetLearnedSkill() == SPELL_ID) and (not IsUnitIllusion(learner))
set learner = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(GhostringTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(GhostringTrg, Condition(function Conditions))
call TriggerAddAction(GhostringTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set ghost = CreateGroup()
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=27
//TESH.alwaysfold=0
globals
group Wraither = CreateGroup()
endglobals
scope Wraith initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A09A' //Spell Wraith rawcode
private constant integer DUMMY_ID = 'n01Y' //Dummy rawcode
private constant integer ABILITY_ID = 'A09F' //Ability Wraith Jump rawcode
private constant integer ABILITY1_ID = 'A05O' //Ability Vigorous Attack (Damage +1) rawcode
private constant integer ABILITY2_ID = 'A05P' //Ability Vigorous Attack (Damage +10) rawcode
private constant integer ABILITY3_ID = 'A05Q' //Ability Vigorous Attack (Damage +100) rawcode
private constant real INTERVAL_JUMP = 0.0 //Interval to jump
private constant integer ITEM1_UPGRADE = 'I019' //Item Skypath Strider
private constant integer ITEM2_UPGRADE = 'I01W' //Item Ghost Veil
private constant real UPGRADE1_DISTANCE_MOVE = 10.0 //Distance move upgrade
private constant real UPGRADE1_MAX_DISTANCE_MOVE = 120.0 //Max distance move upgrade
private constant integer UPGRADE2_COUNT = 5 //Upgrade 2 more jump
private constant string SPELL_EFFECT = "Abilities\\Spells\\Other\\Drain\\ManaDrainCaster.mdl" //Spell effect
private constant string UPGRADE_EFFECT = "Abilities\\Weapons\\AvengerMissile\\AvengerMissile.mdl" //Upgrade effect
endglobals
//Damage multiply
private function Damage takes integer level returns real
return 0.0 + (0.5 * level)
endfunction
//Count attack
private function Count takes integer level returns integer
return 10 + (0 * level)
endfunction
//Max distance travel
private function Distance takes integer level returns real
return 600.0 + (0.0 * level)
endfunction
//Starting distance before jump
private function Distance_Start takes integer level returns real
return 0.0 + (150.0 * level)
endfunction
//Change distance
private function Distance_Change takes integer level returns real
return 0.0 + (150.0 * level)
endfunction
//Distance move
private function Distance_Move takes integer level returns real
return 60.0 + (0.0 * level)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.04
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Wraith_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level
unit g //Target
integer t //Count
integer m //Mode
real d //Distance
real cos //Cos of angle
real sin //Sin of angle
real c //Change distance
real md //Max distance
real dm //Distance move
unit dum //Dummy
real i //Interval
real im //Interval max
real dd //Multiply damage
integer it1 //Item 1 upgrade
integer it2 //Item 2 upgrade
effect e //Effect upgrade
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Wraith_Data array Ar[10]
private group copy
private location loc
endglobals
//----------------------------------------------------------------
private function Register_Jump takes unit caster returns nothing
local real rad = GetUnitFacing(caster) * bj_DEGTORAD
local player owner = GetOwningPlayer(caster)
local Wraith_Data sd
local integer i = 0
local real cX = 0.0
local real cY = 0.0
local real targetX = 0.0
local real targetY = 0.0
local real angle = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(caster == sd.u) then
set sd.m = 1
if(sd.g != null) then
if(IsUnitDead(sd.g)) then
set targetX = GetUnitX(sd.u) + sd.d * Cos(rad)
set targetY = GetUnitY(sd.u) + sd.d * Sin(rad)
else
set rad = Atan2(GetUnitY(sd.g) - GetUnitY(sd.u), GetUnitX(sd.g) - GetUnitX(sd.u))
set targetX = GetUnitX(sd.u) + sd.d * Cos(rad)
set targetY = GetUnitY(sd.u) + sd.d * Sin(rad)
endif
else
set targetX = GetUnitX(sd.u) + sd.d * Cos(rad)
set targetY = GetUnitY(sd.u) + sd.d * Sin(rad)
endif
call SetUnitInvulnerable(sd.u, true)
call GroupAddUnit(Wraither, sd.u)
call SetUnitVertexColor(sd.u, 255, 255, 255, 0)
set cX = GetUnitX(sd.u)
set cY = GetUnitY(sd.u)
set angle = Atan2(targetY - cY, targetX - cX)
set sd.cos = Cos(angle)
set sd.sin = Sin(angle)
set dx = cX - targetX
set dy = cY - targetY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance < sd.d) then
set sd.d = distance
endif
call SetUnitX(sd.dum, cX)
call SetUnitY(sd.dum, cY)
call SetUnitFacing(sd.dum, angle * bj_RADTODEG)
call SetUnitAnimation(sd.dum, "stand")
set i = Total
endif
set i = i + 1
endloop
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Wraith_Data sd
local integer i = 0
local real x = 0.0
local real y = 0.0
local real cX = 0.0
local real cY = 0.0
local real tX = 0.0
local real tY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local integer damage = 0
local integer lvl = 0
local integer number = 0
local string text = ""
local real rad = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(IsUnitDead(sd.u)) then
set sd.t = 0
endif
if(sd.t > 0) then
set damage = R2I(GetHeroAgi(sd.u, true) * sd.dd)
set lvl = damage / 100
call SetUnitAbilityLevel(sd.u, ABILITY3_ID, lvl+1)
set damage = ModuloInteger(damage, 100)
set lvl = damage / 10
call SetUnitAbilityLevel(sd.u, ABILITY2_ID, lvl+1)
set damage = ModuloInteger(damage, 10)
set lvl = damage / 1
call SetUnitAbilityLevel(sd.u, ABILITY1_ID, lvl+1)
if(sd.m == 1) then
if(sd.d > 0.0) then
set sd.d = sd.d - sd.dm
set x = GetUnitX(sd.dum) + sd.dm * sd.cos
set y = GetUnitY(sd.dum) + sd.dm * sd.sin
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
call SetUnitX(sd.dum, x)
call SetUnitY(sd.dum, y)
call SetUnitX(sd.u, x)
call SetUnitY(sd.u, y)
endif
else
set sd.d = 300.0
set sd.m = 0
set sd.t = sd.t - 1
call GroupRemoveUnit(Wraither, sd.u)
call SetUnitInvulnerable(sd.u, false)
call SetUnitVertexColor(sd.u, 255, 255, 255, 255)
call SetUnitAnimation(sd.dum, "death")
set text = ""
set number = sd.t
if(GetLocalPlayer() == sd.o) then
set text = I2S(number)
endif
call TextTag_AttachUnit(text, 10.0 * 0.023 / 10.0, sd.u, 30.0, /*
*/R2I(100.0 * 255.0 * 0.01), R2I(0.0 * 255.0 * 0.01), R2I(100.0 * 255.0 * 0.01), R2I(100.0 * 255.0 * 0.01), /*
*/50.0 * 0.071 / 128.0 * Cos(90.0 * bj_DEGTORAD), 50.0 * 0.071 / 128.0 * Sin(90.0 * bj_DEGTORAD), /*
*/false, 5.00, 1.75)
endif
else
call SetUnitX(sd.dum, GetUnitX(sd.u))
call SetUnitY(sd.dum, GetUnitY(sd.u))
if(sd.m == 2) then
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
call Register_Jump(sd.u)
endif
endif
endif
else
if(sd.m == 1) then
call GroupRemoveUnit(Wraither, sd.u)
call SetUnitInvulnerable(sd.u, false)
call SetUnitVertexColor(sd.u, 255, 255, 255, 255)
call RemoveUnit(sd.dum)
elseif(sd.m == 0) then
call RemoveUnit(sd.dum)
elseif(sd.m == 2) then
call SetUnitVertexColor(sd.u, 255, 255, 255, 255)
endif
call SetUnitAbilityLevel(sd.u, ABILITY1_ID, 1)
call SetUnitAbilityLevel(sd.u, ABILITY2_ID, 1)
call SetUnitAbilityLevel(sd.u, ABILITY3_ID, 1)
call UnitRemoveAbility(sd.u, ABILITY_ID)
call SetPlayerAbilityAvailable(sd.o, SPELL_ID, true)
call Pather(sd.u, 1.0)
if(sd.e != null) then
call DestroyEffect(sd.e)
set sd.e = null
endif
set sd.u = null
set sd.o = null
set sd.g = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set text = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Wraith_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local real facing = GetUnitFacing(caster)
local player owner = GetOwningPlayer(caster)
local integer i = 0
local boolean exist = false
local integer number = 0
local string text = ""
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
local integer item2 = IsUnitHasItemType(caster, ITEM2_UPGRADE)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_BA_Wraith
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set exist = true
set sd.l = level
set sd.t = Count(level)
set sd.c = Distance_Change(level)
set sd.md = Distance(level)
set sd.dm = Distance_Move(level)
set sd.dd = Damage(level)
set sd.it1 = item1
set sd.it2 = item2
if(item1 > 0 or item2 > 0) then
if(sd.e == null) then
set sd.e = AddSpecialEffectTarget(UPGRADE_EFFECT, caster, "origin")
endif
endif
if(item2 > 0) then
set sd.t = sd.t + UPGRADE2_COUNT
endif
endif
set i = i + 1
endloop
if(not exist) then
set sd = Wraith_Data.create()
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.g = null
set sd.t = Count(level)
set sd.m = 0
set sd.d = Distance_Start(level)
set sd.cos = 0.0
set sd.sin = 0.0
set sd.c = Distance_Change(level)
set sd.md = Distance(level)
set sd.dm = Distance_Move(level)
set sd.dum = CreateUnit(sd.o, DUMMY_ID, casterX, casterY, facing)
set sd.i = 0.0
set sd.im = INTERVAL_JUMP
set sd.dd = Damage(level)
set sd.it1 = item1
set sd.it2 = item2
set sd.e = null
if(item1 > 0 or item2 > 0) then
set sd.e = AddSpecialEffectTarget(UPGRADE_EFFECT, caster, "weapon")
endif
if(item2 > 0) then
set sd.t = sd.t + UPGRADE2_COUNT
endif
set text = ""
set number = sd.t
if(GetLocalPlayer() == owner) then
set text = I2S(number)
endif
call TextTag_AttachUnit(text, 10.0 * 0.023 / 10.0, caster, 30.0, /*
*/R2I(100.0 * 255.0 * 0.01), R2I(0.0 * 255.0 * 0.01), R2I(100.0 * 255.0 * 0.01), R2I(100.0 * 255.0 * 0.01), /*
*/50.0 * 0.071 / 128.0 * Cos(90.0 * bj_DEGTORAD), 50.0 * 0.071 / 128.0 * Sin(90.0 * bj_DEGTORAD), /*
*/false, 5.00, 1.75)
call UnitAddAbility(caster, ABILITY_ID)
call SetPlayerAbilityAvailable(owner, SPELL_ID, false)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
set caster = null
set owner = null
set text = null
set s = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Attack_Actions takes nothing returns nothing
local unit attacker = GetAttacker()
local unit attacked = GetTriggerUnit()
local Wraith_Data sd
local integer i = 0
local real face = 0.0
local real cX = 0.0
local real cY = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(attacker == sd.u) then
set sd.g = attacked
if(sd.it1 <= 0) then
if(sd.m == 0) then
if(sd.d < sd.md) then
set sd.d = sd.d + sd.c
else
set sd.m = 2
set sd.i = sd.im
call SetUnitVertexColor(sd.u, 100, 100, 100, 255)
endif
endif
else
if(sd.d < sd.md) then
set sd.d = sd.d + sd.c
else
set sd.m = 2
set sd.i = sd.im
if(sd.dm < UPGRADE1_MAX_DISTANCE_MOVE) then
set sd.dm = sd.dm + UPGRADE1_DISTANCE_MOVE
endif
call SetUnitVertexColor(sd.u, 100, 100, 100, 255)
endif
endif
set i = Total
endif
set i = i + 1
endloop
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Attack_Conditions takes nothing returns boolean
local unit attacker = GetAttacker()
local boolean okey = GetUnitAbilityLevel(attacker, ABILITY_ID) > 0
set attacker = null
return okey
endfunction
//----------------------------------------------------------------
private function Jump_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local player owner = GetOwningPlayer(caster)
local Wraith_Data sd
local integer i = 0
local real cX = 0.0
local real cY = 0.0
local real targetX = 0.0
local real targetY = 0.0
local real angle = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(caster == sd.u) then
set sd.m = 1
set sd.dm = Distance_Move(sd.l)
call SetUnitInvulnerable(sd.u, true)
call GroupAddUnit(Wraither, sd.u)
call SetUnitVertexColor(sd.u, 255, 255, 255, 0)
call UnitRemoveAbility(sd.u, 'Abun')
call IssueImmediateOrder(sd.u, "stop")
set cX = GetUnitX(sd.u)
set cY = GetUnitY(sd.u)
set angle = Atan2(targetY - cY, targetX - cX)
set sd.cos = Cos(angle)
set sd.sin = Sin(angle)
set dx = cX - targetX
set dy = cY - targetY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance < sd.d) then
set sd.d = distance
endif
call SetUnitX(sd.dum, cX)
call SetUnitY(sd.dum, cY)
call SetUnitFacing(sd.dum, angle * bj_RADTODEG)
call SetUnitAnimation(sd.dum, "stand")
set i = Total
endif
set i = i + 1
endloop
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Jump_Conditions takes nothing returns boolean
return GetSpellAbilityId() == ABILITY_ID
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local unit learner = GetLearningUnit()
call UnitAddAbility(learner, ABILITY1_ID)
call UnitAddAbility(learner, ABILITY2_ID)
call UnitAddAbility(learner, ABILITY3_ID)
call UnitMakeAbilityPermanent(learner, true, ABILITY1_ID)
call UnitMakeAbilityPermanent(learner, true, ABILITY2_ID)
call UnitMakeAbilityPermanent(learner, true, ABILITY3_ID)
set learner = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
return(GetLearnedSkill() == SPELL_ID) and (not IsUnitIllusion(GetTriggerUnit()))
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(WraithTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(WraithTrg, Condition(function Conditions))
call TriggerAddAction(WraithTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(WraithAttackTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(WraithAttackTrg, Condition(function Attack_Conditions))
call TriggerAddAction(WraithAttackTrg, function Attack_Actions)
call TriggerRegisterAnyUnitEventBJ(WraithJumpTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(WraithJumpTrg, Condition(function Jump_Conditions))
call TriggerAddAction(WraithJumpTrg, function Jump_Actions)
call TriggerRegisterAnyUnitEventBJ(WraithLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(WraithLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(WraithLearnTrg, function Learn_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set loc = Location(0.0, 0.0)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY_ID)
call AbilityPreload(ABILITY1_ID)
call AbilityPreload(ABILITY2_ID)
call AbilityPreload(ABILITY3_ID)
call Preload(SPELL_EFFECT)
call Preload(UPGRADE_EFFECT)
endfunction
endscope
//TESH.scrollpos=118
//TESH.alwaysfold=0
scope Gush initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A09I' //Spell Gush rawcode
private constant integer ITEM1_UPGRADE = 'rde1' //Item Barrel Buckler
private constant real UPGRADE1_RADIUS = 50.0 //Upgrade 1 effect
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_NORMAL //Spell attack type
private constant string SPELL_EFFECT = "Abilities\\Spells\\Human\\FlakCannons\\FlakTarget.mdl" //Knock effect
endglobals
//Distance move
private function Distance_Move takes integer level returns real
return 40.0 + (0.0 * level)
endfunction
//Distance move per movespeed
private function Distance_Movespeed takes integer level returns real
if(level == 1) then
return 10.0
elseif(level == 2) then
return 10.0
elseif(level == 3) then
return 10.0
elseif(level == 4) then
return 10.0
else
return 0.0
endif
endfunction
//Radius contact
private function Radius takes integer level returns real
return 100.0 + (0.0 * level)
endfunction
//Damage contact with other unit
private function Damage takes integer level returns real
if(level == 1) then
return 20.0
elseif(level == 2) then
return 30.0
elseif(level == 3) then
return 40.0
elseif(level == 4) then
return 50.0
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Gush_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of ability
unit t //Unit target
boolean c //Cast
real d //Distance move
boolean a //Ally
real r //Radius
real dd //Damage
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Gush_Data array Ar[10]
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Gush_Data sd
local integer i = 0
local real x = 0.0
local real y = 0.0
local real rad = 0.0
local real tX = 0.0
local real tY = 0.0
local unit f = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.c and (not IsUnitType(sd.t, UNIT_TYPE_MAGIC_IMMUNE))) then
set x = GetUnitX(sd.t)
set y = GetUnitY(sd.t)
set rad = GetUnitFacing(sd.t) * bj_DEGTORAD
set tX = x + sd.d * Cos(rad)
set tY = y + sd.d * Sin(rad)
if(tX > WorldBounds.minX + 300.0 and /*
*/tX < WorldBounds.maxX - 300.0 and /*
*/tY > WorldBounds.minY + 300.0 and /*
*/tY < WorldBounds.maxY - 300.0 and (not IsWall(tX, tY, 100.0)) and (not IsBarrel(sd.t, tX, tY, 100.0))) then
call SetUnitX(sd.t, tX)
call SetUnitY(sd.t, tY)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.t, "chest"))
endif
if(IsUnitDead(sd.t)) then
call SetUnitFacing(sd.t, bj_RADTODEG * Atan2(GetUnitY(sd.u) - y, GetUnitX(sd.u) - x))
endif
call GroupEnumUnitsInRange(all, tX, tY, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(sd.t != f) then
if(not sd.a) then
if(IsUnitType(sd.t, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, sd.t, sd.dd, true, true, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, sd.t, sd.dd, true, true, A_TYPE, D_TYPE, null)
endif
endif
if(IsUnitEnemy(f, sd.o) and /*
*/(not IsUnitType(f, UNIT_TYPE_MAGIC_IMMUNE))) then
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, true, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.dd, true, true, A_TYPE, D_TYPE, null)
endif
endif
endif
endloop
else
call Pather(sd.t, 1.0)
if(IsUnitEnemy(sd.t, sd.o)) then
call UnitShareVision(sd.t, sd.o, false)
endif
set sd.u = null
set sd.o = null
set sd.t = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Gush_Data sd = Gush_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local unit target = GetSpellTargetUnit()
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.t = target
set sd.c = true
set sd.d = GetUnitMoveSpeed(sd.t) / Distance_Movespeed(level) //Distance_Move(level)
set sd.a = IsUnitAlly(sd.t, owner)
set sd.r = Radius(level)
set sd.dd = Damage(level) + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
if(not sd.a) then
call UnitShareVision(sd.t, sd.o, true)
endif
if(item1 > 0) then
set sd.r = sd.r + UPGRADE1_RADIUS
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
set target = null
endfunction
//----------------------------------------------------------------
private function Stop_Actions takes nothing returns nothing
local Gush_Data sd
local integer i = 0
local unit caster = GetTriggerUnit()
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set sd.c = false
endif
set i = i + 1
endloop
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(GushTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(GushTrg, Condition(function Conditions))
call TriggerAddAction(GushTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(GushStopTrg, EVENT_PLAYER_UNIT_SPELL_ENDCAST)
call TriggerAddCondition(GushStopTrg, Condition(function Conditions))
call TriggerAddAction(GushStopTrg, function Stop_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=20
//TESH.alwaysfold=0
scope Circlingblow initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A09K' //Spell Circlingblow rawcode
private constant integer BUFF_ID = 'B02S' //Buff Circlingblow rawcode
private constant integer DUMMY_ID = 'n022' //Dummy Circlingblow rawcode
private constant integer ITEM1_UPGRADE = 'I001' //Item Walking Slippers
private constant real UPGRADE1_TIME_REMAIN = 5.0 //Upgrade 1 effect
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_NORMAL //Spell attack type
endglobals
//Time remain
private function Time_Remain takes integer level returns real
return 15.0 + (0.0 * level)
endfunction
//Radius of wave damage
private function Radius takes integer level returns real
return 300.0 + (0.0 * level)
endfunction
//Damage max
private function Damage takes integer level returns real
if(level == 1) then
return 60.0
elseif(level == 2) then
return 80.0
elseif(level == 3) then
return 120.0
else
return 0.0
endif
endfunction
//Damage impact
private function Damage_Impact takes integer level returns real
if(level == 1) then
return 12.0
elseif(level == 2) then
return 24.0
elseif(level == 3) then
return 36.0
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Circlingblow_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level
unit t //Unit target
unit dum //Dummy
real m //Time remain
real x //X target
real y //Y target
real r //Radius damage
real di //Damage impact
real d //Damage max
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Circlingblow_Data array Ar[100]
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Circlingblow_Data sd
local integer i = 0
local unit f = null
local real x = 0.0
local real y = 0.0
local real rad = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.m > 0.0) then
set sd.m = sd.m - Interval()
if(IsUnitDead(sd.t)) then
set sd.m = 0.0
set x = sd.x
set y = sd.y
else
set x = GetUnitX(sd.t)
set y = GetUnitY(sd.t)
set sd.x = x
set sd.y = y
endif
call SetUnitX(sd.dum, x)
call SetUnitY(sd.dum, y)
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
if(f != sd.t) then
call UnitDamageTarget(sd.u, f, sd.di, true, true, A_TYPE, D_TYPE, null)
set sd.d = sd.d - sd.di
endif
endif
endloop
if(sd.d <= 0.0) then
set sd.m = 0.0
endif
else
call KillUnit(sd.dum)
if(sd.d > 0.0) then
call UnitDamageTarget(sd.u, sd.t, sd.d, true, true, A_TYPE, D_TYPE, null)
endif
set sd.u = null
set sd.o = null
set sd.t = null
set sd.dum = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
function Circlingblow_onDamage takes unit attacker, unit attacked, real amount returns nothing
local Circlingblow_Data sd = Circlingblow_Data.create()
local integer attackerID = GetUnitUserData(attacker)
local integer level = GetUnitAbilityLevel(attacker, SPELL_ID)
local player owner = GetOwningPlayer(attacker)
local real targetX = GetUnitX(attacked)
local real targetY = GetUnitY(attacked)
local integer item1 = IsUnitHasItemType(attacker, ITEM1_UPGRADE)
call UnitRemoveAbility(attacked, BUFF_ID)
set sd.u = attacker
set sd.o = owner
set sd.l = level
set sd.dum = CreateUnit(owner, DUMMY_ID, targetX, targetY, bj_UNIT_FACING)
set sd.t = attacked
set sd.m = Time_Remain(level)
set sd.x = targetX
set sd.y = targetY
set sd.r = Radius(level)
set sd.di = Damage_Impact(level)
set sd.d = Damage(level) + amount
call SetUnitVertexColor(sd.dum, 255, 255, 255, 0)
if(item1 > 0) then
set sd.m = sd.m + UPGRADE1_TIME_REMAIN
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set attacker = null
set owner = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
endfunction
endscope
//TESH.scrollpos=4
//TESH.alwaysfold=0
scope WindElude initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A09J' //Spell Wind Elude rawcode
private constant integer ABILITY_ID = 'A09M' //Ability Wind Elude (Hide Icon) rawcode
private constant integer ABILITY1_ID = 'Acdb' //Ability Wind Elude (Evasion) rawcode
private constant integer ITEM1_UPGRADE = 'I01U' //Item Coral Spire
private constant integer UPGRADE1_ATTACK_COUNT = 1 //Upgrade 1 effect
private constant string SPELL_EFFECT = "Abilities\\Spells\\Other\\Tornado\\Tornado_Target.mdl" //Spell effect
endglobals
//Duration evasion
private function Time_Remain takes integer level returns real
if(level == 1) then
return 1.0
elseif(level == 2) then
return 2.0
elseif(level == 3) then
return 4.0
else
return 0.0
endif
endfunction
//Attack count
private function Count takes integer level returns integer
return 8
endfunction
//Interval
private function Interval takes nothing returns real
return 0.5
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct WindElude_Data
unit u //Unit caster
integer c //Count attack
integer mc //Max count attack
boolean e //Evade
real t //Time remain
effect s //Effect
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private WindElude_Data array Ar[10]
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local WindElude_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t > 0.0) then
set sd.t = sd.t - Interval()
else
set sd.e = false
if(sd.s != null) then
call DestroyEffect(sd.s)
set sd.s = null
endif
call UnitRemoveAbility(sd.u, ABILITY_ID)
call SetUnitVertexColor(sd.u, 255, 255, 255, 255)
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit attacked = GetTriggerUnit()
local real attackedX = GetUnitX(attacked)
local real attackedY = GetUnitY(attacked)
local integer attackedType = GetUnitTypeId(attacked)
local integer attackedID = GetUnitUserData(attacked)
local integer level = GetUnitAbilityLevel(attacked, SPELL_ID)
local player owner = GetOwningPlayer(attacked)
local unit attacker = GetAttacker()
local WindElude_Data sd
local integer i = 0
local integer extra = 0
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == attacked) then
if(not sd.e) then
if(IsUnitHasItemType(attacked, ITEM1_UPGRADE) > 0) then
set extra = extra + UPGRADE1_ATTACK_COUNT
endif
if(sd.c < sd.mc - extra) then
set sd.c = sd.c + 1
set i = Total
else
set sd.c = 0
set sd.e = true
set sd.t = Time_Remain(level)
if(sd.s != null) then
call DestroyEffect(sd.s)
set sd.s = null
endif
set sd.s = AddSpecialEffectTarget(SPELL_EFFECT, sd.u, "chest")
call UnitAddAbility(sd.u, ABILITY_ID)
call SetUnitAbilityLevel(sd.u, ABILITY1_ID, level)
call SetUnitVertexColor(sd.u, 255, 255, 255, 150)
endif
endif
endif
set i = i + 1
endloop
set attacked = null
set owner = null
set attacker = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit attacked = GetTriggerUnit()
local boolean okey = GetUnitAbilityLevel(attacked, SPELL_ID) > 0
set attacked = null
return okey
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local unit learner = GetLearningUnit()
local integer learnerID = GetUnitUserData(learner)
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
local WindElude_Data sd
local integer i = 0
local boolean exist = false
if(level == 1) then
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set sd.mc = Count(level)
set exist = true
set i = Total
endif
set i = i + 1
endloop
if(not exist) then
set sd = WindElude_Data.create()
set sd.u = learner
set sd.c = 0
set sd.mc = Count(level)
set sd.e = false
set sd.t = 0.0
set sd.s = null
call SetPlayerAbilityAvailable(GetOwningPlayer(sd.u), ABILITY_ID, false)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
else
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set sd.mc = Count(level)
set i = Total
endif
set i = i + 1
endloop
endif
set learner = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
local unit learner = GetTriggerUnit()
local boolean okey = GetLearnedSkill() == SPELL_ID and (not IsUnitIllusion(learner))
set learner = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(WindEludeTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(WindEludeTrg, Condition(function Conditions))
call TriggerAddAction(WindEludeTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(WindEludeLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(WindEludeLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(WindEludeLearnTrg, function Learn_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY_ID)
call AbilityPreload(ABILITY1_ID)
endfunction
endscope
//TESH.scrollpos=28
//TESH.alwaysfold=0
scope Turbine initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A09L' //Spell Turbine rawcode
private constant integer DUMMY_ID = 'n023' //Dummy Turbine rawcode
private constant real DISTANCE_BETWEEN_BLADE = 50.0 //Distance from blades
private constant integer ITEM1_UPGRADE = 'I01I' //Item Cloak of Shadow
private constant real UPGRADE1_TIME_REMAIN = 5.0 //Upgrade 1 effect
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_NORMAL //Spell attack type
private constant string SPELL_EFFECT = "Abilities\\Spells\\Human\\FlakCannons\\FlakTarget.mdl" //Knock effect
endglobals
//Time duration
private function Time_Remain takes integer level returns real
return 10.0 + (0.0 * level)
endfunction
//Fan spawn
private function Fan takes integer level returns integer
if(level == 1) then
return 3
elseif(level == 2) then
return 4
elseif(level == 3) then
return 5
else
return 0
endif
endfunction
//Fan length spawn
private function Fan_Length takes integer level returns integer
return 10
endfunction
//Distance move
private function Angle_Move takes integer level returns real
return 10.0 + (0.0 * level)
endfunction
//Radius contact
private function Radius takes integer level returns real
return 100.0 + (0.0 * level)
endfunction
//Damage contact
private function Damage takes integer level returns real
if(level == 1) then
return 5.0
elseif(level == 2) then
return 10.0
elseif(level == 3) then
return 20.0
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Turbine_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of ability
unit array dum[50] //Dummy unit
real t //Time remain
integer s //Size
real am //Angle move
integer f //Fan
integer g //Fan length
real r //Radius
real dd //Damage
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Turbine_Data array Ar[10]
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Turbine_Data sd
local integer i = 0
local integer j = 0
local integer k = 0
local real face = 0.0
local real angleDiff = 0.0
local real rad = 0.0
local real distance = 0.0
local real cX = 0.0
local real cY = 0.0
local real x = 0.0
local real y = 0.0
local unit f = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t > 0.0) then
set sd.t = sd.t - Interval()
set sd.am = sd.am + Angle_Move(sd.l)
set face = GetUnitFacing(sd.u)
set cX = GetUnitX(sd.u)
set cY = GetUnitY(sd.u)
set angleDiff = 360.0 / sd.f
set j = 0
loop
exitwhen(j >= sd.f)
set distance = 0.0
set k = 0
loop
exitwhen(k >= sd.g)
set distance = distance + DISTANCE_BETWEEN_BLADE
set rad = (face + sd.am + angleDiff * k) * bj_DEGTORAD
set x = cX + distance * Cos(rad)
set y = cY + distance * Sin(rad)
call SetUnitX(sd.dum[j*sd.g+k], x)
call SetUnitY(sd.dum[j*sd.g+k], y)
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, true, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.dd, true, true, A_TYPE, D_TYPE, null)
endif
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, f, "chest"))
endif
endloop
set k = k + 1
endloop
set j = j + 1
endloop
else
set j = 0
loop
exitwhen(j >= sd.s)
call KillUnit(sd.dum[j])
set sd.dum[j] = null
set j = j + 1
endloop
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Turbine_Data sd = Turbine_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local real face = GetUnitFacing(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local integer fan = Fan(level)
local integer length = Fan_Length(level)
local integer i = 0
local integer j = 0
local real angleDiff = 360.0 / fan
local real rad = 0.0
local real distance = 0.0
local real x = 0.0
local real y = 0.0
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.t = Time_Remain(level)
set sd.s = 0
set sd.am = Angle_Move(level)
set sd.f = fan
set sd.g = length
set sd.r = Radius(level)
set sd.dd = Damage(level) + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set i = 0
loop
exitwhen(i >= fan)
set distance = 0.0
set j = 0
loop
exitwhen(j >= length)
set sd.s = sd.s + 1
set distance = distance + DISTANCE_BETWEEN_BLADE
set rad = (face + angleDiff * j) * bj_DEGTORAD
set x = casterX + distance * Cos(rad)
set y = casterY + distance * Sin(rad)
set sd.dum[i*length+j] = CreateUnit(owner, DUMMY_ID, x, y, bj_UNIT_FACING)
set j = j + 1
endloop
set i = i + 1
endloop
if(item1 > 0) then
set sd.t = sd.t + UPGRADE1_TIME_REMAIN
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(TurbineTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(TurbineTrg, Condition(function Conditions))
call TriggerAddAction(TurbineTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=29
//TESH.alwaysfold=0
scope ColossalCyclone initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A09G' //Spell Colossal Cyclone rawcode
private constant integer DUMMY_ID = 'n020' //Dummy Colossal Cyclone rawcode
private constant integer BUFF_ID = 'Btsp' //Buff Tornado Spin rawcode
private constant real INTERVAL_DAMAGE = 1.0 //Interval damage targets
private constant integer ITEM1_UPGRADE = 'I028' //Item Stormanifer
private constant integer ITEM2_UPGRADE = 'I019' //Item Skypath Strider
private constant real UPGRADE1_KNOCKBACK_DISTANCE = 300.0 //Upgrade item 1 distance knock
private constant real UPGRADE1_KNOCKBACK_DURATION = 1.0 //Upgrade item 1 duration knock
private constant real UPGRADE1_DAMAGE = 300.0 //Upgrade item 1 damage
private constant real UPGRADE2_RADIUS_PULL = 1200.0 //Upgrade item 2 radius pull
private constant real UPGRADE2_DISTANCE_PULL = 5.0 //Upgrade item 2 pull distance
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_NORMAL //Spell attack type
private constant string SPELL_EFFECT = "Objects\\Spawnmodels\\NightElf\\EntBirthTarget\\EntBirthTarget.mdl" //Death effect
endglobals
//Cyclone duration
private function Time_Remain takes integer level returns real
return 30.0 + (0.0 * level)
endfunction
//Distance pull
private function Distance_Pull takes integer level returns real
return 0.0 + (5.0 * level)
endfunction
//Radius pull target
private function Radius_Pull takes integer level returns real
return 800.0 + (0.0 * level)
endfunction
//Radius damage
private function Radius takes integer level returns real
return 400.0 + (0.0 * level)
endfunction
//Damage to target every second
private function Damage takes integer level returns real
return 0.0 + (40.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Unit affected
private function Targets_Spin takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, BUFF_ID) > 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct ColossalCyclone_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of ability
unit dum //Dummy cyclone
real t //Time remain
real dp //Distance pull
real r //Radius pull
real i //Interval
real im //Interval max
real dr //Damage radius
real dd //Damage
integer it1 //Item 1 upgrade
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private ColossalCyclone_Data array Ar[10]
private group all
private boolexpr bexpr
private boolexpr bexprSpin
private location loc
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Pick_Spin takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets_Spin(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local ColossalCyclone_Data sd
local integer i = 0
local real x = 0.0
local real y = 0.0
local unit f = null
local real fX = 0.0
local real fY = 0.0
local real angle = 0.0
local real tX = 0.0
local real tY = 0.0
local real life = 0.0
local real amount = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t > 0.0) then
set sd.t = sd.t - Interval()
//call SetUnitFacing(sd.dum, GetUnitFacing(sd.u))
set x = GetUnitX(sd.dum)
set y = GetUnitY(sd.dum)
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set angle = Atan2(y - fY, x - fX)
set dx = x - fX
set dy = y - fY
set distance = SquareRoot(dx * dx + dy * dy)
set tX = fX + sd.dp * Cos(angle)
set tY = fY + sd.dp * Sin(angle)
if(distance > 100.0) then
call SetUnitX(f, tX)
call SetUnitY(f, tY)
endif
endif
endloop
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
call GroupEnumUnitsInRange(all, x, y, sd.r, bexprSpin)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
set life = GetUnitState(f, UNIT_STATE_LIFE)
set amount = RMinBJ(life - 1, sd.dd)
call SetUnitState(f, UNIT_STATE_LIFE, life - amount)
endif
endloop
call GroupEnumUnitsInRange(all, x, y, sd.r, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, true, A_TYPE, D_TYPE, null)
endif
endloop
endif
else
call KillUnit(sd.dum)
if(sd.it1 > 0) then
call GroupEnumUnitsInRange(all, x, y, sd.dr, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set angle = Atan2(fY - y, fX - x) * bj_RADTODEG
call Knockback(f, UPGRADE1_KNOCKBACK_DISTANCE, angle, UPGRADE1_KNOCKBACK_DURATION)
call UnitDamageTarget(sd.u, f, UPGRADE1_DAMAGE, true, true, A_TYPE, D_TYPE, null)
endif
endloop
call GroupEnumUnitsInRange(all, x, y, sd.r, bexprSpin)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set angle = Atan2(fY - y, fX - x) * bj_RADTODEG
set life = GetUnitState(f, UNIT_STATE_LIFE)
set amount = RMinBJ(life - 1, UPGRADE1_DAMAGE)
call SetUnitState(f, UNIT_STATE_LIFE, life - amount)
call Knockback(f, UPGRADE1_KNOCKBACK_DISTANCE, angle, UPGRADE1_KNOCKBACK_DURATION)
endif
endloop
endif
set sd.u = null
set sd.o = null
set sd.dum = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local ColossalCyclone_Data sd = ColossalCyclone_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real face = GetUnitFacing(caster)
local player owner = GetOwningPlayer(caster)
local real targetX = 0.0
local real targetY = 0.0
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
local integer item2 = IsUnitHasItemType(caster, ITEM2_UPGRADE)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_SY_ColossalCyclone
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.dum = CreateUnit(owner, DUMMY_ID, targetX, targetY, face)
call UnitAddAbility(sd.dum, 'Arav')
call UnitRemoveAbility(sd.dum, 'Arav')
call SetUnitPathing(sd.dum, false)
set sd.t = Time_Remain(level)
set sd.dp = Distance_Pull(level)
set sd.r = Radius_Pull(level)
set sd.dr = Radius(level)
set sd.i = 0.0
set sd.im = INTERVAL_DAMAGE
set sd.dd = Damage(level) + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.it1 = item1
if(item2 > 0) then
set sd.r = sd.r + UPGRADE2_RADIUS_PULL
set sd.dp = sd.dp + UPGRADE2_DISTANCE_PULL
endif
if(item1 > 0 or item2 > 0) then
call SetUnitScale(sd.dum, 1.5, 1.5, 1.5)
endif
call SetUnitAnimation(sd.dum, "birth")
call QueueUnitAnimation(sd.dum, "stand")
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
set s = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(ColossalCycloneTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(ColossalCycloneTrg, Condition(function Conditions))
call TriggerAddAction(ColossalCycloneTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
set bexprSpin = Condition(function Pick_Spin)
set loc = Location(0, 0)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=27
//TESH.alwaysfold=0
scope BeastUnleashed initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'Absk' //Spell Axe Carve rawcode
private constant integer ABILITY_ID = 'A05W' //Ability Attack Max rawcode
private constant real DURATION_SPEED = 2.0 //Duration speed
private constant integer ITEM1_UPGRADE = 'rat6' //Item Sturdy War Axe
private constant real UPGRADE1_SPEED_CHANGE = 0.1 //Upgrade 1 effect
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Other\\Incinerate\\IncinerateBuff.mdl" //Effect axe
private constant string SPELL_EFFECT = "Abilities\\Weapons\\AncientProtectorMissile\\AncientProtectorMissile.mdl" //Effect speed
endglobals
//Hacks count
private function Hacks takes integer level returns integer
if(level == 1) then
return 5
elseif(level == 2) then
return 9
elseif(level == 3) then
return 17
elseif(level == 4) then
return 24
else
return 0
endif
endfunction
//Speed increase percent
private function Speed_Change takes integer level returns real
if(level == 1) then
return 0.5
elseif(level == 2) then
return 0.6
elseif(level == 3) then
return 0.7
elseif(level == 4) then
return 0.8
else
return 0.0
endif
endfunction
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct BeastUnleashed_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of ability
integer h //Hacks
boolean s //Speeding
real p //Speed percent increase
real d //Duration speed
effect e1 //Effect weapon 1
effect e2 //Effect weapon 2
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private BeastUnleashed_Data array Ar[10]
private group Group
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local BeastUnleashed_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.h > 0) then
if(sd.s) then
if(sd.d > 0.0) then
set sd.d = sd.d - Interval()
else
call SetUnitMoveSpeed(sd.u, GetUnitDefaultMoveSpeed(sd.u))
set sd.s = false
endif
endif
else
//call SetUnitTimeScale(sd.u, 1.0)
call UnitRemoveAbility(sd.u, ABILITY_ID)
call GroupRemoveUnit(Group, sd.u)
call SetUnitMoveSpeed(sd.u, GetUnitDefaultMoveSpeed(sd.u))
if(sd.e1 != null) then
call DestroyEffect(sd.e1)
set sd.e1 = null
endif
if(sd.e2 != null) then
call DestroyEffect(sd.e2)
set sd.e2 = null
endif
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local BeastUnleashed_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local unit target = GetSpellTargetUnit()
local integer i = 0
local boolean exist = false
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_BH_BeastUnleashed
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set sd.l = level
set sd.h = Hacks(level)
set sd.p = Speed_Change(level)
set exist = true
set i = Total
endif
set i = i + 1
endloop
if(not exist) then
set sd = BeastUnleashed_Data.create()
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.h = Hacks(level)
set sd.s = true
set sd.p = Speed_Change(level)
if(item1 > 0) then
set sd.p = sd.p + UPGRADE1_SPEED_CHANGE
endif
set sd.d = DURATION_SPEED
set sd.e1 = AddSpecialEffectTarget(SPECIAL_EFFECT, sd.u, "hand, left")
set sd.e2 = AddSpecialEffectTarget(SPECIAL_EFFECT, sd.u, "hand, right")
//call SetUnitTimeScale(sd.u, 1.5)
call UnitAddAbility(sd.u, ABILITY_ID)
//call SetUnitMoveSpeed(sd.u, GetUnitMoveSpeed(sd.u) * sd.p)
call GroupAddUnit(Group, sd.u)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.u, "origin"))
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
set caster = null
set owner = null
set target = null
set s = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Attack_Actions takes nothing returns nothing
local BeastUnleashed_Data sd
local unit attacker = GetAttacker()
local unit attacked = GetTriggerUnit()
local integer i = 0
local real angle = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == attacker) then
set sd.h = sd.h - 1
if(not sd.s) then
set sd.s = true
endif
set sd.d = DURATION_SPEED
set angle = Atan2(GetUnitY(attacked) - GetUnitY(attacker), GetUnitX(attacked) - GetUnitX(attacker)) * bj_RADTODEG
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.u, "origin"))
call SetUnitMoveSpeed(sd.u, GetUnitMoveSpeed(sd.u) * sd.p)
//call SetUnitTimeScale(sd.u, 1.5)
call IssueTargetOrder(attacker, "attack", attacked)
endif
set i = i + 1
endloop
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Attack_Conditions takes nothing returns boolean
local unit caster = GetAttacker()
local boolean isAttacker = IsUnitInGroup(caster, Group)
set caster = null
return isAttacker
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(BeastUnleashedTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(BeastUnleashedTrg, Condition(function Conditions))
call TriggerAddAction(BeastUnleashedTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(BeastUnleashedAttackTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(BeastUnleashedAttackTrg, Condition(function Attack_Conditions))
call TriggerAddAction(BeastUnleashedAttackTrg, function Attack_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set Group = CreateGroup()
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
endfunction
endscope
//TESH.scrollpos=24
//TESH.alwaysfold=0
scope SavageCharge initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'AOw2' //Spell Savage Charge rawcode
private constant integer CAST_ID = 'AOws' //Cast Savage Stomp (Dummy) rawcode
private constant integer ITEM1_UPGRADE = 'rat9' //Item Walking Slippers
private constant real UPGRADE1_DAMAGE = 50.0 //Upgrade 1 effect
private constant attacktype A_TYPE = ATTACK_TYPE_SIEGE //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_NORMAL //Spell attack type
private constant string SPELL_EFFECT = "Abilities\\Spells\\Orc\\WarStomp\\WarStompCaster.mdl" //Effect speed
endglobals
//Stomps
private function Stomp takes integer level returns integer
if(level == 1) then
return 3
elseif(level == 2) then
return 3
elseif(level == 3) then
return 3
else
return 0
endif
endfunction
//Distance move
private function Distance_Move takes integer level returns real
return 100.0 + (0.0 * level)
endfunction
//Distance
private function Distance takes integer level returns real
return 300.0 + (0.0 * level)
endfunction
//Radius detect
private function Radius_Detect takes integer level returns real
return 300.0 + (0.0 * level)
endfunction
//Radius of damage
private function Radius takes integer level returns real
return 300.0 + (0.0 * level)
endfunction
//Damage
private function Damage takes integer level returns real
if(level == 1) then
return 50.0
elseif(level == 2) then
return 90.0
elseif(level == 3) then
return 150.0
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct SavageCharge_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of ability
integer t //Stomp times
real ms //Moving speed
real d //Distance
real cos //Cos of angle
real sin //Sin of angle
real rd //Radius detect
real dd //Damage
real dr //Radius
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private SavageCharge_Data array Ar[10]
private group Group
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local SavageCharge_Data sd
local integer i = 0
local real x = 0.0
local real y = 0.0
local unit f = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t > 0) then
if(sd.d > 0) then
set sd.d = sd.d - sd.ms
set x = GetUnitX(sd.u) + sd.ms * sd.cos
set y = GetUnitY(sd.u) + sd.ms * sd.sin
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0)) and (not IsBarrel(sd.u, x, y, 100.0))) then
call SetUnitX(sd.u, x)
call SetUnitY(sd.u, y)
endif
call GroupEnumUnitsInRange(all, x, y, sd.rd, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o) and sd.d > 0.0 and IsUnitType(f, UNIT_TYPE_HERO)) then
set sd.d = 0.0
endif
endloop
else
set sd.d = Distance(sd.l)
if(sd.t > 0) then
set sd.t = sd.t - 1
call SetUnitAnimation(sd.u, "attack")
endif
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, x, y))
call GroupEnumUnitsInRange(all, x, y, sd.dr, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
endloop
call ImmediateCast(sd.o, x, y, 0.5, CAST_ID, sd.l, "stomp", 0)
call SetUnitTimeScale(sd.u, 2.0)
endif
else
call SetUnitPathing(sd.u, true)
call SetUnitTimeScale(sd.u, 1.0)
call Pather(sd.u, 1.0)
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local SavageCharge_Data sd = SavageCharge_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local real angle = GetUnitFacing(caster)
local real rad = angle * bj_DEGTORAD
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.t = Stomp(level)
set sd.ms = Distance_Move(level)
set sd.d = Distance(level)
set sd.cos = Cos(rad)
set sd.sin = Sin(rad)
set sd.rd = Radius_Detect(level)
set sd.dd = Damage(level)
set sd.dr = Radius(level)
call UnitAddAbility(caster, 'Arav')
call UnitRemoveAbility(caster, 'Arav')
call SetUnitPathing(caster, false)
call PauseUnit(caster, false)
call SetUnitTimeScale(caster, 0.0)
if(IsUnitInGroup(caster, Group)) then
call GroupRemoveUnit(Group, caster)
call SetUnitTimeScale(caster, 1.0)
endif
if(item1 > 0) then
set sd.dd = sd.dd + UPGRADE1_DAMAGE
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Cast_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
call SetUnitTimeScale(caster, 0.25)
call GroupAddUnit(Group, caster)
call TriggerSleepAction(1.0)
if(IsUnitInGroup(caster, Group)) then
call GroupRemoveUnit(Group, caster)
call SetUnitTimeScale(caster, 1.0)
endif
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(SavageChargeCastTrg, EVENT_PLAYER_UNIT_SPELL_CAST)
call TriggerAddCondition(SavageChargeCastTrg, Condition(function Conditions))
call TriggerAddAction(SavageChargeCastTrg, function Cast_Actions)
call TriggerRegisterAnyUnitEventBJ(SavageChargeTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(SavageChargeTrg, Condition(function Conditions))
call TriggerAddAction(SavageChargeTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set Group = CreateGroup()
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=41
//TESH.alwaysfold=0
scope BreakingAxe initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A09P' //Spell Breaking Axe rawcode
private constant real KNOCKBACK_DURATION = 0.5 //Duration knock
private constant real MELEE_RADIUS = 300.0 //Melee radius
private constant integer ITEM1_UPGRADE = 'I00G' //Item Guardian's Helm
private constant integer UPGRADE1_ATTACK_COUNT = 2 //Upgrade 1 effect
private constant attacktype A_TYPE = ATTACK_TYPE_HERO //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_ENHANCED //Spell damage type
private constant string SPECIAL_EFFECT = "war3mapImported\\FireNova.mdx"
private constant string SPELL_EFFECT = "Abilities\\Weapons\\AncientProtectorMissile\\AncientProtectorMissile.mdl" //Effect target
endglobals
//Attack count to slam
private function Attack_Count takes integer level returns integer
if(level == 1) then
return 10
elseif(level == 2) then
return 10
elseif(level == 3) then
return 10
else
return 0
endif
endfunction
//Radius
private function Damage_Radius takes integer level returns real
if(level == 1) then
return 300.0
elseif(level == 2) then
return 400.0
elseif(level == 3) then
return 600.0
else
return 0.0
endif
endfunction
//Damage
private function Damage takes integer level returns real
if(level == 1) then
return 20.0
elseif(level == 2) then
return 30.0
elseif(level == 3) then
return 50.0
else
return 0.0
endif
endfunction
//Strength multiply damage
private function Strength_Damage takes integer level returns real
if(level == 1) then
return 2.0
elseif(level == 2) then
return 2.0
elseif(level == 3) then
return 2.0
else
return 0.0
endif
endfunction
//Targets affected
private function Targets_Detect takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false)
endfunction
//Targets affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_FLYING) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct BreakingAxe_Data
unit u //Unit attacker
integer uID //Attacker ID
player o //Owner of attacker
integer a //Current amount
integer m //Amount to slam
real dr //Damage radius
real dd //Damage
real sd //Strength damage
effect e //Effect
endstruct
//----------------------------------------------------------------
globals
private integer Total
private BreakingAxe_Data array Ar[10]
private group all
private boolexpr bexpr
private boolexpr bexprTarget
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Pick_Target takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit attacker = GetAttacker()
local integer attackerID = GetUnitUserData(attacker)
local integer level = GetUnitAbilityLevel(attacker, SPELL_ID)
local player owner = GetOwningPlayer(attacker)
local real attackerX = GetUnitX(attacker)
local real attackerY = GetUnitY(attacker)
local unit attacked = GetTriggerUnit()
local BreakingAxe_Data sd
local integer i = 0
local unit f = null
local real fX = 0.0
local real fY = 0.0
local real fAngle = 0.0
local real dx = 0.0
local real dy = 0.0
local real fDistance = 0.0
local integer attack = 0
local real damage = 0.0
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == attacker) then
set attack = attack + 1
call GroupEnumUnitsInRange(all, attackerX, attackerY, sd.dr, bexprTarget)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
set attack = attack + 1
if(IsUnitType(f, UNIT_TYPE_HERO)) then
set attack = attack + 1
endif
endif
endloop
if(sd.a > 0) then
set sd.a = sd.a - attack
else
set sd.a = sd.m
set damage = GetHeroStr(sd.u, true) * sd.sd
if(IsUnitHasItemType(attacker, ITEM1_UPGRADE) > 0) then
set sd.a = sd.a - UPGRADE1_ATTACK_COUNT
endif
call SetUnitAnimation(sd.u, "slam")
call DestroyEffect(AddSpecialEffect(SPECIAL_EFFECT, attackerX, attackerY))
call GroupEnumUnitsInRange(all, attackerX, attackerY, MELEE_RADIUS, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
call UnitDamageTarget(sd.u, f, sd.dd + damage, true, false, A_TYPE, D_TYPE, null)
if(f != attacked) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = fX - attackerX
set dy = fY - attackerY
set fDistance = SquareRoot(dx * dx + dy * dy)
set fAngle = Atan2(fY - attackerY, fX - attackerX) * bj_RADTODEG
call KnockbackEx(f, MELEE_RADIUS - fDistance, fAngle, KNOCKBACK_DURATION, 0.0, SPELL_EFFECT, false)
endif
endif
endloop
endif
endif
set i = i + 1
endloop
set attacker = null
set owner = null
set f = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit attacker = GetAttacker()
local boolean okey = GetUnitAbilityLevel(attacker, SPELL_ID) > 0
set attacker = null
return okey
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local unit learner = GetLearningUnit()
local player owner = GetOwningPlayer(learner)
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
local BreakingAxe_Data sd
local integer i = 0
local boolean exist = false
if(level <= 1) then
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set exist = true
set sd.m = Attack_Count(level)
set sd.dr = Damage_Radius(level)
set sd.dd = Damage(level)
set sd.sd = Strength_Damage(level)
endif
set i = i + 1
endloop
if(not exist) then
set sd = BreakingAxe_Data.create()
set sd.u = learner
set sd.uID = GetUnitUserData(learner)
set sd.o = owner
set sd.a = Attack_Count(level)
set sd.m = sd.a
set sd.dr = Damage_Radius(level)
set sd.dd = Damage(level)
set sd.sd = Strength_Damage(level)
set sd.e = null
set Total = Total + 1
set Ar[Total - 1] = sd
endif
else
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set sd.m = Attack_Count(level)
set sd.dr = Damage_Radius(level)
set sd.dd = Damage(level)
set sd.sd = Strength_Damage(level)
endif
set i = i + 1
endloop
endif
set learner = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
local unit learner = GetTriggerUnit()
local boolean okey = (GetLearnedSkill() == SPELL_ID) and (not IsUnitIllusion(learner))
set learner = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(BreakingAxeTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(BreakingAxeTrg, Condition(function Conditions))
call TriggerAddAction(BreakingAxeTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(BreakingAxeLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(BreakingAxeLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(BreakingAxeLearnTrg, function Learn_Actions)
//Setting globals
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
set bexprTarget = Condition(function Pick_Target)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=255
//TESH.alwaysfold=0
scope BattleRoar initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'ACbb' //Spell Battle Roar rawcode
private constant integer BUFF_ID = 'Bfzy' //Buff Battle Roar rawcode
private constant integer ITEM1_UPGRADE = 'I01C' //Item Sagaris Carnage
private constant integer UPGRADE1_STRENGTH = 5 //Upgrade 1 effect
private constant string SPELL_EFFECT = "Abilities\\Spells\\NightElf\\BattleRoar\\RoarTarget.mdl" //Effect target
endglobals
//Duration
private function Duration takes integer level returns real
if(level == 1) then
return 20.0
elseif(level == 2) then
return 20.0
elseif(level == 3) then
return 20.0
else
return 0.0
endif
endfunction
//Strength decrease per 1 movement speed
private function Strength takes integer level returns integer
if(level == 1) then
return 1
elseif(level == 2) then
return 1
elseif(level == 3) then
return 1
else
return 0
endif
endfunction
//Max strength
private function Max_Strength takes integer level returns integer
if(level == 1) then
return 15
elseif(level == 2) then
return 20
elseif(level == 2) then
return 30
else
return 0
endif
endfunction
//Strength decrease per interval
private function Strength_Decrease takes integer level returns integer
return 1 + (0 * level)
endfunction
//Interval decrease strength
private function Decrease_Interval takes integer level returns real
return 1.0 + (0.0 * level)
endfunction
//Heal amount by percentage
private function Heal takes integer level returns real
return 0.1 + (0.0 * level)
endfunction
//Radius heal
private function Radius takes integer level returns real
return 600.0 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.5
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct BattleRoar_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of ability
unit t //Unit target
real d //Duration
real mv //Movement speed
integer f //Different current
integer s //Strength
integer si //Strength increase
integer ms //Max strength
integer sd //Strength decrease
real i //Interval
real im //Max interval
effect e //Effect
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private BattleRoar_Data array Ar[10]
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local BattleRoar_Data sd
local integer i = 0
local real movespeed = 0.0
local real diff = 0.0
local integer factor = 0
local integer increase = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.d > 0) then
if(not IsUnitDead(sd.u)) then
set sd.d = sd.d - Interval()
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
set sd.s = sd.s - sd.sd
call SetHeroStr(sd.t, GetHeroStr(sd.t, false) - sd.sd, false)
endif
set movespeed = GetUnitMoveSpeed(sd.t)
if(movespeed > sd.mv) then
set diff = movespeed - sd.mv
if(sd.s < sd.ms) then
set sd.f = sd.f + R2I(diff)
set factor = R2I(sd.f / 10)
set sd.f = R2I(sd.f / 10)
set increase = (sd.si * factor)
if(sd.s < sd.ms - increase) then
set sd.s = sd.s + increase
else
set increase = sd.ms - sd.s
set sd.s = sd.ms
endif
call SetHeroStr(sd.t, GetHeroStr(sd.t, false) + increase, false)
endif
set sd.mv = movespeed
else
set sd.mv = movespeed
endif
endif
else
call SetHeroStr(sd.t, GetHeroStr(sd.t, false) - sd.s, false)
if(sd.e != null) then
call DestroyEffect(sd.e)
set sd.e = null
endif
set sd.u = null
set sd.o = null
set sd.t = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local BattleRoar_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local unit target = GetSpellTargetUnit()
local real targetX = GetUnitX(target)
local real targetY = GetUnitY(target)
local integer i = 0
local boolean exist = false
local integer diff = 0
local unit f = null
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t == target) then
set exist = true
set diff = Max_Strength(level) - sd.s
set sd.s = Max_Strength(level)
set sd.d = Duration(level)
set sd.si = Strength(level)
set sd.ms = Max_Strength(level)
if(item1 > 0) then
set diff = diff + UPGRADE1_STRENGTH
set sd.s = sd.s + UPGRADE1_STRENGTH
endif
call SetHeroStr(sd.t, GetHeroStr(sd.t, false) + diff, false)
set i = Total
endif
set i = i + 1
endloop
if(not exist) then
set sd = BattleRoar_Data.create()
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.t = target
set sd.d = Duration(level)
set sd.mv = GetUnitMoveSpeed(target)
set sd.f = 0
set sd.s = Max_Strength(level)
set sd.si = Strength(level)
set sd.ms = Max_Strength(level)
set sd.sd = Strength_Decrease(level)
set sd.i = 0.0
set sd.im = Decrease_Interval(level)
set sd.e = AddSpecialEffectTarget(SPELL_EFFECT, target, "overhead")
if(item1 > 0) then
set sd.s = sd.s + UPGRADE1_STRENGTH
set sd.ms = Max_Strength(level)
endif
call SetHeroStr(sd.t, GetHeroStr(sd.t, false) + sd.s, false)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
call GroupEnumUnitsInRange(all, targetX, targetY, Radius(level), bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitAlly(f, sd.o)) then
call SetUnitState(f, UNIT_STATE_LIFE, GetUnitState(f, UNIT_STATE_LIFE) + 0.1 * GetUnitState(f, UNIT_STATE_MAX_LIFE))
endif
endloop
set caster = null
set owner = null
set target = null
set f = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(BattleRoarTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(BattleRoarTrg, Condition(function Conditions))
call TriggerAddAction(BattleRoarTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=68
//TESH.alwaysfold=0
scope Stampede initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A09N' //Spell Stampede rawcode
private constant integer DUMMY_ID = 'n024' //Dummy Stampede (Dummy) rawcode
private constant real INTERVAL = 1.0 //Interval
private constant real MOVE_SPEED = 20.0 //Move speed
private constant integer MIN_MOVESPEED = 200 //Minimum Stampede movespeed
private constant real CLOSE_DISTANCE = 450.0 //Close distance between Stampede and target
private constant integer ITEM1_UPGRADE = 'I01H' //Item Wrist of Hercules
private constant integer ITEM2_UPGRADE = 'I01G' //Item Throne of Emperor
private constant attacktype A_TYPE = ATTACK_TYPE_CHAOS //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_UNIVERSAL //Spell attack type
private constant string SPECIAL_EFFECT = "Abilities\\Weapons\\AncientProtectorMissile\\AncientProtectorMissile.mdl" //Effect target
private constant string SPELL_EFFECT = "Abilities\\Spells\\Orc\\WarStomp\\WarStompCaster.mdl" //Effect speed
endglobals
//Time duration
private function Duration takes integer level returns real
return 20.0 + (0.0 * level)
endfunction
//Interval summon
private function Summon takes integer level returns real
return 0.2 + (0.0 * level)
endfunction
//Max summon
private function Max_Summon takes integer level returns integer
return 10 + (0 * level)
endfunction
//Distance move
private function Move_Speed takes integer level returns real
if(level == 1) then
return 5.0
elseif(level == 2) then
return 10.0
else
return 0.0
endif
endfunction
//Radius spawn
private function Radius takes integer level returns real
return 200.0 + (0.0 * level)
endfunction
//Max distance from target
private function Max_Distance takes integer level returns real
return 900.0 + (0.0 * level)
endfunction
//Radius of damage
private function Radius_Damage takes integer level returns real
return 200.0 + (0.0 * level)
endfunction
//Damage
private function Damage takes integer level returns real
if(level == 1) then
return 25.0
elseif(level == 2) then
return 50.0
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Stampede_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of ability
unit e //Unit target
group g //Group rhinos
real t //Time duration
real x //X of caster
real y //Y of caster
real i //Interval move speed increase
real im //Max interval
real s //Spawn interval
real sm //Max spawn interval
integer ss //Summon stampede
integer mx //Max summon
real r //Radius spawn
real ms //Move speed
real md //Max distance
real mv //Move speed
real dr //Damage radius
real dd //Damage
integer it1 //Item 1 upgrade
integer it2 //Item 2 upgrade
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Stampede_Data array Ar[10]
private group copy
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Stampede_Data sd
local integer i = 0
local real x = 0.0
local real y = 0.0
local real randomDistance = 0.0
local real randomAngle = 0.0
local real face = 0.0
local real movespeed = 0.0
local real tX = 0.0
local real tY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local unit dummy = null
local unit f = null
local unit g = null
local boolean exist = false
local boolean moving = false
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t > 0) then
set sd.t = sd.t - Interval()
if(not IsUnitDead(sd.e)) then
set x = GetUnitX(sd.e)
set y = GetUnitY(sd.e)
set movespeed = GetUnitMoveSpeed(sd.e)
set moving = false
if(x != sd.x or y != sd.y) then
set sd.x = x
set sd.y = y
set moving = true
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, sd.e, "origin"))
else
set moving = false
endif
set f = FirstOfGroup(sd.g)
if(f != null) then
set copy = CopyGroup(sd.g)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(not IsUnitDead(f)) then
set face = GetUnitFacing(sd.e) * bj_DEGTORAD
set tX = GetUnitX(f)
set tY = GetUnitY(f)
set dx = tX - x
set dy = tY - y
set distance = SquareRoot(dx * dx + dy * dy)
if(distance < sd.md) then
set exist = false
call GroupEnumUnitsInRange(all, tX, tY, sd.dr, bexpr)
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
if(IsUnitEnemy(g, sd.o)) then
//if(IsUnitType(g, UNIT_TYPE_HERO)) then
set exist = true
//endif
call UnitDamageTarget(sd.u, g, sd.dd, true, false, A_TYPE, D_TYPE, null)
if(sd.it1 > 0 or sd.it2 > 0) then
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, GetUnitX(g), GetUnitY(g)))
else
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, g, "chest"))
endif
endif
endloop
if(moving) then
set tX = tX + sd.mv * Cos(face)
set tY = tY + sd.mv * Sin(face)
call SetUnitFacing(f, face * bj_RADTODEG)
else
if(distance < CLOSE_DISTANCE) then
set face = GetUnitFacing(f) * bj_DEGTORAD
set tX = tX + sd.mv * Cos(face)
set tY = tY + sd.mv * Sin(face)
//call IssuePointOrder(f, "move", tX, tY)
else
//set face = Atan2(y - tY, x - tX)
set face = GetUnitFacing(f) * bj_DEGTORAD
set tX = tX + sd.mv * Cos(face)
set tY = tY + sd.mv * Sin(face)
set face = Atan2(y - tY, x - tX)
call SetUnitFacing(f, face * bj_RADTODEG)
//set tX = x
//set tY = y
//set face = Atan2(y - tY, x - tX)
//set tX = x + sd.md * 2 * Cos(face)
//set tY = y + sd.md * 2 * Sin(face)
//call IssueTargetOrder(f, "smart", sd.e)
endif
endif
call SetUnitX(f, tX)
call SetUnitY(f, tY)
set sd.mv = RMaxBJ(movespeed, MIN_MOVESPEED) / 20
call SetUnitTimeScale(f, sd.mv / 20)
//call IssuePointOrder(f, "move", tX, tY)
//call SetUnitMoveSpeed(f, RMaxBJ(movespeed, MIN_MOVESPEED))
if(exist) then
set sd.ss = sd.ss - 1
call PauseUnit(f, false)
set tX = GetUnitX(f)
set tY = GetUnitY(f)
set tX = tX + sd.md * Cos(face)
set tY = tY + sd.md * Sin(face)
call IssuePointOrder(f, "move", tX, tY)
call GroupRemoveUnit(sd.g, f)
call UnitApplyTimedLife(f, 'BTLF', 2.0)
call SetUnitVertexColor(f, 255, 255, 255, 50)
endif
else
call GroupRemoveUnit(sd.g, f)
call KillUnit(f)
endif
else
call GroupRemoveUnit(sd.g, f)
call KillUnit(f)
endif
endloop
endif
if(sd.s > 0.0) then
set sd.s = sd.s - Interval()
else
if(sd.ss < sd.mx) then
set sd.s = sd.sm
set sd.ss = sd.ss + 1
set face = GetUnitFacing(sd.e)
set movespeed = GetUnitMoveSpeed(sd.e)
set randomDistance = GetRandomReal(100.0, sd.r)
set randomAngle = face * -1 + GetRandomInt(0, 60) * bj_DEGTORAD
set tX = x + randomDistance * Cos(randomAngle)
set tY = y + randomDistance * Sin(randomAngle)
set dummy = CreateUnit(sd.o, DUMMY_ID, tX, tY, face)
call SetUnitMoveSpeed(dummy, movespeed)
call SetUnitVertexColor(dummy, 255, 255, 255, 200)
call SetUnitPathing(dummy, false)
call PauseUnit(dummy, true)
call GroupAddUnit(sd.g, dummy)
endif
endif
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
call SetUnitMoveSpeed(sd.e, GetUnitMoveSpeed(sd.e) + sd.ms)
endif
else
set sd.t = 0.0
endif
else
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
call KillUnit(f)
endloop
call SetUnitMoveSpeed(sd.e, GetUnitDefaultMoveSpeed(sd.e))
set sd.u = null
set sd.o = null
set sd.e = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set dummy = null
set f = null
set g = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Stampede_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local boolean isNull = (Ar[Total] == null)
local unit target = GetSpellTargetUnit()
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
local integer item2 = IsUnitHasItemType(caster, ITEM2_UPGRADE)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_BH_Stampede
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
if(isNull) then
set sd = Stampede_Data.create()
set sd.g = CreateGroup()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.e = target
set sd.t = Duration(level)
set sd.x = GetUnitX(target)
set sd.y = GetUnitY(target)
set sd.i = 0.0
set sd.im = INTERVAL
set sd.s = 0.0
set sd.sm = Summon(level)
set sd.ss = 0
set sd.mx = Max_Summon(level)
set sd.r = Radius(level)
set sd.ms = Move_Speed(level)
set sd.md = Max_Distance(level)
set sd.mv = GetUnitMoveSpeed(target) / 20
set sd.dr = Radius_Damage(level)
set sd.dd = Damage(level)
set sd.it1 = item1
set sd.it2 = item2
if(sd.it1 > 0) then
set sd.dd = sd.dd + (GetHeroStr(target, true) * 2)
endif
if(sd.it2 > 0) then
set sd.sm = sd.sm / 2
endif
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set owner = null
set target = null
set s = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(StampedeTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(StampedeTrg, Condition(function Conditions))
call TriggerAddAction(StampedeTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set copy = CreateGroup()
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
endfunction
endscope
//TESH.scrollpos=59
//TESH.alwaysfold=0
scope Constrictions initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A09R' //Spell Constrictions rawcode
private constant integer CAST_ID = 'A09U' //Spell Constrictions (dummy) rawcode
private constant string LIGHTNING_ID = "MBUR" //Lightning code
private constant real INTERVAL = 0.5 //Interval effect
private constant integer ITEM1_UPGRADE = 'rde1' //Item Barrel Buckler
private constant real UPGRADE1_RADIUS_ESCAPE = 100.0 //Upgrade 1 effect
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_NORMAL //Spell attack type
private constant string SPECIAL_EFFECT = "Abilities\\Weapons\\ChimaeraAcidMissile\\ChimaeraAcidMissile.mdl" //Effect blast targets
private constant string SPELL_EFFECT = "Abilities\\Weapons\\ChimaeraAcidMissile\\ChimaeraAcidMissile.mdl" //Effect targets
endglobals
//Max unit
private function Max_Target takes integer level returns integer
if(level == 1) then
return 4
elseif(level == 2) then
return 5
elseif(level == 3) then
return 7
elseif(level == 4) then
return 10
else
return 0
endif
endfunction
//Duration before stun
private function Duration takes integer level returns real
return 3.0 + (0.0 * level)
endfunction
//Radius
private function Radius takes integer level returns real
if(level == 1) then
return 450.0
elseif(level == 2) then
return 450.0
elseif(level == 3) then
return 450.0
elseif(level == 4) then
return 450.0
else
return 0.0
endif
endfunction
//Radius escape
private function Radius_Escape takes integer level returns real
return 900.0 + (0.0 * level)
endfunction
//Damage
private function Damage takes integer level returns real
if(level == 1) then
return 150.0
elseif(level == 2) then
return 200.0
elseif(level == 3) then
return 275.0
elseif(level == 4) then
return 375.0
else
return 0.0
endif
endfunction
//Targets affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_FLYING) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Constrictions_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of ability
unit array t[10] //Unit target
real x //X of target
real y //Y of target
real d //Duration
real r //Radius escape
real s //Size
real i //Interval
real im //Interval max
boolean array es[10] //Escape
lightning array lg[10] //Lightning
integer array id[10] //Index
real dd //Damage
effect e //Effect
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Constrictions_Data array Ar[10]
private location loc
private location locTarget
private location locOrigin
private location locTemp
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Constrictions_Data sd
local integer i = 0
local integer j = 0
local real tX = 0.0
local real tY = 0.0
local real tZ = 0.0
local real x = 0.0
local real y = 0.0
local real z = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local boolean exist = false
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.d > 0) then
set sd.d = sd.d - Interval()
set exist = false
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = INTERVAL
set exist = true
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, sd.x, sd.y))
endif
set j = 0
loop
exitwhen(j >= sd.s)
if(not sd.es[j]) then
set locTemp = GetUnitLoc(sd.t[j])
set tX = GetUnitX(sd.t[j])
set tY = GetUnitY(sd.t[j])
set tZ = GetLocationZ(locTemp)
set locOrigin = Location(sd.x, sd.y)
set x = GetLocationX(locOrigin)
set y = GetLocationY(locOrigin)
set z = GetLocationZ(locOrigin)
set dx = tX - x
set dy = tY - y
set distance = SquareRoot(dx * dx + dy * dy)
if(distance > sd.r) then
call DestroyLightning(sd.lg[j])
set sd.t[j] = null
set sd.es[j] = true
else
call MoveLightningEx(sd.lg[j], true, tX, tY, tZ, x, y, z)
if(exist) then
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.t[j], "origin"))
call TargetCast(sd.o, GetUnitX(sd.t[j]), GetUnitY(sd.t[j]), 0.5, CAST_ID, sd.l, "thunderbolt", 0, sd.t[j])
endif
endif
endif
set j = j + 1
endloop
else
set j = 0
loop
exitwhen(j >= sd.s)
if(not sd.es[j]) then
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, sd.t[j], "origin"))
if(IsUnitType(sd.t[j], UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, sd.t[j], sd.dd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, sd.t[j], sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
call SetUnitX(sd.t[j], sd.x)
call SetUnitY(sd.t[j], sd.y)
call Pather(sd.t[j], 1.0)
call DestroyLightning(sd.lg[j])
set sd.lg[j] = null
set sd.t[j] = null
set sd.es[j] = true
endif
set j = j + 1
endloop
if(sd.e != null) then
call DestroyEffect(sd.e)
set sd.e = null
endif
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Constrictions_Data sd = Constrictions_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local integer max = Max_Target(level)
local real x = 0.0
local real y = 0.0
local real z = 0.0
local unit f = null
local real fX = 0.0
local real fY = 0.0
local real fZ = 0.0
local integer id = 0
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
set loc = GetSpellTargetLoc()
set x = GetLocationX(loc)
set y = GetLocationY(loc)
set z = GetLocationZ(loc)
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.x = x
set sd.y = y
set sd.d = Duration(level)
set sd.r = Radius_Escape(level)
set sd.s = 0
set sd.dd = Damage(level) + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.e = AddSpecialEffect(SPELL_EFFECT, x, y)
set id = 0
call GroupEnumUnitsInRange(all, x, y, Radius(level), bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o) and id < Max_Target(level)) then
set locTarget = GetUnitLoc(f)
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set fZ = GetLocationZ(locTarget)
set sd.es[id] = false
set sd.t[id] = f
set sd.lg[id] = AddLightningEx(LIGHTNING_ID, true, fX, fY, fZ, x, y, z)
set id = id + 1
set sd.s = sd.s + 1
endif
endloop
if(item1 > 0) then
set sd.r = sd.r + UPGRADE1_RADIUS_ESCAPE
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
set f = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
/*//----------------------------------------------------------------
private function Attack_Actions takes nothing returns nothing
local Constrictions_Data sd
local unit attacker = GetAttacker()
local unit attacked = GetTriggerUnit()
local integer i = 0
local real angle = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == attacker) then
endif
set i = i + 1
endloop
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Attack_Conditions takes nothing returns boolean
local unit caster = GetAttacker()
local boolean isAttacker = IsUnitInGroup(caster, Group)
set caster = null
return isAttacker
endfunction*/
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(ConstrictionsTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(ConstrictionsTrg, Condition(function Conditions))
call TriggerAddAction(ConstrictionsTrg, function Actions)
//call TriggerRegisterAnyUnitEventBJ(ConstrictionsAttackTrg, EVENT_PLAYER_UNIT_ATTACKED)
//call TriggerAddCondition(ConstrictionsAttackTrg, Condition(function Attack_Conditions))
//call TriggerAddAction(ConstrictionsAttackTrg, function Attack_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set loc = Location(0.0, 0.0)
set locOrigin = Location(0.0, 0.0)
set locTarget = Location(0.0, 0.0)
set locTemp = Location(0.0, 0.0)
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
endfunction
endscope
//TESH.scrollpos=37
//TESH.alwaysfold=0
scope FanFangs initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A09Q' //Spell Fan Fangs rawcode
private constant integer DUMMY_ID = 'n025' //Dummy Fan Fangs rawcode
private constant integer CAST_ID = 'A09U' //Spell Constrictions (dummy) rawcode
private constant real DISTANCE_OFFSET_INITIAL = 10.0 //Distance offset initially
private constant real DISTANCE_OFFSET_CHANGE = 5.0 //Distance offset
private constant real ANGLE_OFFSET_CHANGE = 30.0 //Angle offset
private constant real DISTANCE_MOVE = 120.0 //Distance move of arrows
private constant real DISTANCE_REACH = 100.0 //Distance reach point
private constant integer ITEM1_UPGRADE = 'I010' //Item Venomwax Fang
private constant integer UPGRADE1_ARROW_COUNT = 4 //Upgrade 1 effect
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_NORMAL //Spell attack type
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Items\\OrbVenom\\OrbVenomSpecialArt.mdl" //Effect blast targets
private constant string SPELL_EFFECT = "Abilities\\Spells\\NightElf\\ManaBurn\\ManaBurnTarget.mdl" //Effect targets
endglobals
//Arrow count size
private function Arrow_Count takes integer level returns integer
return 40 + (0 * level)
endfunction
//Interval summon
private function Interval_Summon takes integer level returns real
return 0.1 + (0.0 * level)
endfunction
//Damage radius contact
private function Radius takes integer level returns real
return 150.0 + (0.0 * level)
endfunction
//Damage deal
private function Damage takes integer level returns real
if(level == 1) then
return 30.0
elseif(level == 2) then
return 70.0
elseif(level == 3) then
return 130.0
else
return 0.0
endif
endfunction
//Targets affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_FLYING) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct FanFangs_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of ability
unit array dum[40] //Unit dummy
real array ds[40] //Dummy distance offset
real array da[40] //Dummy angle offset
boolean array end[40] //End
integer m //Mode
integer a //Arrow count
integer s //Size arrow max
real do //Distance offset
real ao //Angle offset
real x //Target x
real y //Target y
real i //Interval summon
real im //Interval max
integer id //Index launch
real dr //Radius damage
real dd //Damage
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private FanFangs_Data array Ar[10]
private location loc
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local FanFangs_Data sd
local integer i = 0
local integer j = 0
local real x = 0.0
local real y = 0.0
local real tX = 0.0
local real tY = 0.0
local real rad = 0.0
local real face = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local unit f = null
local boolean exist = false
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.m == 0) then
set j = 0
loop
exitwhen(j >= sd.a)
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
set tX = x + sd.ds[j] * Cos(sd.da[j])
set tY = y + sd.ds[j] * Sin(sd.da[j])
set rad = Atan2(sd.y - tY, sd.x - tX)
set face = rad * bj_RADTODEG
call SetUnitX(sd.dum[j], tX)
call SetUnitY(sd.dum[j], tY)
call SetUnitFacing(sd.dum[j], face)
set j = j + 1
endloop
if(sd.a < sd.s) then
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
set face = Atan2(sd.y - y, sd.x - x)
set rad = sd.ao * bj_DEGTORAD
set tX = x + sd.do * Cos(rad)
set tY = y + sd.do * Sin(rad)
set sd.ds[sd.a] = sd.do
set sd.da[sd.a] = rad
set sd.dum[sd.a] = CreateUnit(sd.o, DUMMY_ID, tX, tY, face * bj_RADTODEG)
call SetUnitAnimation(sd.dum[sd.a], "stand")
set sd.end[sd.a] = false
set sd.do = sd.do + DISTANCE_OFFSET_CHANGE
set sd.ao = sd.ao + ANGLE_OFFSET_CHANGE
set sd.a = sd.a + 1
else
set sd.m = 1
set sd.id = 1
endif
elseif(sd.m == 1) then
set j = sd.id
loop
exitwhen(j >= sd.a)
if(not sd.end[j]) then
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
set tX = x + sd.ds[j] * Cos(sd.da[j])
set tY = y + sd.ds[j] * Sin(sd.da[j])
set rad = Atan2(sd.y - tY, sd.x - tX)
set face = rad * bj_RADTODEG
call SetUnitX(sd.dum[j], tX)
call SetUnitY(sd.dum[j], tY)
call SetUnitFacing(sd.dum[j], face)
endif
set j = j + 1
endloop
set exist = false
set j = 0
loop
exitwhen(j >= sd.id)
if(not sd.end[j]) then
set exist = true
set x = GetUnitX(sd.dum[j])
set y = GetUnitY(sd.dum[j])
set dx = x - sd.x
set dy = y - sd.y
set distance = SquareRoot(dx * dx + dy * dy)
if(distance > DISTANCE_REACH) then
set rad = Atan2(sd.y - y, sd.x - x)
set tX = x + DISTANCE_MOVE * Cos(rad)
set tY = y + DISTANCE_MOVE * Sin(rad)
if(tX > WorldBounds.minX + 300.0 and /*
*/tX < WorldBounds.maxX - 300.0 and /*
*/tY > WorldBounds.minY + 300.0 and /*
*/tY < WorldBounds.maxY - 300.0 and (not IsWall(tX, tY, 100.0))) then
call SetUnitX(sd.dum[j], tX)
call SetUnitY(sd.dum[j], tY)
call SetUnitFacing(sd.dum[j], rad * bj_RADTODEG)
else
call KillUnit(sd.dum[j])
set sd.dum[j] = null
set sd.end[j] = true
endif
call GroupEnumUnitsInRange(all, tX, tY, sd.dr, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o) and (not sd.end[j])) then
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.dd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
call TargetCast(sd.o, tX, tY, 0.5, CAST_ID, sd.l, "thunderbolt", 0, f)
call KillUnit(sd.dum[j])
set sd.dum[j] = null
set sd.end[j] = true
endif
endloop
else
call KillUnit(sd.dum[j])
set sd.dum[j] = null
set sd.end[j] = true
endif
endif
set j = j + 1
endloop
if(exist) then
if(sd.id < sd.a) then
set sd.id = sd.id + 1
endif
else
set sd.m = 2
endif
else
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local FanFangs_Data sd = FanFangs_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local real targetX = 0.0
local real targetY = 0.0
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.m = 0
set sd.a = 0
set sd.s = Arrow_Count(level)
set sd.do = DISTANCE_OFFSET_INITIAL
set sd.ao = GetUnitFacing(caster)
set sd.x = targetX
set sd.y = targetY
set sd.i = 0.0
set sd.im = Interval_Summon(level)
set sd.id = 0
set sd.dr = Radius(level)
set sd.dd = Damage(level) + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
if(item1 > 0) then
set sd.s = sd.s + UPGRADE1_ARROW_COUNT
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(FanFangsTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(FanFangsTrg, Condition(function Conditions))
call TriggerAddAction(FanFangsTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
set loc = Location(0.0, 0.0)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
endfunction
endscope
//TESH.scrollpos=30
//TESH.alwaysfold=0
scope Glide initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A09S' //Spell Glide rawcode
private constant integer ITEM1_UPGRADE = 'bspd' //Item Boots of Speed
private constant real UPGRADE1_DURATION = 1.0 //Upgrade 1 effect
private constant string SPELL_EFFECT = "Abilities\\Weapons\\SeaElementalMissile\\SeaElementalMissile.mdl" //Effect targets
endglobals
//Threshold angle required
private function Threshold takes integer level returns real
if(level == 1) then
return 480.0
elseif(level == 2) then
return 360.0
elseif(level == 3) then
return 180.0
else
return 0.0
endif
endfunction
//Movement speed increase
private function Movespeed takes integer level returns real
if(level == 1) then
return 80.0
elseif(level == 2) then
return 160.0
elseif(level == 3) then
return 240.0
else
return 0.0
endif
endfunction
//Duration boost
private function Duration takes integer level returns real
if(level == 1) then
return 3.0
elseif(level == 2) then
return 3.0
elseif(level == 3) then
return 3.0
else
return 0.0
endif
endfunction
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Glide_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of spell
real a //Angle
real d //Difference
real h //Threshold
boolean b //Boost
real t //Time boost current
real tm //Time boost
real mv //Movespeed
effect e //Effect boost
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private Glide_Data array Ar[10]
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Glide_Data sd
local integer i = 0
local real angle = 0.0
local real diff = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(not IsUnitDead(sd.u)) then
if(not sd.b) then
set angle = GetUnitFacing(sd.u)
if(angle != sd.a) then
set diff = angle - sd.a
if(diff < 0) then
set diff = diff * -1
endif
set sd.d = sd.d + diff
endif
set sd.a = angle
if(sd.d > sd.h) then
set sd.b = true
call SetUnitMoveSpeed(sd.u, GetUnitMoveSpeed(sd.u) + sd.mv)
set sd.t = sd.tm
set sd.d = 0
set sd.e = AddSpecialEffectTarget(SPELL_EFFECT, sd.u, "origin")
if(IsUnitHasItemType(sd.u, ITEM1_UPGRADE) > 0) then
set sd.t = sd.t + UPGRADE1_DURATION
endif
endif
else
if(sd.t > 0.0) then
set sd.t = sd.t - Interval()
else
set sd.b = false
set sd.a = GetUnitFacing(sd.u)
call SetUnitMoveSpeed(sd.u, GetUnitDefaultMoveSpeed(sd.u))
if(sd.e != null) then
call DestroyEffect(sd.e)
set sd.e = null
endif
endif
endif
else
set sd.a = GetUnitFacing(sd.u)
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Glide_Data sd
local unit learner = GetTriggerUnit()
local integer learnerID = GetUnitUserData(learner)
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
local player owner = GetOwningPlayer(learner)
local integer i = 0
local boolean exist = false
if(level == 1) then
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set exist = true
set sd.l = level
set sd.mv = Movespeed(level)
set sd.h = Threshold(level)
set i = Total
endif
set i = i + 1
endloop
if(not exist) then
set sd = Glide_Data.create()
set sd.u = learner
set sd.o = owner
set sd.l = level
set sd.a = GetUnitFacing(learner)
set sd.d = 0.0
set sd.h = Threshold(level)
set sd.b = false
set sd.t = 0.0
set sd.tm = Duration(level)
set sd.mv = Movespeed(level)
set sd.e = null
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
else
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set sd.l = level
set sd.mv = Movespeed(level)
set sd.h = Threshold(level)
set i = Total
endif
set i = i + 1
endloop
endif
set learner = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit learner = GetTriggerUnit()
local boolean okey = (GetLearnedSkill() == SPELL_ID) and (not IsUnitIllusion(learner))
set learner = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(GlideTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(GlideTrg, Condition(function Conditions))
call TriggerAddAction(GlideTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=30
//TESH.alwaysfold=0
scope Replenish initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'Arpb' //Spell Replenish rawcode
private constant integer ITEM1_UPGRADE = 'odef' //Item Eve Feather
private constant real UPGRADE1_RADIUS = 200.0 //Upgrade 1 effect
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_NORMAL //Spell attack type
private constant string SPELL_EFFECT = "Abilities\\Spells\\Human\\FlakCannons\\FlakTarget.mdl" //Knock effect
endglobals
//Replenish life
private function Life takes integer level returns real
if(level == 1) then
return 240.0
elseif(level == 2) then
return 360.0
elseif(level == 3) then
return 480.0
else
return 0.0
endif
endfunction
//Replenish mana
private function Mana takes integer level returns real
if(level == 1) then
return 120.0
elseif(level == 2) then
return 180.0
elseif(level == 3) then
return 300.0
else
return 0.0
endif
endfunction
//Radius
private function Radius takes integer level returns real
return 500.0 + (0.0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false)
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Replenish_Data sd = Replenish_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local unit f = null
local real life = Life(level) + (Life(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
local real mana = Mana(level) + (Mana(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
local real radius = Radius(level)
if(IsUnitHasItemType(caster, ITEM1_UPGRADE) > 0) then
set radius = radius + UPGRADE1_RADIUS
endif
if(IsTerrainPathable(casterX, casterY, PATHING_TYPE_FLOATABILITY)) then
set life = life / 3
set mana = mana / 3
endif
call GroupEnumUnitsInRange(all, casterX, casterY, radius, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitAlly(f, owner)) then
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call SetUnitState(f, UNIT_STATE_LIFE, GetUnitState(f, UNIT_STATE_LIFE) + life * ETHEREAL_BONUS)
call SetUnitState(f, UNIT_STATE_MANA, GetUnitState(f, UNIT_STATE_MANA) + mana * ETHEREAL_BONUS)
else
call SetUnitState(f, UNIT_STATE_LIFE, GetUnitState(f, UNIT_STATE_LIFE) + life)
call SetUnitState(f, UNIT_STATE_MANA, GetUnitState(f, UNIT_STATE_MANA) + mana)
endif
endif
endloop
set caster = null
set owner = null
set f = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(ReplenishTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(ReplenishTrg, Condition(function Conditions))
call TriggerAddAction(ReplenishTrg, function Actions)
//Setting globals
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=47
//TESH.alwaysfold=0
scope ParalyzingGaze initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A09T' //Spell Paralyzing Gaze rawcode
private constant integer ABILITY_ID = 'A02A' //Spell Paralyzing Gaze (Evasion) rawcode
private constant integer CAST_ID = 'ACtb' //Cast Paralyzing Gaze (Dummy) rawcode
private constant integer CAST1_ID = 'A0A4' //Cast Paralyzing Gaze (Dummy) rawcode
private constant integer BUFF_ID = 'B031' //Buff Paralyzing Gaze (Dummy) rawcode
private constant integer ITEM1_UPGRADE = 'I021' //Item Dragon Frostscale
private constant integer ITEM2_UPGRADE = 'ajen' //Item Ralex of Sharpstrike
private constant integer UPGRADE1_SIZE = 10 //Upgrade item 1 size
private constant integer UPGRADE1_CAST_ID = 'AHtb' //Upgrade item 1 stunner rawcode
private constant real UPGRADE2_RADIUS = 1000.0 //Upgrade item 2 radius
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_NORMAL //Spell attack type
private constant string SPECIAL_EFFECT = "Abilities\\Weapons\\ChimaeraAcidMissile\\ChimaeraAcidMissile.mdl" //Effect blast targets
private constant string SPELL_EFFECT = "Abilities\\Spells\\Other\\Drain\\DrainCaster.mdl" //Effect caster
private constant string TARGET_EFFECT = "Abilities\\Spells\\Other\\Parasite\\ParasiteTarget.mdl" //Effect target
endglobals
//Duration
private function Duration takes integer level returns real
return 10.0 + (0.0 * level)
endfunction
//Point required to stun
private function Point takes integer level returns integer
return 3 + (0 * level)
endfunction
//Size unit can be poisoned
private function Size takes integer level returns integer
return 10 + (0 * level)
endfunction
//Check interval
private function Check_Interval takes integer level returns real
return 1.0 + (0.0 * level)
endfunction
//Radius check to get caster
private function Radius_Check takes integer level returns real
return 300.0 + (0.0 * level)
endfunction
//Radius unit area
private function Radius takes integer level returns real
return 1000.0 + (0.0 * level)
endfunction
//Damage gazing unit
private function Damage takes integer level returns real
if(level == 1) then
return 80.0
elseif(level == 2) then
return 160.0
else
return 0.0
endif
endfunction
//Targets affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_FLYING) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Caster
private function Targets_Caster takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(GetUnitAbilityLevel(target, SPELL_ID) > 0) and /*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.5
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct ParalyzingGaze_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of ability
unit array t[20] //Target
integer array p[20] //Point damage
effect array fx[20] //Effect
real d //Time duration damage
integer s //Size target
integer sm //Max size
real i //Interval
real im //Interval max
real r //Radius check
real pt //Point required
real dr //Radius
real dd //Damage
effect e //Effect
integer it1 //Item 1 upgrade
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private ParalyzingGaze_Data array Ar[10]
private group all
private boolexpr bexpr
private group all2
private boolexpr bexprCaster
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Pick_Caster takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets_Caster(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local ParalyzingGaze_Data sd
local integer i = 0
local integer j = 0
local real x = 0.0
local real y = 0.0
local unit f = null
local real fX = 0.0
local real fY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local real tX = 0.0
local real tY = 0.0
local real rad = 0.0
local real face = 0.0
local unit g = null
local boolean exist = false
local integer id = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.d > 0.0) then
set sd.d = sd.d - Interval()
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
call GroupEnumUnitsInRange(all, x, y, sd.dr, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
if(IsUnitType(f, UNIT_TYPE_HERO)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = x - fX
set dy = y - fY
set distance = SquareRoot(dx * dx + dy * dy)
set face = GetUnitFacing(f)
set rad = face * bj_DEGTORAD
set tX = fX + distance * Cos(rad)
set tY = fY + distance * Sin(rad)
set id = -1
set j = 0
loop
exitwhen(j >= sd.s)
if(sd.t[j] == f) then
set id = j
set j = sd.s
endif
set j = j + 1
endloop
set exist = false
call GroupEnumUnitsInRange(all2, tX, tY, sd.r, bexprCaster)
loop
set g = FirstOfGroup(all2)
exitwhen(g == null)
call GroupRemoveUnit(all2, g)
if(g == sd.u and (not exist)) then
set exist = true
call UnitDamageTarget(sd.u, f, sd.dd, true, false, A_TYPE, D_TYPE, null)
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, f, "origin"))
if(sd.it1 > 0 and IsUnitType(f, UNIT_TYPE_HERO)) then
call TargetCast(sd.o, x, y, 0.5, UPGRADE1_CAST_ID, sd.l, "thunderbolt", 0, f)
endif
if(id < 0) then
if(sd.s < sd.sm) then
set sd.t[sd.s] = f
set sd.p[sd.s] = 1
set sd.fx[sd.s] = AddSpecialEffectTarget(TARGET_EFFECT, f, "overhead")
set sd.s = sd.s + 1
if(GetUnitAbilityLevel(f, BUFF_ID) <= 0) then
call TargetCast(sd.o, fX, fY, 0.5, CAST1_ID, sd.l, "slow", 0, f)
endif
endif
else
if(sd.p[id] < sd.pt) then
set sd.p[id] = sd.p[id] + 1
if(GetUnitAbilityLevel(f, BUFF_ID) <= 0) then
call TargetCast(sd.o, fX, fY, 0.5, CAST1_ID, sd.l, "slow", 0, f)
endif
else
set sd.p[id] = 1
call UnitDamageTarget(sd.u, f, sd.dd * 2, true, false, A_TYPE, D_TYPE, null)
call TargetCast(sd.o, fX, fY, 0.5, CAST_ID, sd.l, "creepthunderbolt", 0, f)
//call SetUnitMoveSpeed(f, GetUnitDefaultMoveSpeed(f))
if(GetUnitAbilityLevel(f, BUFF_ID) <= 0) then
call UnitRemoveAbility(f, BUFF_ID)
endif
endif
endif
endif
endloop
else
if(GetUnitAbilityLevel(f, BUFF_ID) <= 0) then
call TargetCast(sd.o, fX, fY, 0.5, CAST1_ID, sd.l, "slow", 0, f)
endif
endif
endif
endloop
endif
else
if(sd.e != null) then
call DestroyEffect(sd.e)
set sd.e = null
endif
set j = 0
loop
exitwhen(j >= sd.s)
if(sd.t[j] != null) then
//call SetUnitMoveSpeed(sd.t[j], GetUnitDefaultMoveSpeed(sd.t[j]))
if(GetUnitAbilityLevel(sd.t[j], BUFF_ID) <= 0) then
call UnitRemoveAbility(sd.t[j], BUFF_ID)
endif
set sd.t[j] = null
endif
if(sd.fx[j] != null) then
call DestroyEffect(sd.fx[j])
set sd.fx[j] = null
endif
set j = j + 1
endloop
call UnitRemoveAbility(sd.u, ABILITY_ID)
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
set g = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local ParalyzingGaze_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local integer i = 0
local boolean exist = false
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
local integer item2 = IsUnitHasItemType(caster, ITEM2_UPGRADE)
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_SK_ParalyzingGaze
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set sd.l = level
set sd.d = Duration(level)
set sd.sm = Size(level)
set sd.im = Check_Interval(level)
set sd.r = Radius_Check(level)
set sd.pt = Point(level)
set sd.dr = Radius(level)
set sd.dd = Damage(level)
set sd.it1 = item1
if(item1 > 0) then
set sd.pt = 1
endif
if(item2 > 0) then
set sd.r = sd.r + UPGRADE2_RADIUS
endif
set exist = true
endif
endloop
if(not exist) then
set sd = ParalyzingGaze_Data.create()
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.d = Duration(level)
set sd.s = 0
set sd.sm = Size(level)
set sd.i = 0.0
set sd.im = Check_Interval(level)
set sd.r = Radius_Check(level)
set sd.pt = Point(level)
set sd.dr = Radius(level)
set sd.dd = Damage(level) + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.e = AddSpecialEffectTarget(SPELL_EFFECT, caster, "head")
set sd.it1 = item1
if(item1 > 0) then
set sd.pt = 1
endif
if(item2 > 0) then
set sd.r = sd.r + UPGRADE2_RADIUS
endif
call UnitAddAbility(caster, ABILITY_ID)
call SetPlayerAbilityAvailable(owner, ABILITY_ID, false)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
set caster = null
set owner = null
set s = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(ParalyzingGazeTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(ParalyzingGazeTrg, Condition(function Conditions))
call TriggerAddAction(ParalyzingGazeTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
set all2 = CreateGroup()
set bexprCaster = Condition(function Pick_Caster)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY_ID)
call AbilityPreload(CAST_ID)
call AbilityPreload(CAST1_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
call Preload(TARGET_EFFECT)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
globals
group Illusion = CreateGroup()
hashtable Illusion_Ht = InitHashtable()
constant integer ILLUSION_UNIT_KEY = 0
constant integer ILLUSION_DAMAGE_KEY = 1
constant integer ILLUSION_ORI_KEY = 2 //Ori key
constant integer ILLUSION_WRAITH_TARGET_KEY = 3 //Invisible targetted key
constant integer ILLUSION_WRAITH_CAST_KEY = 4 //Cast key
constant integer ILLUSION_WRAITH_EFFECT_KEY = 5 //Effect key
constant integer ILLUSION_WRAITH_LEVEL_KEY = 6 //Level key
constant integer ILLUSION_HALLUCINATION_X_KEY = 7 //X
constant integer ILLUSION_HALLUCINATION_Y_KEY = 8 //Y
constant integer ILLUSION_HALLUCINATION_TIME_KEY = 9 //Time
constant integer ILLUSION_HALLUCINATION_LEVEL_KEY = 10 //Level key
constant integer ILLUSION_HALLUCINATION_DAMAGE_KEY = 11 //Level key
endglobals
scope ConjuringImage initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A0A9' //Spell Conjuring Image rawcode
private constant integer CASTER_ID = 'n02E' //Unit Illusioner rawcode
private constant integer UNIT_ID = 'Naka' //Unit First Conjurer rawcode
private constant integer ANIME = 1 //Animation number
private constant integer ITEM1_UPGRADE = 'cnob' //Item Horn of Prominence
private constant integer UPGRADE1_TOTAL_ILLUSIONS = 1 //Upgrade 1 item
endglobals
//Total Illusion
private function Total_Illusion takes integer level returns integer
if(level == 1) then
return 4
elseif(level == 2) then
return 5
elseif(level == 3) then
return 6
elseif(level == 4) then
return 7
else
return 3
endif
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct ConjuringImage_Data
unit u //Unit caster
player o //Owner
integer c //Count
integer cm //Max count
endstruct
//----------------------------------------------------------------
globals
private group copy
private integer Total
private ConjuringImage_Data array Ar[10]
endglobals
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetSummoningUnit()
local integer casterID = GetUnitUserData(caster)
local integer casterType = GetUnitTypeId(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
local integer count = 0
local unit summoned = GetSummonedUnit()
local integer summonedId = 0
local unit hero = GetHero(owner)
local unit f = null
local ConjuringImage_Data sd
local integer i = 0
local boolean kill = false
set copy = CopyGroup(Illusion)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == owner) then
if(IsUnitIllusion(f)) then
set count = count + 1
endif
endif
endloop
if(casterType == UNIT_ID or casterType == CASTER_ID) then
call SetUnitAnimationByIndex(caster, ANIME)
call SetUnitAnimationByIndex(summoned, ANIME)
call SetUnitFacing(summoned, bj_RADTODEG * Atan2(GetUnitY(summoned) - GetUnitY(caster), GetUnitX(summoned) - GetUnitX(caster)))
else
call SetUnitPosition(summoned, casterX, casterY)
endif
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster or (casterType == CASTER_ID and owner == sd.o)) then
if(IsUnitHasItemType(caster, ITEM1_UPGRADE) > 0) then
set sd.cm = Total_Illusion(GetUnitAbilityLevel(caster, SPELL_ID)) + UPGRADE1_TOTAL_ILLUSIONS
else
set sd.cm = Total_Illusion(GetUnitAbilityLevel(caster, SPELL_ID))
if(IsUnitHasItemType(hero, ITEM1_UPGRADE) > 0) then
set sd.cm = Total_Illusion(GetUnitAbilityLevel(caster, SPELL_ID)) + UPGRADE1_TOTAL_ILLUSIONS
endif
endif
if(count >= sd.cm) then
set kill = true
set copy = CopyGroup(Illusion)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == owner and kill) then
call KillUnit(f)
set kill = false
endif
endloop
set sd.c = sd.c + 1
set summonedId = GetUnitUserData(summoned)
call GroupAddUnit(Illusion, summoned)
call SaveUnitHandle(Illusion_Ht, summonedId, ILLUSION_UNIT_KEY, hero)
call SaveBoolean(Illusion_Ht, summonedId, ILLUSION_DAMAGE_KEY, false)
call SaveBoolean(Illusion_Ht, summonedId, ILLUSION_DAMAGE_KEY, false)
else
set sd.c = sd.c + 1
set summonedId = GetUnitUserData(summoned)
call GroupAddUnit(Illusion, summoned)
call SaveUnitHandle(Illusion_Ht, summonedId, ILLUSION_UNIT_KEY, hero)
call SaveBoolean(Illusion_Ht, summonedId, ILLUSION_DAMAGE_KEY, false)
endif
set i = Total
endif
set i = i + 1
endloop
set caster = null
set summoned = null
set hero = null
set f = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return IsUnitIllusion(GetSummonedUnit()) and /*
*/(GetUnitTypeId(GetSummonedUnit()) == UNIT_ID or /*
*/GetUnitTypeId(GetSummonedUnit()) == CASTER_ID)
endfunction
//----------------------------------------------------------------
private function Die_Actions takes nothing returns nothing
local unit dying = GetTriggerUnit()
local integer dyingId = GetUnitUserData(dying)
local player owner = GetOwningPlayer(dying)
local ConjuringImage_Data sd
local integer i = 0
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.o == owner) then
set sd.c = sd.c - 1
set i = Total
endif
set i = i + 1
endloop
call GroupRemoveUnit(Illusion, dying)
call FlushChildHashtable(Illusion_Ht, dyingId)
set dying = null
endfunction
//----------------------------------------------------------------
private function Die_Conditions takes nothing returns boolean
return IsUnitInGroup(GetTriggerUnit(), Illusion)
endfunction
//----------------------------------------------------------------
private function Cast_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_FC_ConjuringImage
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
set caster = null
set s = null
endfunction
//----------------------------------------------------------------
private function Cast_Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local unit learner = GetLearningUnit()
local integer learnerType = GetUnitTypeId(learner)
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
local player owner = GetOwningPlayer(learner)
local ConjuringImage_Data sd
local integer i = 0
local boolean exist = false
if(GetUnitAbilityLevel(learner, SPELL_ID) <= 1) then
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set exist = true
set sd.cm = Total_Illusion(level)
endif
set i = i + 1
endloop
if(not exist) then
set sd = ConjuringImage_Data.create()
set sd.u = learner
set sd.o = owner
set sd.c = 0
set sd.cm = Total_Illusion(level)
set Total = Total + 1
set Ar[Total - 1] = sd
endif
else
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set sd.cm = Total_Illusion(level)
endif
set i = i + 1
endloop
endif
set learner = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
local unit learner = GetTriggerUnit()
local boolean okey = (GetUnitTypeId(learner) == UNIT_ID) and (not IsUnitIllusion(GetTriggerUnit()))
set learner = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(ConjuringImageTrg, EVENT_PLAYER_UNIT_SUMMON)
call TriggerAddCondition(ConjuringImageTrg, Condition(function Conditions))
call TriggerAddAction(ConjuringImageTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(ConjuringImageDieTrg, EVENT_PLAYER_UNIT_DEATH)
call TriggerRegisterAnyUnitEventBJ(ConjuringImageDieTrg, EVENT_PLAYER_UNIT_CHANGE_OWNER)
call TriggerRegisterAnyUnitEventBJ(ConjuringImageDieTrg, EVENT_PLAYER_UNIT_DECAY)
call TriggerAddCondition(ConjuringImageDieTrg, Condition(function Die_Conditions))
call TriggerAddAction(ConjuringImageDieTrg, function Die_Actions)
call TriggerRegisterAnyUnitEventBJ(ConjuringImageCastTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(ConjuringImageCastTrg, Condition(function Cast_Conditions))
call TriggerAddAction(ConjuringImageCastTrg, function Cast_Actions)
call TriggerRegisterAnyUnitEventBJ(ConjuringImageLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(ConjuringImageLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(ConjuringImageLearnTrg, function Learn_Actions)
//Setting globals
set copy = CreateGroup()
set Total = 0
//Preload
call AbilityPreload(SPELL_ID)
endfunction
endscope
//TESH.scrollpos=29
//TESH.alwaysfold=0
scope Juxtapose initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A0AA' //Spell Juxtapose rawcode
private constant integer CASTER_ID = 'n02E' //Unit Illusioner rawcode
private constant integer CAST_ID = 'A0AD' //Cast Illusion (dummy) rawcode
private constant integer ANIME = 1 //Animation number
private constant real RADIUS = 500.0 //Radius
private constant integer MAX_OFFSET_DISTANCE = 500 //Max distance to offset randomly
private constant integer ITEM1_UPGRADE = 'I017' //Item Platinum Sprinter
private constant real UPGRADE1_DURATION = 0.1 //Upgrade 1 item
private constant damagetype D_TYPE = DAMAGE_TYPE_MIND //Spell attack type
private constant attacktype A_TYPE = ATTACK_TYPE_HERO //Spell damage type
private constant string SPELL_EFFECT = "Abilities\\Spells\\Human\\Feedback\\ArcaneTowerAttack.mdl" //Spell effect to enemy
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Items\\AIil\\AIilTarget.mdl" //Special effect
endglobals
//Damage
private function Damage takes integer level returns real
if(level == 1) then
return 30.0
elseif(level == 2) then
return 40.0
elseif(level == 3) then
return 60.0
else
return 0.0
endif
endfunction
//Interval
private function Duration takes integer level returns real
if(level == 1) then
return 0.5
elseif(level == 2) then
return 0.5
elseif(level == 3) then
return 0.5
else
return 0.0
endif
endfunction
//Radius affected
private function Radius takes integer level returns real
return 300.0
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitIllusion(target) == true)
endfunction
//Unit affected
private function TargetsEnemy takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_FLYING) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Juxtapose_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level
boolean c //Cast
real x //X of target
real y //Y of target
real i //Interval
real im //Interval max
real dd //Damage
endstruct
//----------------------------------------------------------------
globals
private group all
private group all2
private boolexpr bexpr
private boolexpr bexprEnemy
private location loc
private timer Tim
private integer Total
private Juxtapose_Data array Ar[10]
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
return Targets(GetFilterUnit())
endfunction
//----------------------------------------------------------------
private function PickEnemy takes nothing returns boolean
return TargetsEnemy(GetFilterUnit())
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Juxtapose_Data sd
local integer i = 0
local unit swaping = null
local real tX = 0.0
local real tY = 0.0
local unit f = null
local unit g = null
local real damage = 0.0
local integer total = 0
local integer randomDistance = 0
local integer randomAngle = 0
local real targetFacing = 0.0
local real x = 0.0
local real y = 0.0
local real facing = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.c) then
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
set swaping = sd.u
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
set facing = GetUnitFacing(sd.u)
call SetUnitAnimation(sd.u, "attack")
call GroupEnumUnitsInRange(all2, x, y, Radius(sd.l), bexprEnemy)
loop
set g = FirstOfGroup(all2)
exitwhen(g == null)
call GroupRemoveUnit(all2, g)
if(IsUnitEnemy(g, sd.o)) then
if(IsUnitType(g, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, g, sd.dd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, g, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, g, "origin"))
endif
endloop
call GroupEnumUnitsInRange(all, sd.x, sd.y, RADIUS, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(GetOwningPlayer(f) == sd.o) then
set total = total + 1
//set randomDistance = GetRandomInt(0, MAX_OFFSET_DISTANCE)
//set randomAngle = GetRandomInt(0, 360)
//set tX = sd.x + randomDistance * Cos(randomAngle * bj_DEGTORAD)
//set tY = sd.y + randomDistance * Sin(randomAngle * bj_DEGTORAD)
if(FirstOfGroup(all) != null) then
set tX = GetUnitX(f)
set tY = GetUnitY(f)
set targetFacing = GetUnitFacing(f)
else
set tX = x
set tY = y
set targetFacing = facing
endif
call DestroyEffect(AddSpecialEffect(SPECIAL_EFFECT, tX, tY))
call SetUnitX(swaping, tX)
call SetUnitY(swaping, tY)
call SetUnitFacing(swaping, targetFacing)
if(IsUnitIllusion(f)) then
call PauseUnit(f, true)
//call SetUnitAnimationByIndex(f, 1)
call SetUnitAnimation(f, "attack")
call PauseUnit(f, false)
endif
call GroupEnumUnitsInRange(all2, tX, tY, Radius(sd.l), bexprEnemy)
loop
set g = FirstOfGroup(all2)
exitwhen(g == null)
call GroupRemoveUnit(all2, g)
if(IsUnitEnemy(g, sd.o)) then
if(IsUnitType(g, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, g, sd.dd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, g, sd.dd, true, false, A_TYPE, D_TYPE, null)
endif
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, g, "origin"))
endif
endloop
set swaping = f
endif
endloop
endif
else
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set swaping = null
set f = null
set g = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Juxtapose_Data sd = Juxtapose_Data.create()
local unit caster = GetTriggerUnit()
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local real casterFace = GetUnitFacing(caster)
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local real targetX = 0.0
local real targetY = 0.0
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_FC_Juxtapose
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.c = true
set sd.x = targetX
set sd.y = targetY
set sd.i = 0.0
set sd.im = Duration(level)
set sd.dd = Damage(level) + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
if(item1 > 0) then
set sd.im = sd.im - UPGRADE1_DURATION
endif
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
set s = null
endfunction
//----------------------------------------------------------------
private function Stop_Actions takes nothing returns nothing
local Juxtapose_Data sd
local unit caster = GetTriggerUnit()
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set sd.c = false
set i = Total
endif
set i = i + 1
endloop
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(JuxtaposeTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(JuxtaposeTrg, Condition(function Conditions))
call TriggerAddAction(JuxtaposeTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(JuxtaposeStopTrg, EVENT_PLAYER_UNIT_SPELL_ENDCAST)
call TriggerAddCondition(JuxtaposeStopTrg, Condition(function Conditions))
call TriggerAddAction(JuxtaposeStopTrg, function Stop_Actions)
//Setting globals
set all = CreateGroup()
set all2 = CreateGroup()
set bexpr = Condition(function Pick)
set bexprEnemy = Condition(function PickEnemy)
set loc = Location(0, 0)
set Tim = CreateTimer()
set Total = 0
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
endfunction
endscope
//TESH.scrollpos=3
//TESH.alwaysfold=0
scope Disappearance initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A0AF' //Spell Disappearance rawcode
private constant integer CAST_ID = 'A0AE' //Cast Disappearance (Dummy) rawcode
private constant integer ITEM1_UPGRADE = 'I00D' //Item Assassin Hood
private constant integer UPGRADE1_MAX_LEVEL = 2 //Upgrade 1 effect
endglobals
//Distance from caster
private function Distance takes integer level returns real
if(level == 1) then
return 400.0
elseif(level == 2) then
return 600.0
elseif(level == 3) then
return 800.0
else
return 0.0
endif
endfunction
//Max level
private function Max_Level takes integer level returns integer
if(level == 1) then
return 5
elseif(level == 2) then
return 7
elseif(level == 3) then
return 10
else
return 0
endif
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
globals
private group copy
endglobals
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local player owner = GetOwningPlayer(caster)
local unit f = null
local real fX = 0.0
local real fY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local integer stack = 1
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
local integer spellId = GetSpellAbilityId()
call TriggerSleepAction(1.0)
if(item1 > 0) then
set stack = stack + UPGRADE1_MAX_LEVEL
endif
set copy = CopyGroup(Illusion)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == owner and /*
*/IsUnitIllusion(f)) then
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set dx = casterX - fX
set dy = casterY - fY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= Distance(level)) then
if(spellId == 'A0A9') then
call TargetCast(owner, fX, fY, 2.0, CAST_ID, stack, "invisibility", 0, f)
else
call TargetCast(owner, fX, fY, 0.5, CAST_ID, stack, "invisibility", 0, f)
endif
set stack = stack + 1
endif
endif
endloop
if(spellId == 'A0A9') then
call TargetCast(owner, casterX, casterY, 2.0, CAST_ID, stack, "invisibility", 0, caster)
else
call TargetCast(owner, casterX, casterY, 0.5, CAST_ID, stack, "invisibility", 0, caster)
endif
set caster = null
set owner = null
set f = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetUnitAbilityLevel(GetTriggerUnit(), SPELL_ID) > 0
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(DisappearanceTrg, EVENT_PLAYER_UNIT_SPELL_ENDCAST)
call TriggerAddCondition(DisappearanceTrg, Condition(function Conditions))
call TriggerAddAction(DisappearanceTrg, function Actions)
//Setting globals
set copy = CreateGroup()
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
endfunction
endscope
//TESH.scrollpos=24
//TESH.alwaysfold=0
globals
group IllusionHit = CreateGroup()
endglobals
scope Hallucination initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A0AB' //Spell Hallucination rawcode
private constant integer CASTER_ID = 'n02E' //Unit Illusioner rawcode
private constant integer CAST_ID = 'A0AC' //Cast Hallucination rawcode
private constant integer CAST1_ID = 'A0AD' //Cast Illusion (dummy) rawcode
private constant real DISTANCE = 90.0 //Distance to teleport to target
private constant real STAY_TIME = 1.0 //Staying time
private constant string SPELL_EFFECT = "Abilities\\Spells\\Undead\\Curse\\CurseTarget.mdl" //Spell effect
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Items\\AIil\\AIilTarget.mdl" //Special effect
private constant integer HAS_GO_KEY = 0 //Illusion has hit
private constant integer ITEM1_UPGRADE = 'I01K' //Item Void Artifice
private constant integer UPGRADE1_COUNT = 3 //Upgrade 1 effect
private constant damagetype D_TYPE = DAMAGE_TYPE_MIND //Spell attack type
private constant attacktype A_TYPE = ATTACK_TYPE_MAGIC //Spell damage type
endglobals
//Count strike
private function Count takes integer level returns integer
if(level == 1) then
return 5
elseif(level == 2) then
return 8
elseif(level == 3) then
return 12
else
return 0
endif
endfunction
//Damage
private function Damage takes integer level returns real
if(level == 1) then
return 20.0
elseif(level == 2) then
return 30.0
elseif(level == 3) then
return 40.0
else
return 0.0
endif
endfunction
//Interval
private function Interval takes nothing returns real
return 0.2
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct Hallucination_Data
group illu //Group illusion
unit u //Unit caster
unit t //Target unit
player o //Owner of caster
integer l //Level of spell
integer id //Caster id
hashtable ht //Hashtable illusion has hit
real tX //Target y
real tY //Target x
integer c //Count hit
integer mc //Max count hit
effect e //Target effect
endstruct
//----------------------------------------------------------------
globals
private group copy
private Hallucination_Data array Ar[10]
private timer Tim
private integer Total
private location loc
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local Hallucination_Data sd
local integer i = 0
local unit f = null
local real fX = 0.0
local real fY = 0.0
local integer fID = 0
local integer randomAngle = 0
local integer hit = 0
local real tX = 0.0
local real tY = 0.0
local boolean go = false
local boolean exist = false
local real time = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(((sd.t != null and (not IsUnitDead(sd.t))) or (sd.t == null)) and sd.c <= sd.mc) then
set copy = CopyGroup(sd.illu)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(IsUnitDead(f)) then
set fID = GetUnitUserData(f)
call GroupRemoveUnit(sd.illu, f)
//call SaveBoolean(sd.ht, fID, HAS_GO_KEY, false)
call FlushChildHashtable(sd.ht, fID)
endif
endloop
set go = true
set copy = CopyGroup(sd.illu)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == sd.o and go) then
call GroupRemoveUnit(sd.illu, f)
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set fID = GetUnitUserData(f)
call SaveReal(Illusion_Ht, fID, ILLUSION_HALLUCINATION_X_KEY, fX)
call SaveReal(Illusion_Ht, fID, ILLUSION_HALLUCINATION_Y_KEY, fY)
call SaveReal(Illusion_Ht, fID, ILLUSION_HALLUCINATION_TIME_KEY, STAY_TIME)
call SaveInteger(Illusion_Ht, fID, ILLUSION_HALLUCINATION_LEVEL_KEY, sd.l)
call SaveBoolean(Illusion_Ht, fID, ILLUSION_HALLUCINATION_DAMAGE_KEY, true)
call SaveInteger(Illusion_Ht, fID, ILLUSION_ORI_KEY, sd.id)
call GroupAddUnit(IllusionHit, f)
call UnitAddAbility(f, 'Arav')
call UnitRemoveAbility(f, 'Arav')
call SetUnitPathing(f, false)
if(sd.t == null) then
set tX = sd.tX
set tY = sd.tY
else
set tX = GetUnitX(sd.t)
set tY = GetUnitY(sd.t)
endif
set randomAngle = GetRandomInt(0, 360)
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, f, "origin"))
call SetUnitPosition(f, tX + DISTANCE * Cos(randomAngle * bj_DEGTORAD), tY + DISTANCE * Sin(randomAngle * bj_DEGTORAD))
call SaveBoolean(sd.ht, fID, HAS_GO_KEY, true)
set sd.c = sd.c + 1
if(sd.t != null) then
call IssueTargetOrder(f, "smart", sd.t)
endif
set go = false
endif
endloop
set copy = CopyGroup(Illusion)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set fID = GetUnitUserData(f)
if(GetOwningPlayer(f) == sd.o and /*
*/IsUnitIllusion(f) and /*
*/(not IsUnitInGroup(f, sd.illu)) and /*
*/(LoadBoolean( sd.ht, fID, HAS_GO_KEY) or /*
*/(not HaveSavedBoolean( sd.ht, fID, HAS_GO_KEY)))) then
call GroupAddUnit(sd.illu, f)
call SaveBoolean(sd.ht, fID, HAS_GO_KEY, false)
endif
endloop
else
call DestroyEffect(sd.e)
set sd.e = null
set copy = CopyGroup(sd.illu)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
endloop
set sd.u = null
set sd.t = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
set exist = false
set copy = CopyGroup(IllusionHit)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set exist = true
set fID = GetUnitUserData(f)
set time = LoadReal(Illusion_Ht, fID, ILLUSION_HALLUCINATION_TIME_KEY)
if(time > 0) then
call SaveReal(Illusion_Ht, fID, ILLUSION_HALLUCINATION_TIME_KEY, time - Interval())
else
call SetUnitPathing(f, true)
call GroupRemoveUnit(IllusionHit, f)
endif
endloop
if(Total == 0 and not exist) then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local Hallucination_Data sd
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local unit target = GetSpellTargetUnit()
local boolean isNull = Ar[Total] == null
local unit f = null
local integer fID = 0
local integer i = 0
local boolean exist = false
local boolean hasIllusion = false
local integer totalIllusion = 0
local integer diff = 0
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set exist = true
set i = Total
call DestroyEffect(sd.e)
set copy = CopyGroup(sd.illu)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
endloop
endif
set i = i + 1
endloop
if(not exist) then
if(isNull) then
set sd = Hallucination_Data.create()
set sd.illu = CreateGroup()
set sd.ht = InitHashtable()
else
set sd = Ar[Total]
endif
endif
set sd.u = caster
set sd.o = owner
set sd.t = target
set sd.c = 0
set sd.mc = Count(level)
if(item1 > 0) then
set sd.mc = sd.mc + UPGRADE1_COUNT
endif
set sd.l = level
set sd.id = GetUnitUserData(caster)
if(target == null) then
set loc = GetSpellTargetLoc()
set sd.tX = GetLocationX(loc)
set sd.tY = GetLocationY(loc)
set sd.e = AddSpecialEffect(SPELL_EFFECT, sd.tX, sd.tY)
else
set sd.tX = GetUnitX(target)
set sd.tY = GetUnitY(target)
set sd.e = AddSpecialEffectTarget(SPELL_EFFECT, target, "overhead")
endif
set copy = CopyGroup(Illusion)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
set fID = GetUnitUserData(f)
if(GetOwningPlayer(f) == sd.o and IsUnitIllusion(f) and (not IsUnitInGroup(f, sd.illu))) then
call GroupAddUnit(sd.illu, f)
call SaveBoolean(sd.ht, fID, HAS_GO_KEY, false)
call PauseUnit(f, true)
call SetUnitAnimation(f, "spell")
call PauseUnit(f, false)
set hasIllusion = true
set totalIllusion = totalIllusion + 1
endif
endloop
if(totalIllusion <= 0) then
if(totalIllusion > sd.mc) then
set diff = totalIllusion - sd.mc
else
set diff = sd.mc - totalIllusion
endif
endif
set i = 0
loop
exitwhen(i >= diff)
call DummyTargetCast(CASTER_ID, owner, casterX, casterY, 0.5, CAST1_ID, 1, "", 852274, caster)
set i = i + 1
endloop
if(not exist) then
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
endif
set caster = null
set target = null
set owner = null
set f = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
function Hallucination_onDamage takes unit attacker, unit attacked, real amount returns nothing
local integer attackerID = GetUnitUserData(attacker)
local integer level = LoadInteger(Illusion_Ht, attackerID, ILLUSION_HALLUCINATION_LEVEL_KEY)
local player owner = GetOwningPlayer(attacker)
local real damage = 0.0
local integer oriID = 0
set damage = Damage(level)
set oriID = LoadInteger(Illusion_Ht, attackerID, ILLUSION_ORI_KEY)
set damage = damage + (damage * LoadInteger(MagicDamage_Ht, oriID, 0) * 0.01)
call SaveBoolean(Illusion_Ht, attackerID, ILLUSION_HALLUCINATION_DAMAGE_KEY, false)
call TargetCast(owner, GetUnitX(attacked), GetUnitY(attacked), 0.5, CAST_ID, level, "thunderbolt", 0, attacked)
call UnitDamageTarget(attacker, attacked, damage, true, false, A_TYPE, D_TYPE, null)
call GroupRemoveUnit(IllusionHit, attacker)
call SetUnitPathing(attacker, true)
call IssueImmediateOrder(attacker, "stop")
set attacker = null
set attacked = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger HallucinationTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(HallucinationTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(HallucinationTrg, Condition(function Conditions))
call TriggerAddAction(HallucinationTrg, function Actions)
//Setting globals
set copy = CreateGroup()
set Tim = CreateTimer()
set Total = 0
set loc = Location(0, 0)
//Preload
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
call AbilityPreload(CAST1_ID)
endfunction
endscope
//TESH.scrollpos=283
//TESH.alwaysfold=0
scope GatesDeception initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A0AG' //Spell Gates of Deception rawcode
private constant integer CASTER_ID = 'n02E' //Unit Illusioner rawcode
private constant integer CAST_ID = 'A0AH' //Cast illusion rawcode
private constant integer UNIT_ID = 'Naka' //Unit Draenei Sage rawcode
private constant integer DUMMY_ID = 'n02F' //Dummy Gate rawcode
private constant real RADIUS_PER_DUMMY = 100.0 //Radius
private constant real DISTANCE_PER_DUMMY = 5.0 //Distance per dummy
private constant real MAX_DISTANCE_MOVE = 50.0 //Max distance
private constant real MIN_DISTANCE_MOVE = 20.0 //Min distance
private constant integer GATE_LEVEL = 5 //Gate level total
private constant integer ITEM1_UPGRADE = 'I009' //Item Prime Lucent
private constant integer ITEM2_UPGRADE = 'rugt' //Item Aphotical Scythe
private constant real UPGRADE1_DURATION = 5.0 //Upgrade 1 time
private constant integer UPGRADE1_GATE_LEVEL = 1 //Upgrade 1 gate level
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Items\\AIil\\AIilTarget.mdl" //Special effect
private constant integer SOUND_VOLUME = 200 //Sound volume
endglobals
//Time gate open
private function Time_Duration takes integer level returns real
return 15.0 + (0.0 * level)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false)
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct GatesDeception_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of spell
integer m //Moves
real t //Time gate open
real x //Area x
real y //Area y
integer td //Total dummies
unit array d[5] //Dummies
boolean b //Block
boolean up //Upgrade spell
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private GatesDeception_Data array Ar[100]
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
return Targets(GetFilterUnit())
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local GatesDeception_Data sd
local integer i = 0
local integer j = 0
local unit f = null
local real x = 0.0
local real y = 0.0
local real tX = 0.0
local real tY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local real distanceDummy = 0.0
local real distanceMove = 0.0
local real fX = 0.0
local real fY = 0.0
local real angle = 0.0
local real rad = 0.0
local boolean okey = false
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.t > 0.0) then
set sd.t = sd.t - Interval()
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
set j = 0
loop
exitwhen(j >= sd.td)
set tX = GetUnitX(sd.d[j])
set tY = GetUnitY(sd.d[j])
set dx = x - tX
set dy = y - tY
set distance = SquareRoot(dx * dx + dy * dy)
set distanceDummy = (MAX_DISTANCE_MOVE - MIN_DISTANCE_MOVE) / sd.td
set distanceMove = MIN_DISTANCE_MOVE + (j * distanceDummy)
if(sd.b) then
set distanceMove = distanceMove * 2
endif
if(distance > distanceMove) then
set rad = Atan2(y - tY, x - tX)
set fX = tX + distanceMove * Cos(rad)
set fY = tY + distanceMove * Sin(rad)
call SetUnitX(sd.d[j], fX)
call SetUnitY(sd.d[j], fY)
else
call SetUnitX(sd.d[j], x)
call SetUnitY(sd.d[j], y)
endif
set j = j + 1
endloop
if(sd.up) then
set j = 0
loop
exitwhen(j >= sd.td)
if(ModuloInteger(j, 2) == 0) then
call SetUnitFacing(sd.d[j], GetUnitFacing(sd.d[j]) + 2.0)
else
call SetUnitFacing(sd.d[j], GetUnitFacing(sd.d[j]) - 2.0)
endif
set j = j + 1
endloop
endif
else
set j = 0
loop
exitwhen(j >= sd.td)
call RemoveUnit(sd.d[j])
set sd.d[j] = null
set j = j + 1
endloop
set sd.u = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
call sd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local GatesDeception_Data sd = GatesDeception_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local player owner = GetOwningPlayer(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local location loc = GetSpellTargetLoc()
local real targetX = GetUnitX(caster)
local real targetY = GetUnitY(caster)
local real face = GetUnitFacing(caster)
local integer diff = 0
local integer i = 0
local sound s = LoadSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
local integer item2 = IsUnitHasItemType(caster, ITEM2_UPGRADE)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_FC_GatesDeception
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, casterID, HERO_SOUND_KEY, s)
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.t = Time_Duration(level)
set sd.td = GATE_LEVEL
set sd.up = false
set sd.b = false
if(item1 > 0) then
set sd.up = true
set sd.t = sd.t + UPGRADE1_DURATION
set sd.td = sd.td + UPGRADE1_GATE_LEVEL
endif
if(item2 > 0) then
set sd.up = true
set sd.b = true
endif
set i = 0
loop
exitwhen(i >= sd.td)
set sd.d[i] = CreateUnit(owner, DUMMY_ID, targetX, targetY, face)
call SetUnitScale(sd.d[i], i, i, i)
call SetUnitVertexColor(sd.d[i], 255 - (diff * i), 255 - (diff * i), 255 - (diff * i), 150)
set i = i + 1
endloop
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
call RemoveLocation(loc)
set loc = null
set caster = null
set owner = null
set s = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Order_Actions takes nothing returns nothing
local GatesDeception_Data sd
local unit ordered = GetTriggerUnit()
local real orderedX = GetUnitX(ordered)
local real orderedY = GetUnitY(ordered)
local integer level = GetUnitAbilityLevel(ordered, SPELL_ID)
local real targetX = GetOrderPointX()
local real targetY = GetOrderPointY()
local boolean okey = false
local integer i = 0
local integer j = 0
local real x = 0.0
local real y = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == ordered) then
set j = 0
loop
exitwhen(j >= sd.td)
if(not okey) then
set x = GetUnitX(sd.d[j])
set y = GetUnitY(sd.d[j])
set dx = x - targetX
set dy = y - targetY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance <= RADIUS_PER_DUMMY * j) then
set okey = true
set j = 5
endif
endif
set j = j + 1
endloop
if(okey) then
if(sd.up) then
call DummyTargetCast(CASTER_ID, sd.o, orderedX, orderedY, 0.5, CAST_ID, level, "", 852274, ordered)
else
call DummyTargetCast(CASTER_ID, sd.o, orderedX, orderedY, 0.5, CAST_ID, level, "", 852274, ordered)
endif
call SetUnitX(sd.u, targetX)
call SetUnitY(sd.u, targetY)
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, ordered, "origin"))
endif
endif
set i = i + 1
endloop
set ordered = null
endfunction
//----------------------------------------------------------------
private function Order_Conditions takes nothing returns boolean
return GetUnitTypeId(GetTriggerUnit()) == UNIT_ID and /*
*/IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO)
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(GatesDeceptionTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(GatesDeceptionTrg, Condition(function Conditions))
call TriggerAddAction(GatesDeceptionTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(GatesDeceptionOrderTrg, EVENT_PLAYER_UNIT_ISSUED_ORDER)
call TriggerRegisterAnyUnitEventBJ(GatesDeceptionOrderTrg, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER)
call TriggerRegisterAnyUnitEventBJ(GatesDeceptionOrderTrg, EVENT_PLAYER_UNIT_ISSUED_UNIT_ORDER)
call TriggerRegisterAnyUnitEventBJ(GatesDeceptionOrderTrg, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER)
call TriggerAddCondition(GatesDeceptionOrderTrg, Condition(function Order_Conditions))
call TriggerAddAction(GatesDeceptionOrderTrg, function Order_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call Preload(SPECIAL_EFFECT)
call AbilityPreload(SPELL_ID)
call AbilityPreload(CAST_ID)
endfunction
endscope
//TESH.scrollpos=33
//TESH.alwaysfold=0
scope StarRupture initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A0AI' //Spell Star Rupture rawcode
private constant integer DUMMY_ID = 'n02G' //Dummy Star Rupture rawcode
private constant real LIFE_COST = 0.1 //Life cost percentage
private constant integer ROTATION = 2 //Number of rotation angle
private constant real WAIT_DURATION = 0.1 //Waiting duration
private constant integer DISTANCE_EFFECT = 100 //Distance of fire effect from target
private constant real MIN_LIFE = 100.0 //Min life
private constant integer ITEM1_UPGRADE = 'bgst' //Item Valor Front
private constant real UPGRADE1_ANGLE_CHANGE = 3.0 //Item 1 upgrade
private constant attacktype A_TYPE = ATTACK_TYPE_PIERCE //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_FIRE //Spell damage type
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Other\\Doom\\DoomTarget.mdl" //Special effect
private constant string CAST_EFFECT = "Abilities\\Weapons\\FireBallMissile\\FireBallMissile.mdl" //Angle effect
private constant string SPELL_EFFECT = "Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl" //Spell blast effect
private constant integer SOUND_VOLUME = 200 //Sound volume
endglobals
//Damage to targets
private function Damage takes integer level returns real
if(level == 1) then
return 20.0
elseif(level == 2) then
return 30.0
elseif(level == 3) then
return 50.0
elseif(level == 4) then
return 60.0
else
return 0.0
endif
endfunction
//Rotation per interval
private function Rotation takes nothing returns real
return 18.0
endfunction
//Number of blast
private function Blast takes integer level returns integer
if(level == 1) then
return 6
elseif(level == 2) then
return 7
elseif(level == 3) then
return 9
elseif(level == 4) then
return 12
else
return 0
endif
endfunction
//Radius of blast
private function Radius takes integer level returns real
return 300.0 + (0 * level)
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_FLYING) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct StarRupture_Data
unit u //Unit caster
unit t //Unit target
player o //Owner of caster
group g //Group lava
boolean b //Check cast
real x //Target x
real y //Target y
real w //Wait duration
real r //Full rotation count
real a //Angle
boolean p //Spin
real d //Damage to target
integer c //Number of blast
real s //Radius of blast
integer k //Blast counter
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private StarRupture_Data array Ar[10]
private integer Total
private group all
private boolexpr bexpr
private location loc
private group copy
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
return Targets(GetFilterUnit())
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local StarRupture_Data sd
local integer i = 0
local integer j = 0
local integer k = 0
local real x = 0.0
local real y = 0.0
local unit f = null
local unit dummy = null
local unit g = null
local real fX = 0.0
local real fY = 0.0
local real facing = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.r > 0 and sd.b) then
if(sd.w > 0) then
set sd.w = sd.w - Interval()
else
set j = 0
loop
exitwhen(j >= 4)
set x = sd.x + DISTANCE_EFFECT * Cos((sd.a + 90 * j) * bj_DEGTORAD)
set y = sd.y + DISTANCE_EFFECT * Sin((sd.a + 90 * j) * bj_DEGTORAD)
call DestroyEffect(AddSpecialEffect(CAST_EFFECT, x, y))
set j = j + 1
endloop
set sd.a = sd.a + Rotation()
set sd.r = sd.r - Rotation()
set sd.w = WAIT_DURATION
endif
elseif(sd.k == 0) then
call RemoveUnit(sd.t)
set sd.t = null
call IssueImmediateOrder(sd.u, "stop")
call SetUnitAnimation(sd.u, "spell")
call QueueUnitAnimation(sd.u, "stand")
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, sd.x, sd.y))
call GroupEnumUnitsInRange(all, sd.x, sd.y, sd.s, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.d, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.d, true, false, A_TYPE, D_TYPE, null)
endif
endif
endloop
set copy = CopyGroup(Lava)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == sd.o) then
call GroupAddUnit(sd.g, f)
set sd.c = sd.c + 1
endif
endloop
set sd.k = sd.k + 1
elseif(sd.k < sd.c) then
/*set copy = CopyGroup(Lava)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == sd.o) then
call GroupAddUnit(sd.g, f)
set fX = GetUnitX(f)
set fY = GetUnitY(f)
set facing = GetUnitFacing(f)
set x = fX + (DISTANCE_EFFECT * sd.k) * Cos(facing * bj_DEGTORAD)
set y = fY + (DISTANCE_EFFECT * sd.k) * Sin(facing * bj_DEGTORAD)
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, x, y))
call HitTree(x, y, sd.s, 0, 3.0)
call GroupEnumUnitsInRange(all, x, y, sd.s, bexpr)
loop
set g = FirstOfGroup(all)
exitwhen(g == null)
call GroupRemoveUnit(all, g)
if(IsUnitEnemy(g, sd.o)) then
if(IsUnitType(g, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, g, sd.d, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, g, sd.d, true, false, A_TYPE, D_TYPE, null)
endif
endif
endloop
endif
endloop*/
set j = 0
loop
exitwhen(j >= 4)
set x = sd.x + (DISTANCE_EFFECT * sd.k) * Cos((sd.a + 90 * j) * bj_DEGTORAD)
set y = sd.y + (DISTANCE_EFFECT * sd.k) * Sin((sd.a + 90 * j) * bj_DEGTORAD)
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, x, y))
call HitTree(x, y, sd.s, 0, 3.0)
call GroupEnumUnitsInRange(all, x, y, sd.s, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o)) then
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(sd.u, f, sd.d, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(sd.u, f, sd.d, true, false, A_TYPE, D_TYPE, null)
endif
endif
endloop
if(sd.p) then
set sd.a = sd.a + UPGRADE1_ANGLE_CHANGE
endif
set j = j + 1
endloop
set sd.k = sd.k + 1
else
loop
set f = FirstOfGroup(sd.g)
exitwhen(f == null)
call GroupRemoveUnit(sd.g, f)
call KillUnit(f)
endloop
set sd.u = null
set sd.t = null
set sd.o = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
set f = null
set dummy = null
set g = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local StarRupture_Data sd
local unit caster = GetTriggerUnit()
local player owner = GetOwningPlayer(caster)
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real targetX = 0.0
local real targetY = 0.0
local real life = 0.0
local boolean isNull = (Ar[Total] == null)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
set life = GetUnitState(caster, UNIT_STATE_LIFE) * LIFE_COST
if(isNull) then
set sd = StarRupture_Data.create()
set sd.g = CreateGroup()
else
set sd = Ar[Total]
endif
set sd.u = caster
set sd.t = CreateUnit(owner, DUMMY_ID, targetX, targetY, bj_UNIT_FACING)
set sd.o = owner
call UnitAddAbility(sd.t, 'Arav')
call UnitRemoveAbility(sd.t, 'Arav')
call SetUnitPathing(sd.t, false)
call SetUnitX(sd.t, targetX)
call SetUnitY(sd.t, targetY)
call UnitDamageTarget(sd.u, sd.u, life, true, false, A_TYPE, D_TYPE, null)
set sd.b = true
set sd.x = targetX
set sd.y = targetY
set sd.w = WAIT_DURATION
set sd.r = ROTATION * 360.0
set sd.a = GetUnitFacing(caster)
set sd.p = (item1 > 0)
set sd.d = Damage(level) + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
set sd.c = Blast(level)
set sd.s = Radius(level)
set sd.k = 0
if(isNull) then
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
else
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
endif
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Cast_Actions takes nothing returns nothing
local StarRupture_Data sd
local unit caster = GetTriggerUnit()
local integer i = 0
local sound s = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set sd.b = false
call SetUnitAnimation(sd.u, "spell")
call QueueUnitAnimation(sd.u, "stand")
set s = LoadSoundHandle(Heroes_Ht, GetUnitUserData(sd.u), HERO_SOUND_KEY)
if(s != null) then
call StopSound(s, false, false)
endif
set s = gg_snd_VC_RupturingMagma
call AttachSoundToUnit(s, caster)
call SetSoundVolume(s, 200)
call StartSound(s)
call SaveSoundHandle(Heroes_Ht, GetUnitUserData(sd.u), HERO_SOUND_KEY, s)
endif
set i = i + 1
endloop
set caster = null
set s = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(StarRuptureTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(StarRuptureTrg, Condition(function Conditions))
call TriggerAddAction(StarRuptureTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(StarRuptureCastTrg, EVENT_PLAYER_UNIT_SPELL_ENDCAST)
call TriggerAddCondition(StarRuptureCastTrg, Condition(function Conditions))
call TriggerAddAction(StarRuptureCastTrg, function Cast_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set all = CreateGroup()
set bexpr = Condition(function Pick)
set loc = Location(0, 0)
set copy = CreateGroup()
//Preload
call AbilityPreload(SPELL_ID)
call Preload(CAST_EFFECT)
call Preload(SPECIAL_EFFECT)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=27
//TESH.alwaysfold=0
globals
group Lava = CreateGroup()
endglobals
scope LavaBirth initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A0AJ' //Spell Lava Birth rawcode
private constant integer UNIT1_ID = 'nlv1' //'nlv1' //Unit Lava level 1
private constant integer UNIT2_ID = 'nlv2' //'nlv2' //Unit Lava level 2
private constant integer UNIT3_ID = 'nlv3' //'nlv3' //Unit Lava level 3
private constant integer CAST_ID = 'ANsy' //Cast Lava Birth (Dummy) rawcode
private constant real MIN_OFFSET = 100.0 //Min offset from attacked
private constant real RADIUS = 9000.0 //Radius whole map
private constant real TARGET_ATTACKING_RADIUS = 50.0 //Radius max of attacking by lava
private constant real ATTACKING_LIFE = 10.0 //Attacking life used
private constant integer ITEM1_UPGRADE = 'prvt' //Item Periapt of Vitality
private constant integer UPGRADE1_COUNT = 2 //Upgrade 1 effect
private constant string SPELL_EFFECT = "Abilities\\Spells\\Other\\Volcano\\VolcanoMissile.mdl" //Spell effect
endglobals
//Count
private function Count takes integer level returns integer
if(level == 1) then
return 6
elseif(level == 2) then
return 6
elseif(level == 3) then
return 6
else
return 0
endif
endfunction
//Radius
private function Radius takes integer level returns real
return 300.0
endfunction
//Radius max travel
private function Max_Radius takes integer level returns real
return 500.0
endfunction
//Damage taken to summon
private function Damage takes integer level returns real
if(level == 1) then
return 200.0
elseif(level == 2) then
return 200.0
elseif(level == 3) then
return 200.0
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(GetUnitTypeId(target) == UNIT1_ID or /*
*/GetUnitTypeId(target) == UNIT2_ID or /*
*/GetUnitTypeId(target) == UNIT3_ID)
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct LavaBirth_Data
unit u //Unit attacker
integer uID //Attacker ID
player o //Owner of attacker
integer l //Level
integer c //Total lava
real r //Radius
real mr //Max radius
real d //Damage to take
real cd //Current damage taken
endstruct
//----------------------------------------------------------------
globals
private integer Total
private LavaBirth_Data array Ar[10]
private group all
private group copy
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
return Targets(GetFilterUnit())
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local LavaBirth_Data sd
local integer i = 0
local unit f = null
local integer count = 0
local boolean dead = false
set copy = CopyGroup(Lava)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(IsUnitDead(f)) then
call GroupRemoveUnit(Lava, f)
endif
endloop
call GroupEnumUnitsInRange(all, 0.0, 0.0, RADIUS, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(not IsUnitInGroup(f, Lava)) then
call GroupAddUnit(Lava, f)
endif
endloop
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
set dead = IsUnitDead(sd.u)
set count = 0
set copy = CopyGroup(Lava)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == sd.o) then
if(dead) then
call KillUnit(f)
else
set count = count + 1
endif
endif
endloop
if(count >= sd.c) then
set copy = CopyGroup(Lava)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == sd.o and count >= sd.c and /*
*/(GetUnitState(f, UNIT_STATE_LIFE) < GetUnitState(f, UNIT_STATE_MAX_LIFE))) then
set count = count - 1
call PauseUnit(f, false)
call KillUnit(f)
endif
endloop
set copy = CopyGroup(Lava)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == sd.o and count >= sd.c) then
set count = count - 1
call PauseUnit(f, false)
call KillUnit(f)
endif
endloop
endif
set i = i + 1
endloop
set f = null
endfunction
//----------------------------------------------------------------
private function Attack_Actions takes nothing returns nothing
local unit attacker = GetAttacker()
local integer attackerType = GetUnitTypeId(attacker)
local integer level = GetUnitAbilityLevel(attacker, SPELL_ID)
local player owner = GetOwningPlayer(attacker)
local unit attacked = GetTriggerUnit()
local real attackedX = GetUnitX(attacked)
local real attackedY = GetUnitY(attacked)
local unit f = null
local real x = 0.0
local real y = 0.0
local real randomDistance = 0.0
local real randomAngle = 0.0
set copy = CopyGroup(Lava)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == owner) then
if(not IsUnitPaused(f) and (not IsUnitInGroup(f, Molting))) then
set randomDistance = GetRandomReal(0.0, TARGET_ATTACKING_RADIUS)
set randomAngle = GetRandomReal(0.0, 360.0) * bj_DEGTORAD
set x = attackedX + randomDistance * Cos(randomAngle)
set y = attackedY + randomDistance * Sin(randomAngle)
call IssuePointOrder(f, "attackground", x, y)
endif
endif
endloop
set attacker = null
set attacked = null
set owner = null
set f = null
endfunction
//----------------------------------------------------------------
private function Attack_Conditions takes nothing returns boolean
local integer attackerType = GetUnitTypeId(GetAttacker())
return (GetUnitAbilityLevel(GetAttacker(), SPELL_ID) > 0)
endfunction
//----------------------------------------------------------------
function LavaBirth_onDamage takes unit attacker, unit attacked, real amount returns nothing
local real attackedX = GetUnitX(attacked)
local real attackedY = GetUnitY(attacked)
local player owner = GetOwningPlayer(attacker)
local real targetX = 0.0
local real targetY = 0.0
local LavaBirth_Data sd
local integer i = 0
local real randomDistance = 0.0
local real randomAngle = 0.0
local integer count = 0
local integer total = 0
local real heal = 0.0
local integer extra = 0
local unit f = null
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == attacked) then
set sd.cd = sd.cd + amount
if(sd.cd >= sd.d) then
set sd.cd = 0
call DestroyEffect(AddSpecialEffect(SPELL_EFFECT, attackedX, attackedY))
set randomDistance = GetRandomReal(MIN_OFFSET, sd.r)
set randomAngle = GetRandomReal(0.0, 360.0) * bj_DEGTORAD
set targetX = attackedX + randomDistance * Cos(randomAngle)
set targetY = attackedY + randomDistance * Sin(randomAngle)
call PointCast(sd.o, attackedX, attackedY, 1.0, CAST_ID, sd.l, "summonfactory", 0, targetX, targetY)
set count = 0
set copy = CopyGroup(Lava)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == owner) then
set count = count + 1
endif
endloop
if(IsUnitHasItemType(sd.u, ITEM1_UPGRADE) > 0) then
set extra = UPGRADE1_COUNT
else
set extra = 0
endif
if(count >= sd.c + extra) then
set copy = CopyGroup(Lava)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == owner and count >= sd.c) then
set count = count - 1
call PauseUnit(f, false)
call KillUnit(f)
endif
endloop
endif
endif
set total = 0
set copy = CopyGroup(Lava)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == owner) then
set total = total + 1
endif
endloop
set heal = amount - (amount / total)
call SetUnitState(sd.u, UNIT_STATE_LIFE, GetUnitState(sd.u, UNIT_STATE_LIFE) + heal)
set copy = CopyGroup(Lava)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == owner) then
call SetUnitState(f, UNIT_STATE_LIFE, GetUnitState(sd.u, UNIT_STATE_LIFE) - (amount / total))
endif
endloop
endif
set i = i + 1
endloop
set attacker = null
set owner = null
set attacked = null
set f = null
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local unit learner = GetLearningUnit()
local player owner = GetOwningPlayer(learner)
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
local LavaBirth_Data sd
local integer i = 0
local boolean exist = false
if(level <= 1) then
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set exist = true
set sd.l = level
set sd.c = Count(level)
set sd.r = Radius(level)
set sd.mr = Max_Radius(level)
set sd.d = Damage(level)
endif
set i = i + 1
endloop
if(not exist) then
set sd = LavaBirth_Data.create()
set sd.u = learner
set sd.uID = GetUnitUserData(learner)
set sd.o = owner
set sd.l = level
set sd.c = Count(level)
set sd.r = Radius(level)
set sd.mr = Max_Radius(level)
set sd.d = Damage(level)
set sd.cd = 0.0
set Total = Total + 1
set Ar[Total - 1] = sd
endif
else
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set sd.l = level
set sd.c = Count(level)
set sd.r = Radius(level)
set sd.mr = Max_Radius(level)
set sd.d = Damage(level)
endif
set i = i + 1
endloop
endif
set learner = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
local unit learner = GetTriggerUnit()
local boolean okey = (GetLearnedSkill() == SPELL_ID) and (not IsUnitIllusion(learner))
set learner = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterTimerEventPeriodic(LavaBirthTrg, 0.5)
call TriggerAddAction(LavaBirthTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(LavaBirthAttackTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(LavaBirthAttackTrg, Condition(function Attack_Conditions))
call TriggerAddAction(LavaBirthAttackTrg, function Attack_Actions)
call TriggerRegisterAnyUnitEventBJ(LavaBirthLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(LavaBirthLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(LavaBirthLearnTrg, function Learn_Actions)
//Setting globals
set Total = 0
set all = CreateGroup()
set copy = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=30
//TESH.alwaysfold=0
scope ConsumeWarmth initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A0AL' //Spell Consume Warmth rawcode
private constant real INTERVAL_REGENERATION = 1.0 //Interval to regenerate
private constant integer UNIT1_ID = 'nlv1' //'nlv1' //Unit Lava level 1
private constant integer UNIT2_ID = 'nlv2' //'nlv2' //Unit Lava level 2
private constant integer UNIT3_ID = 'nlv3' //'nlv3' //Unit Lava level 3
private constant real MIN_LIFE = 100.0 //Min life
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_FIRE //Spell damage type
private constant integer ITEM1_UPGRADE = 'I00G' //Item Guardian's Helm
private constant string SPELL_EFFECT = "Abilities\\Spells\\Orc\\AncestralSpirit\\AncestralSpiritCaster.mdl" //Effect target
private constant string SPECIAL_EFFECT = "Abilities\\Spells\\Orc\\SpiritLink\\SpiritLinkTarget.mdl" //Effect target
endglobals
//Damage
private function Damage takes integer level returns real
if(level == 1) then
return 200.0
elseif(level == 2) then
return 300.0
elseif(level == 3) then
return 400.0
else
return 0.0
endif
endfunction
//Duration
private function Duration takes integer level returns real
if(level == 1) then
return 10.0
elseif(level == 2) then
return 10.0
elseif(level == 3) then
return 10.0
else
return 0.0
endif
endfunction
//Regeneration
private function Regeneration takes integer level returns real
if(level == 1) then
return 40.0
elseif(level == 2) then
return 60.0
elseif(level == 3) then
return 80.0
else
return 0.0
endif
endfunction
//Interval
private function Interval takes nothing returns real
return 0.5
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct ConsumeWarmth_Data
unit u //Unit caster
player o //Owner of caster
unit t //Target unit
real d //Duration
real i //Interval
real im //Max interval
real m //Amount
real r //Regeneration
effect e //Effect target
effect e1 //Effect target
effect e2 //Effect caster
endstruct
//----------------------------------------------------------------
globals
private ConsumeWarmth_Data array Ar[100]
private timer Tim
private integer Total
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local ConsumeWarmth_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.d > 0.0) then
set sd.d = sd.d - Interval()
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
set sd.m = sd.m - sd.r
if(not IsUnitDead(sd.t)) then
call SetUnitState(sd.t, UNIT_STATE_LIFE, GetUnitState(sd.t, UNIT_STATE_LIFE) + sd.r)
endif
if(not IsUnitDead(sd.u)) then
if(GetUnitState(sd.u, UNIT_STATE_LIFE) > MIN_LIFE + sd.r) then
call UnitDamageTarget(sd.u, sd.u, sd.r, true, false, A_TYPE, D_TYPE, null)
endif
endif
endif
else
if(sd.e != null) then
call DestroyEffect(sd.e)
set sd.e = null
endif
if(sd.e1 != null) then
call DestroyEffect(sd.e1)
set sd.e1 = null
endif
if(sd.e2 != null) then
call DestroyEffect(sd.e2)
set sd.e2 = null
endif
set sd.u = null
set sd.o = null
set sd.t = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if(Total == 0) then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local ConsumeWarmth_Data sd = ConsumeWarmth_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local unit target = GetSpellTargetUnit()
local integer targetType = GetUnitTypeId(target)
local boolean isLava = (targetType == UNIT1_ID or targetType == UNIT2_ID or targetType == UNIT3_ID)
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
set sd.u = caster
set sd.o = owner
set sd.t = target
set sd.d = Duration(level)
set sd.i = INTERVAL_REGENERATION
set sd.im = sd.i
if(isLava) then
set sd.m = GetUnitState(target, UNIT_STATE_LIFE)
else
set sd.m = Damage(level) + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
endif
set sd.r = Regeneration(level)
set sd.e = AddSpecialEffectTarget(SPECIAL_EFFECT, target, "chest")
set sd.e1 = AddSpecialEffectTarget(SPELL_EFFECT, target, "overhead")
set sd.e2 = AddSpecialEffectTarget(SPELL_EFFECT, caster, "overhead")
if(not isLava) then
if(caster == target or IsUnitAlly(target, owner)) then
if(GetUnitState(target, UNIT_STATE_LIFE) > MIN_LIFE + sd.m) then
call UnitDamageTarget(sd.u, target, sd.m, true, false, A_TYPE, D_TYPE, null)
endif
else
if(IsUnitType(target, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(caster, target, sd.m, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(caster, target, sd.m, true, false, A_TYPE, D_TYPE, null)
endif
endif
else
call KillUnit(target)
if(item1 > 0) then
set sd.t = sd.u
else
set sd.d = 0.0
endif
endif
call SetUnitState(caster, UNIT_STATE_LIFE, GetUnitState(caster, UNIT_STATE_LIFE) + sd.m)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set target = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(ConsumeWarmthTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(ConsumeWarmthTrg, Condition(function Conditions))
call TriggerAddAction(ConsumeWarmthTrg, function Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
endfunction
endscope
//TESH.scrollpos=63
//TESH.alwaysfold=0
globals
group Molting = CreateGroup()
endglobals
scope MoltenFlow initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A0AM' //Spell Molten Flow rawcode
private constant integer DUMMY_ID = 'n02H' //Dumm Molten Flow rawcode
private constant integer ABILITY_ID = 'A0AN' //Ability Molten Flow rawcode
private constant integer UNIT1_ID = 'nlv1' //'nlv1' //Unit Lava level 1
private constant integer UNIT2_ID = 'nlv2' //'nlv2' //Unit Lava level 2
private constant integer UNIT3_ID = 'nlv3' //'nlv3' //Unit Lava level 3
private constant integer DUMMY1_ID = 'n02H' //Level 1 dummy
private constant integer DUMMY2_ID = 'n02I' //Level 2 dummy
private constant integer DUMMY3_ID = 'n02J' //Level 3 dummy
private constant real PERCENT_USE = 0.25 //Percent of initial life use
private constant real RADIUS = 500.0 //Radius of lava to transfer life
private constant real INITIAL_LIFE = 100.0 //Initial life of dummy
private constant real LIFE_PER_SCALE = 50.0 //Life per scaling dummy
private constant real INTERVAL_TRANSFER = 1.0 //Interval transfer
private constant real MAX_SIZE = 1.15 //Max size
private constant real MIN_LIFE = 100.0 //Min life
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_FIRE //Spell damage type
private constant integer ITEM1_UPGRADE = 'I011' //Item Fist of Firebringer
private constant real UPGRADE1_DURATION = 10.0 //Upgrade 1 effect
private constant string SPELL_EFFECT = "Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl" //Spell appearing effect
private constant string SPECIAL_EFFECT = "Abilities\\Weapons\\FireBallMissile\\FireBallMissile.mdl" //Effect target
endglobals
//Dummy type
private function Dummy takes integer level returns integer
if(level == 1) then
return DUMMY1_ID
elseif(level == 2) then
return DUMMY2_ID
elseif(level == 3) then
return DUMMY3_ID
else
return 0
endif
endfunction
//Duration
private function Duration takes integer level returns real
if(level == 1) then
return 20.0
elseif(level == 2) then
return 20.0
elseif(level == 3) then
return 20.0
else
return 0.0
endif
endfunction
//Transferring life
private function Transfer takes integer level returns real
if(level == 1) then
return 300.0
elseif(level == 2) then
return 300.0
elseif(level == 3) then
return 300.0
else
return 0.0
endif
endfunction
//Sustainable life
private function Sustain takes integer level returns real
if(level == 1) then
return 600.0
elseif(level == 2) then
return 600.0
elseif(level == 3) then
return 600.0
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(GetUnitTypeId(target) == UNIT1_ID or /*
*/GetUnitTypeId(target) == UNIT2_ID or /*
*/GetUnitTypeId(target) == UNIT3_ID)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct MoltenFlow_Data
unit u //Unit caster
player o //Owner of caster
unit dum //Dummy
real d //Duration
real i //Interval
real im //Interval max
real s //Sustainable life
real t //Transfer life
real c //Scale per 100
real cs //Current scale
real e //Difference scale
endstruct
//----------------------------------------------------------------
globals
private MoltenFlow_Data array Ar[10]
private timer Tim
private integer Total
private location loc
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
return Targets(GetFilterUnit())
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local MoltenFlow_Data sd
local integer i = 0
local real life = 0.0
local real maxLife = 0.0
local real facing = 0.0
local unit f = null
local real x = 0.0
local real y = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.d > 0.0 and (not IsUnitDead(sd.dum))) then
set sd.d = sd.d - Interval()
set facing = GetUnitFacing(sd.u)
call SetUnitFacing(sd.u, facing)
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
set x = GetUnitX(sd.dum)
set y = GetUnitY(sd.dum)
call GroupEnumUnitsInRange(all, x, y, RADIUS, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(not IsUnitInGroup(f, Lava)) then
call GroupAddUnit(Lava, f)
endif
if(GetOwningPlayer(f) == sd.o) then
call SetUnitState(f, UNIT_STATE_LIFE, GetUnitState(f, UNIT_STATE_LIFE) - sd.t)
call SetUnitState(sd.dum, UNIT_STATE_LIFE, GetUnitState(sd.dum, UNIT_STATE_LIFE) + sd.t)
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, sd.dum, "hand, left"))
call DestroyEffect(AddSpecialEffectTarget(SPECIAL_EFFECT, sd.dum, "hand, right"))
call PauseUnit(f, true)
call SetUnitAnimation(f, "alternate")
endif
endloop
set all = CopyGroup(Lava)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(GetOwningPlayer(f) == sd.o) then
if(not IsUnitPaused(f)) then
call IssueTargetOrder(f, "move", sd.dum)
if(not IsUnitInGroup(f, Molting)) then
call GroupAddUnit(Molting, f)
endif
endif
endif
endloop
endif
set life = GetUnitState(sd.dum, UNIT_STATE_LIFE)
set maxLife = GetUnitState(sd.dum, UNIT_STATE_MAX_LIFE)
if(life >= maxLife) then
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
call SetUnitX(sd.u, GetUnitX(sd.dum))
call SetUnitY(sd.u, GetUnitY(sd.dum))
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.u, "origin"))
call SetUnitAnimation(sd.u, "spell")
call SetUnitState(sd.u, UNIT_STATE_LIFE, GetUnitState(sd.u, UNIT_STATE_LIFE) + life)
set sd.d = 0.0
call SetUnitX(sd.dum, x)
call SetUnitY(sd.dum, y)
call KillUnit(sd.dum)
else
call SetUnitScale(sd.dum, sd.e, sd.e, sd.e)
set sd.cs = RMaxBJ(R2I(life/LIFE_PER_SCALE) * sd.c, 0.1)
set sd.e = (1.0 / sd.cs) + 1
call SetUnitScale(sd.dum, sd.cs, sd.cs, sd.cs)
endif
else
call SetUnitScale(sd.dum, 1.0, 1.0, 1.0)
if(sd.dum != null) then
if(not IsUnitDead(sd.dum)) then
call KillUnit(sd.dum)
endif
endif
set all = CopyGroup(Lava)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(GetOwningPlayer(f) == sd.o) then
if(IsUnitPaused(f)) then
call PauseUnit(f, false)
endif
if(IsUnitInGroup(f, Molting)) then
call GroupRemoveUnit(Molting, f)
endif
endif
endloop
call SetPlayerAbilityAvailable(sd.o, SPELL_ID, true)
call UnitRemoveAbility(sd.u, ABILITY_ID)
set sd.u = null
set sd.o = null
set sd.dum = null
set Ar[i] = Ar[Total - 1]
set Ar[Total - 1] = sd
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if(Total == 0) then
call PauseTimer(Tim)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local MoltenFlow_Data sd = MoltenFlow_Data.create()
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real facing = GetUnitFacing(caster)
local player owner = GetOwningPlayer(caster)
local real targetX = 0.0
local real targetY = 0.0
local integer item1 = IsUnitHasItemType(caster, ITEM1_UPGRADE)
local real life = GetUnitState(caster, UNIT_STATE_LIFE) * PERCENT_USE
set loc = GetSpellTargetLoc()
set targetX = GetLocationX(loc)
set targetY = GetLocationY(loc)
if(targetX > WorldBounds.minX + 300.0 and /*
*/targetX < WorldBounds.maxX - 300.0 and /*
*/targetY > WorldBounds.minY + 300.0 and /*
*/targetY < WorldBounds.maxY - 300.0 and (not IsWall(targetX, targetY, 100.0))) then
set sd.u = caster
set sd.o = owner
set sd.dum = CreateUnit(owner, Dummy(level), targetX, targetY, facing)
call SetUnitState(sd.dum, UNIT_STATE_LIFE, INITIAL_LIFE + life)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, caster, "origin"))
call UnitDamageTarget(caster, caster, life, true, false, A_TYPE, D_TYPE, null)
call PauseUnit(sd.dum, true)
call SetUnitAnimation(sd.dum, "channel")
set sd.d = Duration(level)
set sd.i = 0.0
set sd.im = INTERVAL_TRANSFER
set sd.s = Sustain(level)
set sd.t = Transfer(level)
set sd.c = MAX_SIZE/(sd.s/LIFE_PER_SCALE)
set sd.cs = sd.c * R2I(INITIAL_LIFE/LIFE_PER_SCALE)
set sd.e = (MAX_SIZE/sd.cs) + 1
if(item1 > 0) then
set sd.d = sd.d + UPGRADE1_DURATION
call UnitAddType(sd.dum, UNIT_TYPE_ANCIENT)
endif
call SetUnitScale(sd.dum, sd.c, sd.c, sd.c)
call SetPlayerAbilityAvailable(owner, SPELL_ID, false)
call UnitAddAbility(caster, ABILITY_ID)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.dum, "origin"))
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Cast_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local real facing = GetUnitFacing(caster)
local player owner = GetOwningPlayer(caster)
local MoltenFlow_Data sd
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
call SetUnitState(sd.dum, UNIT_STATE_LIFE, GetUnitState(sd.dum, UNIT_STATE_LIFE) + sd.t)
if(GetUnitState(sd.u, UNIT_STATE_LIFE) > sd.t + MIN_LIFE) then
call UnitDamageTarget(sd.u, sd.u, sd.t, true, false, A_TYPE, D_TYPE, null)
call DestroyEffect(AddSpecialEffectTarget(SPELL_EFFECT, sd.dum, "origin"))
endif
set i = Total
endif
set i = i + 1
endloop
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Cast_Conditions takes nothing returns boolean
return GetSpellAbilityId() == ABILITY_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(MoltenFlowTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(MoltenFlowTrg, Condition(function Conditions))
call TriggerAddAction(MoltenFlowTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(MoltenFlowCastTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(MoltenFlowCastTrg, Condition(function Cast_Conditions))
call TriggerAddAction(MoltenFlowCastTrg, function Cast_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set loc = Location(0.0, 0.0)
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call AbilityPreload(ABILITY_ID)
call Preload(SPELL_EFFECT)
call Preload(SPECIAL_EFFECT)
endfunction
endscope
//TESH.scrollpos=129
//TESH.alwaysfold=0
scope VolcanicEruption initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A0AO' //Spell Volcanic Core rawcode
private constant integer CAST_ID = 'ACpa' //Ability Volcanic Core rawcode
private constant integer UNIT1_ID = 'nlv1' //'nlv1' //Unit Lava level 1
private constant integer UNIT2_ID = 'nlv2' //'nlv2' //Unit Lava level 2
private constant integer UNIT3_ID = 'nlv3' //'nlv3' //Unit Lava level 3
private constant integer DUMMY_ID = 'n02K' //Dummy missles
private constant integer CHANGE_ANGLE = 12 //Angle change every interval
private constant integer EFFECT_PER_RADIUS = 1 //Effect per 150 radius
private constant real INTERVAL_INCREASE_REGENERATION = 1.0 //Increase regeneration
private constant real DISTANCE_MOVE = 20.0 //Distance travelling per interval
private constant real DURATION_TRAVEL = 0.2 //Duration of travel maximun
private constant real MIN_RADIUS = 150.0 //Min radius
private constant real AREA_RADIUS = 300.0 //Area radius
private constant integer ITEM1_UPGRADE = 'I01H' //Item Wrist of Hercules
private constant integer ITEM2_UPGRADE = 'I01G' //Item Throne of Emperor
private constant real UPGRADE1_REGENERATION = 1.0 //Upgrade item 1 regeneration
private constant integer UPGRADE2_MISSLE_PASSIVE = 1 //Upgrade item 2 missle
private constant integer UPGRADE2_MISSLE = 4 //Upgrade item 2 missle
private constant attacktype A_TYPE = ATTACK_TYPE_CHAOS //Spell attack type
private constant damagetype D_TYPE = DAMAGE_TYPE_UNIVERSAL //Spell damage type
private constant string SPECIAL_EFFECT = "Environment\\SmallBuildingFire\\SmallBuildingFire2.mdl" //Angle effect
private constant string UPGRADE_EFFECT = "Environment\\LargeBuildingFire\\LargeBuildingFire1.mdl" //Upgrade item 2 effect
endglobals
//Base regeneration
private function Regeneration takes integer level returns real
if(level == 1) then
return 3.0
elseif(level == 2) then
return 5.0
else
return 0.0
endif
endfunction
//Regeneration
private function Regeneration_Decrease takes integer level returns real
if(level == 1) then
return 1.0
elseif(level == 2) then
return 1.0
else
return 0.0
endif
endfunction
//Regeneration
private function Max_Regeneration takes integer level returns real
if(level == 1) then
return 20.0
elseif(level == 2) then
return 30.0
else
return 0.0
endif
endfunction
//Missle per 150 radius
private function Missle takes integer level returns integer
if(level == 1) then
return 1
elseif(level == 2) then
return 1
else
return 0
endif
endfunction
//Missle increase
private function Missle_Increase takes integer level returns integer
if(level == 1) then
return 4
elseif(level == 2) then
return 4
else
return 0
endif
endfunction
//Radius
private function Radius takes integer level returns real
if(level == 1) then
return 150.0
elseif(level == 2) then
return 150.0
else
return 0.0
endif
endfunction
//Radius
private function Radius_Increase takes integer level returns real
if(level == 1) then
return 50.0
elseif(level == 2) then
return 50.0
else
return 0.0
endif
endfunction
//Max radius
private function Max_Radius takes integer level returns real
if(level == 1) then
return 600.0
elseif(level == 2) then
return 600.0
else
return 0.0
endif
endfunction
//Radius damage
private function Radius_Damage takes integer level returns real
if(level == 1) then
return 300.0
elseif(level == 2) then
return 300.0
else
return 0.0
endif
endfunction
//Damage
private function Damage takes integer level returns real
if(level == 1) then
return 30.0
elseif(level == 2) then
return 50.0
else
return 0.0
endif
endfunction
//Targets affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_FLYING) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct VolcanicEruption_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of spell
integer m //Mode
boolean c //Cast
real g //Regeneration
real gm //Regeneration increase
real mg //Max regeneration
real r //Radius
real rm //Radius move
real mr //Max radius
real i //Interval
real im //Max interval
integer e //Angle
integer t //Missle cast
real dd //Damage
real dr //Damage radius
effect e1 //Effect 1
effect e2 //Effect 2
endstruct
//----------------------------------------------------------------
struct Eruption_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of spell
unit dum //Dummy
real cos //Cos of angle
real sin //Sin of angle
real tX //Target x
real tY //Target y
real dm //Distance move
real x //X of graph
real y //Y of graph
real t //Distance
real dd //Damage
real dr //Damage radius
endstruct
//----------------------------------------------------------------
globals
private VolcanicEruption_Data array Ar[10]
private timer Tim
private integer Total
private Eruption_Data array Ar2[100]
private timer Tim2
private integer Total2
private group copy
private group all
private boolexpr bexpr
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
return Targets(GetFilterUnit())
endfunction
//----------------------------------------------------------------
private function Actions_Execute2 takes nothing returns nothing
local Eruption_Data ed
local integer i = 0
local real x = 0.0
local real y = 0.0
local unit f = null
loop
exitwhen(i >= Total2)
set ed = Ar2[i]
if(ed.x < ed.t) then
set ed.x = ed.x + ed.dm
set ed.y = (-1 / ((3 * ed.t) / 9)) * ed.x * (ed.x - ed.t)
set x = GetUnitX(ed.dum) + ed.dm * ed.cos
set y = GetUnitY(ed.dum) + ed.dm * ed.sin
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
call SetUnitX(ed.dum, x)
call SetUnitY(ed.dum, y)
endif
call SetUnitFlyHeight(ed.dum, ed.y, 0.0)
else
set x = GetUnitX(ed.dum)
set y = GetUnitY(ed.dum)
call GroupEnumUnitsInRange(all, x, y, ed.dr, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, ed.o)) then
if(IsUnitType(f, UNIT_TYPE_ETHEREAL)) then
call UnitDamageTarget(ed.u, f, ed.dd, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
else
call UnitDamageTarget(ed.u, f, ed.dd, true, false, A_TYPE, D_TYPE, null)
endif
endif
endloop
call KillUnit(ed.dum)
set ed.u = null
set ed.o = null
set ed.dum = null
set Ar2[i] = Ar2[Total2 - 1]
set Total2 = Total2 - 1
call ed.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total2 == 0 then
call PauseTimer(Tim2)
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local VolcanicEruption_Data sd
local Eruption_Data ed
local integer i = 0
local integer j = 0
local real x = 0.0
local real y = 0.0
local real life = 0.0
local real maxLife = 0.0
local integer total = 0
local real rad = 0.0
local real distance = 0.0
local real difference = 0.0
local string text = ""
local integer item1 = 0
local integer item2 = 0
local unit f = null
local integer extra = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.m == 0) then
if(not IsUnitDead(sd.u)) then
set total = R2I((sd.r / 150) * EFFECT_PER_RADIUS)
set difference = 360.0 / total
set j = 0
loop
exitwhen(j >= total)
set rad = (sd.e + j * difference) * bj_DEGTORAD
set x = GetUnitX(sd.u) + sd.r * Cos(rad)
set y = GetUnitY(sd.u) + sd.r * Sin(rad)
set text = ""
if(GetLocalPlayer() == sd.o) then
set text = SPECIAL_EFFECT
endif
call DestroyEffect(AddSpecialEffect(text, x, y))
set j = j + 1
endloop
set sd.e = sd.e + R2I(CHANGE_ANGLE / (sd.r / 150))
set life = GetUnitState(sd.u, UNIT_STATE_LIFE)
set maxLife = GetUnitState(sd.u, UNIT_STATE_MAX_LIFE)
set item1 = IsUnitHasItemType(sd.u, ITEM1_UPGRADE)
set item2 = IsUnitHasItemType(sd.u, ITEM2_UPGRADE)
if(item1 > 0 or item2 > 0) then
if(sd.e1 == null) then
set sd.e1 = AddSpecialEffectTarget(UPGRADE_EFFECT, sd.u, "hand, left")
endif
if(sd.e2 == null) then
set sd.e2 = AddSpecialEffectTarget(UPGRADE_EFFECT, sd.u, "hand, right")
endif
else
if(sd.e1 != null) then
call DestroyEffect(sd.e1)
set sd.e1 = null
endif
if(sd.e2 != null) then
call DestroyEffect(sd.e2)
set sd.e2 = null
endif
endif
if(life >= maxLife) then
else
call SetUnitState(sd.u, UNIT_STATE_LIFE, life + sd.g)
if(sd.g > sd.mg) then
set sd.g = sd.g - sd.gm
endif
endif
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
if(life >= maxLife) then
if(item2 > 0) then
set extra = UPGRADE2_MISSLE_PASSIVE
endif
set total = R2I((Missle(sd.l) + extra) * (sd.r / 150))
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
set j = 0
loop
exitwhen(j >= total)
set ed = Eruption_Data.create()
set rad = GetRandomInt(0, 360) * bj_DEGTORAD
set ed.u = sd.u
set ed.o = sd.o
set ed.l = sd.l
set ed.dum = CreateUnit(sd.o, DUMMY_ID, x, y, GetRandomReal(0, 360) * 1.0)
call SetUnitScale(ed.dum, 0.75, 0.75, 0.75)
call UnitAddAbility(ed.dum, 'Arav')
call UnitRemoveAbility(ed.dum, 'Arav')
call SetUnitPathing(ed.dum, false)
call SetUnitX(ed.dum, x)
call SetUnitY(ed.dum, y)
call SetUnitAnimation(ed.dum, "birth")
set distance = GetRandomReal(MIN_RADIUS, sd.r)
set ed.cos = Cos(rad)
set ed.sin = Sin(rad)
set ed.tX = GetUnitX(sd.u) + distance * Cos(rad)
set ed.tY = GetUnitY(sd.u) + distance * Sin(rad)
set ed.dm = distance / ((DURATION_TRAVEL * (sd.r / 150)) / Interval())
set ed.x = 0
set ed.y = 0
set ed.t = distance
set ed.dd = sd.dd / 2
set ed.dr = sd.dr / 2
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = ed
set j = j + 1
endloop
if(sd.r < sd.mr) then
set sd.r = sd.r + sd.rm
endif
endif
endif
else
set sd.g = Max_Regeneration(sd.l)
endif
elseif(sd.m == 1) then
set item1 = IsUnitHasItemType(sd.u, ITEM1_UPGRADE)
set item2 = IsUnitHasItemType(sd.u, ITEM2_UPGRADE)
if(item2 > 0) then
set extra = UPGRADE2_MISSLE
endif
set total = R2I((Missle(sd.l) + sd.t + extra) * (sd.r / 150))
set difference = 360.0/total
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
set j = 0
loop
exitwhen(j >= total)
set ed = Eruption_Data.create()
set rad = (sd.e + j * difference) * bj_DEGTORAD
set ed.u = sd.u
set ed.o = sd.o
set ed.l = sd.l
set ed.dum = CreateUnit(sd.o, DUMMY_ID, x, y, GetRandomReal(0.0, 360.0))
call UnitAddAbility(ed.dum, 'Arav')
call UnitRemoveAbility(ed.dum, 'Arav')
call SetUnitPathing(ed.dum, false)
call SetUnitX(ed.dum, x)
call SetUnitY(ed.dum, y)
call SetUnitAnimation(ed.dum, "birth")
set distance = GetRandomReal(MIN_RADIUS, sd.r)
set ed.cos = Cos(rad)
set ed.sin = Sin(rad)
set ed.tX = GetUnitX(sd.u) + distance * Cos(rad)
set ed.tY = GetUnitY(sd.u) + distance * Sin(rad)
set ed.dm = distance / ((DURATION_TRAVEL * (sd.r / 150)) / Interval())
set ed.x = 0
set ed.y = 0
set ed.t = distance
set ed.dd = sd.dd
set ed.dr = sd.dr
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = ed
set j = j + 1
endloop
set sd.m = 0
set sd.r = MIN_RADIUS
set sd.g = Max_Regeneration(sd.l)
set sd.t = 0
if(item1 > 0) then
set copy = CopyGroup(Lava)
loop
set f = FirstOfGroup(copy)
exitwhen(f == null)
call GroupRemoveUnit(copy, f)
if(GetOwningPlayer(f) == sd.o) then
set sd.g = sd.g + UPGRADE1_REGENERATION
endif
endloop
endif
endif
set i = i + 1
endloop
if(Total == 0) then
call PauseTimer(Tim)
endif
set text = null
set f = null
endfunction
//----------------------------------------------------------------
private function Cast_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
call SetUnitTimeScale(caster, 0.75)
call TriggerSleepAction(0.5)
call SetUnitTimeScale(caster, 1.0)
set caster = null
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
local VolcanicEruption_Data sd
local integer i = 0
local integer item2 = IsUnitHasItemType(caster, ITEM2_UPGRADE)
call SetUnitAnimationByIndex(caster, 4)
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
if(sd.m == 0) then
set sd.m = 1
set sd.c = true
set sd.i = sd.im
set sd.t = Missle_Increase(level)
set sd.dd = Damage(level) + (Damage(level) * LoadInteger(MagicDamage_Ht, casterID, 0) * 0.01)
endif
endif
set i = i + 1
endloop
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Learn_Actions takes nothing returns nothing
local VolcanicEruption_Data sd
local unit learner = GetTriggerUnit()
local integer learnerID = GetUnitUserData(learner)
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
local player owner = GetOwningPlayer(learner)
local integer i = 0
local boolean exist = false
if(level == 1) then
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set exist = true
set sd.l = level
set sd.gm = Regeneration_Decrease(level)
set sd.mg = Regeneration(level)
set sd.rm = Radius_Increase(level)
set sd.mr = Max_Radius(level)
set sd.dd = Damage(level)
set sd.dr = Radius_Damage(level)
set i = Total
endif
set i = i + 1
endloop
if(not exist) then
set sd = VolcanicEruption_Data.create()
set sd.u = learner
set sd.o = owner
set sd.l = level
set sd.m = 0
set sd.c = false
set sd.g = Max_Regeneration(level)
set sd.gm = Regeneration_Decrease(level)
set sd.mg = Regeneration(level)
set sd.r = MIN_RADIUS
set sd.rm = Radius_Increase(level)
set sd.mr = Max_Radius(level)
set sd.e = 0
set sd.i = INTERVAL_INCREASE_REGENERATION
set sd.im = INTERVAL_INCREASE_REGENERATION
set sd.t = 0
set sd.dd = Damage(level)
set sd.dr = Radius_Damage(level)
set sd.e1 = null
set sd.e2 = null
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
else
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set sd.l = level
set sd.gm = Regeneration_Decrease(level)
set sd.mg = Regeneration(level)
set sd.rm = Radius_Increase(level)
set sd.mr = Max_Radius(level)
set sd.dd = Damage(level)
set sd.dr = Radius_Damage(level)
set i = Total
endif
set i = i + 1
endloop
endif
set learner = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Learn_Conditions takes nothing returns boolean
local unit learner = GetTriggerUnit()
local boolean okey = (GetLearnedSkill() == SPELL_ID) and (not IsUnitIllusion(learner))
set learner = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerRegisterAnyUnitEventBJ(VolcanicEruptionCastTrg, EVENT_PLAYER_UNIT_SPELL_CAST)
call TriggerAddCondition(VolcanicEruptionCastTrg, Condition(function Conditions))
call TriggerAddAction(VolcanicEruptionCastTrg, function Cast_Actions)
call TriggerRegisterAnyUnitEventBJ(VolcanicEruptionTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(VolcanicEruptionTrg, Condition(function Conditions))
call TriggerAddAction(VolcanicEruptionTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(VolcanicEruptionLearnTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(VolcanicEruptionLearnTrg, Condition(function Learn_Conditions))
call TriggerAddAction(VolcanicEruptionLearnTrg, function Learn_Actions)
//Setting globals
set Tim = CreateTimer()
set Total = 0
set Tim2 = CreateTimer()
set Total2 = 0
set copy = CreateGroup()
set all = CreateGroup()
set bexpr = Condition(function Pick)
//Preload
call AbilityPreload(SPELL_ID)
call Preload(SPECIAL_EFFECT)
endfunction
endscope
//TESH.scrollpos=351
//TESH.alwaysfold=0
scope RocketClusters initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A0A7' //Spell rawcode
private constant integer DUMMY_ID = 'n02E' //Dummy rawcode
private constant real INTERVAL = 0.5 //Interval summon
private constant real EXPLODE_DISTANCE = 90.0 //Explode area
private constant attacktype A_TYPE = ATTACK_TYPE_NORMAL //Spell damage type
private constant damagetype D_TYPE = DAMAGE_TYPE_DEMOLITION //Spell attack type
private constant string SPELL_EFFECT = "Objects\\Spawnmodels\\NightElf\\EntBirthTarget\\EntBirthTarget.mdl" //Death effect
endglobals
//Slots of rocket
private function Slots takes integer level returns integer
if(level == 1) then
return 3
elseif(level == 2) then
return 4
elseif(level == 3) then
return 5
elseif(level == 4) then
return 6
else
return 0
endif
endfunction
//Duration
private function Duration takes integer level returns real
return 10.0
endfunction
//Radius detect
private function Radius_Detect takes integer level returns real
return 1500.0
endfunction
//Distance move
private function Distance_Move takes integer level returns real
return 50.0
endfunction
//Damage radius contact
private function Radius_Damage takes integer level returns real
return 150.0 + (0.0 * level)
endfunction
//Damage deal
private function Damage takes integer level returns real
if(level == 1) then
return 60.0
elseif(level == 2) then
return 90.0
elseif(level == 3) then
return 150.0
elseif(level == 4) then
return 240.0
else
return 0.0
endif
endfunction
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and/*
*/(IsUnitType(target, UNIT_TYPE_STRUCTURE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_MECHANICAL) == false) and/*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and/*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct RocketClusters_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of ability
boolean c //Cast
real i //Interval
real im //Interval max
real dd //Damage
real dr //Damage radius
endstruct
//----------------------------------------------------------------
struct Rocket_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of ability
unit dum //Dummy revealer
real d //Duration
real dm //Distance move
real tX //Target x
real tY //Target y
real dd //Damage
real dr //Damage radius
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private RocketClusters_Data array Ar[10]
private timer Tim2
private integer Total2
private Rocket_Data array Ar2[10]
private group Group
private group all
private boolexpr bexpr
private location target
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
return Targets(GetFilterUnit())
endfunction
//----------------------------------------------------------------
private function Actions_Execute2 takes nothing returns nothing
local Rocket_Data rd
local integer i = 0
local real x = 0.0
local real y = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local real rad = 0.0
local real face = 0.0
local unit f = null
loop
exitwhen(i >= Total2)
set rd = Ar2[i]
if(rd.d > 0.0) then
set x = GetUnitX(rd.dum)
set y = GetUnitY(rd.dum)
set dx = x - rd.tX
set dy = y - rd.tY
set distance = SquareRoot(dx * dx + dy * dy)
set face = Atan2(rd.tY - y, rd.tX - x) * bj_RADTODEG
call SetUnitFacing(rd.dum, face)
if(distance < EXPLODE_DISTANCE) then
set rd.d = 0.0
set x = rd.tX
set y = rd.tY
else
set rad = GetUnitFacing(rd.dum) * bj_DEGTORAD
set x = x + rd.dm * Cos(rad)
set y = y + rd.dm * Sin(rad)
call GroupEnumUnitsInRange(all, x, y, EXPLODE_DISTANCE, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, rd.o)) then
set rd.d = 0.0
endif
endloop
endif
if(x > WorldBounds.minX + 300.0 and /*
*/x < WorldBounds.maxX - 300.0 and /*
*/y > WorldBounds.minY + 300.0 and /*
*/y < WorldBounds.maxY - 300.0 and (not IsWall(x, y, 100.0))) then
call SetUnitX(rd.dum, x)
call SetUnitY(rd.dum, y)
else
set rd.d = 0.0
endif
else
set x = GetUnitX(rd.dum)
set y = GetUnitY(rd.dum)
call GroupEnumUnitsInRange(all, x, y, rd.dr, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, rd.o)) then
call UnitDamageTarget(rd.u, f, rd.dd, true, false, A_TYPE, D_TYPE, null)
endif
endloop
call KillUnit(rd.dum)
set Ar2[i] = Ar2[Total2 - 1]
set Total2 = Total2 - 1
call rd.destroy()
set i = i - 1
endif
set i = i + 1
endloop
if Total2 == 0 then
call PauseTimer(Tim2)
endif
endfunction
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local RocketClusters_Data sd
local Rocket_Data rd
local integer i = 0
local integer j = 0
local real x = 0.0
local real y = 0.0
local real facing = 0.0
local integer count = 0
local unit target = null
local integer randomDistance = 0
local integer randomAngle = 0
local unit f = null
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.c) then
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
set facing = GetUnitFacing(sd.u)
set count = Slots(sd.l)
set j = 0
loop
exitwhen(j >= count)
set rd = Rocket_Data.create()
set rd.u = sd.u
set rd.o = sd.o
set rd.l = sd.l
set rd.dum = CreateUnit(sd.o, DUMMY_ID, x, y, facing)
set rd.d = Duration(sd.l)
set rd.dm = Distance_Move(sd.l)
set rd.dd = sd.dd
set rd.dr = sd.dr
set target = null
call GroupEnumUnitsInRange(all, x, y, Radius_Detect(sd.l), bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, sd.o) and (not IsUnitInGroup(f, Group)) and (target == null)) then
set target = f
call GroupAddUnit(Group, f)
endif
endloop
if(target != null) then
set rd.tX = GetUnitX(target)
set rd.tY = GetUnitY(target)
else
set randomDistance = GetRandomInt(300, 1500)
set randomAngle = GetRandomInt(0, 360)
set rd.tX = x + randomDistance * Cos(randomAngle * bj_DEGTORAD)
set rd.tY = y + randomDistance * Sin(randomAngle * bj_DEGTORAD)
endif
if(Total2 <= 0) then
call TimerStart(Tim2, Interval(), true, function Actions_Execute2)
endif
set Total2 = Total2 + 1
set Ar2[Total2 - 1] = rd
set j = j + 1
endloop
loop
set f = FirstOfGroup(Group)
exitwhen(f == null)
call GroupRemoveUnit(Group, f)
endloop
endif
else
call sd.destroy()
set Ar[i] = Ar[Total - 1]
set Total = Total - 1
set i = i - 1
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local RocketClusters_Data sd = RocketClusters_Data.create()
local unit caster = GetSpellAbilityUnit()
local integer casterID = GetUnitUserData(caster)
local integer level = GetUnitAbilityLevel(caster, SPELL_ID)
local player owner = GetOwningPlayer(caster)
set sd.u = caster
set sd.o = owner
set sd.l = level
set sd.c = true
set sd.i = 0.0
set sd.im = INTERVAL
set sd.dd = Damage(level)
set sd.dr = Radius_Damage(level)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
set caster = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Stop_Actions takes nothing returns nothing
local RocketClusters_Data sd
local unit caster = GetTriggerUnit()
local integer i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == caster) then
set sd.c = false
set i = Total
endif
set i = i + 1
endloop
set caster = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger RocketClustersTrg = CreateTrigger()
local trigger RocketClustersStopTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(RocketClustersTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(RocketClustersTrg, Condition(function Conditions))
call TriggerAddAction(RocketClustersTrg, function Actions)
call TriggerRegisterAnyUnitEventBJ(RocketClustersStopTrg, EVENT_PLAYER_UNIT_SPELL_ENDCAST)
call TriggerAddCondition(RocketClustersStopTrg, Condition(function Conditions))
call TriggerAddAction(RocketClustersStopTrg, function Stop_Actions)
//setting globals
set Tim = CreateTimer()
set Total = 0
set Tim2 = CreateTimer()
set Total2 = 0
set Group = CreateGroup()
set all = CreateGroup()
set bexpr = Condition(function Pick)
set target = Location(0, 0)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope KineticSupply initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A0A8' //Spell Kinetic Supply rawcode
private constant integer MAX_SUMMON = 5 //Summon max
private constant real FOLLOW_DISTANCE = 100.0 //Follow distance
private constant integer ITEM1_UPGRADE = 'bspd' //Item Boots of Speed
private constant real UPGRADE1_DURATION = 1.0 //Upgrade 1 effect
private constant string SPELL_EFFECT = "Abilities\\Weapons\\SeaElementalMissile\\SeaElementalMissile.mdl" //Effect targets
endglobals
//Dummy type
private function Dummy takes integer level returns integer
if(level == 1) then
return 'ncgb'
elseif(level == 2) then
return 'ncg1'
elseif(level == 3) then
return 'ncg2'
else
return 0
endif
endfunction
//Summon interval
private function Summon_Interval takes integer level returns real
if(level == 1) then
return 5.0
elseif(level == 2) then
return 4.0
elseif(level == 3) then
return 2.0
else
return 0.0
endif
endfunction
//Duration
private function Duration takes integer level returns real
if(level == 1) then
return 60.0
elseif(level == 2) then
return 60.0
elseif(level == 3) then
return 60.0
else
return 0.0
endif
endfunction
//Regeneration
private function Regeneration takes integer level returns real
if(level == 1) then
return 1.0
elseif(level == 2) then
return 2.0
elseif(level == 3) then
return 3.0
else
return 0.0
endif
endfunction
//Interval
private function Interval takes nothing returns real
return 0.1
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct KineticSupply_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of spell
unit array dum[5] //Dummy
integer t //Total
real i //Interval
real im //Max interval
real x //X of caster
real y //Y of caster
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private KineticSupply_Data array Ar[10]
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local KineticSupply_Data sd
local integer i = 0
local integer j = 0
local integer k = 0
local real x = 0.0
local real y = 0.0
local real life = 0.0
local real maxLife = 0.0
local real face = 0.0
local real regeneration = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(not IsUnitDead(sd.u)) then
set j = 0
loop
exitwhen(j >= 5)
if(sd.dum[j] != null) then
if(IsUnitDead(sd.dum[j])) then
if(j < 4) then
set k = j
loop
exitwhen(k >= 5)
set sd.dum[k] = sd.dum[k+1]
if(k == 4) then
set sd.dum[k] = null
endif
set k = k + 1
endloop
else
set sd.dum[j] = null
endif
set sd.t = sd.t - 1
endif
endif
set j = j + 1
endloop
set life = GetUnitState(sd.u, UNIT_STATE_LIFE)
set maxLife = GetUnitState(sd.u, UNIT_STATE_MAX_LIFE)
set regeneration = (sd.t * Regeneration(sd.l))
if(life < maxLife) then
call SetUnitState(sd.u, UNIT_STATE_LIFE, life + regeneration)
endif
set j = 0
loop
exitwhen(j >= 5)
if(sd.dum[j] != null) then
if(not IsUnitDead(sd.dum[j])) then
//if(j == 0) then
//set face = GetUnitFacing(sd.u)
//set x = GetUnitX(sd.u) + (FOLLOW_DISTANCE * (j + 1)) * Cos((face + 180) * bj_DEGTORAD)
//set y = GetUnitY(sd.u) + (FOLLOW_DISTANCE * (j + 1)) * Sin((face + 180) * bj_DEGTORAD)
call IssueTargetOrder(sd.dum[j], "move", sd.u)
call QueueUnitAnimation(sd.dum[j], "attack")
//call SetUnitX(sd.dum[j], x)
//call SetUnitY(sd.dum[j], y)
//call IssuePointOrder(sd.dum[j], "move", x, y)
//call SetUnitFacing(sd.dum[j], face)
//call SetUnitFlyHeight(sd.dum[j], 0.0, 0.0)
/*else
set face = GetUnitFacing(sd.dum[j-1])
set x = GetUnitX(sd.dum[j-1]) + FOLLOW_DISTANCE * Cos((face + 180) * bj_DEGTORAD)
set y = GetUnitY(sd.dum[j-1]) + FOLLOW_DISTANCE * Sin((face + 180) * bj_DEGTORAD)
//call IssueTargetOrder(sd.dum[j], "move", sd.dum[j-1])
//call IssuePointOrder(sd.dum[j], "move", x, y)
call SetUnitX(sd.dum[j], x)
call SetUnitY(sd.dum[j], y)
call IssuePointOrder(sd.dum[j], "move", x, y)
call SetUnitFacing(sd.dum[j], face)
call SetUnitFlyHeight(sd.dum[j], 0.0, 0.0)
endif*/
endif
endif
set j = j + 1
endloop
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
if(sd.x == x and sd.y == y) then
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
if(sd.t < MAX_SUMMON) then
set sd.dum[sd.t] = CreateUnit(sd.o, Dummy(sd.l), x, y, GetUnitFacing(sd.u))
call UnitApplyTimedLife(sd.dum[sd.t], 'BTLF', Duration(sd.l))
call SetUnitAnimation(sd.dum[sd.t], "birth")
//call UnitAddAbility(sd.dum[sd.t], 'Arav')
//call UnitRemoveAbility(sd.dum[sd.t], 'Arav')
//call SetUnitPathing(sd.dum[sd.t], false)
set sd.t = sd.t + 1
endif
endif
else
set sd.x = x
set sd.y = y
endif
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local KineticSupply_Data sd
local unit learner = GetTriggerUnit()
local integer learnerID = GetUnitUserData(learner)
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
local player owner = GetOwningPlayer(learner)
local integer i = 0
local boolean exist = false
if(level == 1) then
set i = 0
loop
exitwhen(i >= Total)
if(sd.u == learner) then
set exist = true
set sd.im = Summon_Interval(level)
set i = Total
endif
set i = i + 1
endloop
if(not exist) then
set sd = KineticSupply_Data.create()
set sd.u = learner
set sd.o = owner
set sd.l = level
set i = 0
loop
exitwhen(i >= 5)
set sd.dum[i] = null
set i = i + 1
endloop
set sd.t = 0
set sd.i = 0.0
set sd.im = Summon_Interval(level)
set sd.x = GetUnitX(sd.u)
set sd.y = GetUnitY(sd.u)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
else
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set sd.l = level
set sd.im = Summon_Interval(level)
set i = Total
endif
set i = i + 1
endloop
endif
set learner = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit learner = GetTriggerUnit()
local boolean okey = (GetLearnedSkill() == SPELL_ID) and (not IsUnitIllusion(learner))
set learner = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger KineticSupplyTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(KineticSupplyTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(KineticSupplyTrg, Condition(function Conditions))
call TriggerAddAction(KineticSupplyTrg, function Actions)
//setting globals
set Tim = CreateTimer()
set Total = 0
endfunction
//----------------------------------------------------------------
function KineticSupply_Preload takes nothing returns nothing
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=99
//TESH.alwaysfold=0
scope KineticSupply initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private constant integer SPELL_ID = 'A0A8' //Spell Kinetic Supply rawcode
private constant integer MAX_SUMMON = 5 //Summon max
private constant real FOLLOW_DISTANCE = 100.0 //Follow distance
private constant integer ITEM1_UPGRADE = 'bspd' //Item Boots of Speed
private constant real UPGRADE1_DURATION = 1.0 //Upgrade 1 effect
private constant string SPELL_EFFECT = "Abilities\\Weapons\\SeaElementalMissile\\SeaElementalMissile.mdl" //Effect targets
endglobals
//Dummy type
private function Dummy takes integer level returns integer
if(level == 1) then
return 'nfac'
elseif(level == 2) then
return 'nfa1'
elseif(level == 3) then
return 'nfa2'
else
return 0
endif
endfunction
//Summon interval
private function Summon_Interval takes integer level returns real
if(level == 1) then
return 10.0
elseif(level == 2) then
return 8.0
elseif(level == 3) then
return 5.0
else
return 0.0
endif
endfunction
//Regeneration
private function Regeneration takes integer level returns real
if(level == 1) then
return 0.5
elseif(level == 2) then
return 1.0
elseif(level == 3) then
return 1.5
else
return 0.0
endif
endfunction
//Interval
private function Interval takes nothing returns real
return 0.05
endfunction
//----------------------------------------------------------------
//-------------------------SETUP END------------------------------
//----------------------------------------------------------------
struct KineticSupply_Data
unit u //Unit caster
player o //Owner of caster
integer l //Level of spell
unit array dum[5] //Dummy
integer t //Total
real i //Interval
real im //Max interval
endstruct
//----------------------------------------------------------------
globals
private timer Tim
private integer Total
private KineticSupply_Data array Ar[10]
endglobals
//----------------------------------------------------------------
private function Actions_Execute takes nothing returns nothing
local KineticSupply_Data sd
local integer i = 0
local integer j = 0
local integer k = 0
local real x = 0.0
local real y = 0.0
local real life = 0.0
local real maxLife = 0.0
local real face = 0.0
local real regeneration = 0.0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(not IsUnitDead(sd.u)) then
set j = 0
loop
exitwhen(j >= 5)
if(sd.dum[j] != null) then
if(IsUnitDead(sd.dum[j])) then
if(j < 4) then
set k = j
loop
exitwhen(k >= 5)
set sd.dum[k] = sd.dum[k+1]
if(k == 4) then
set sd.dum[k] = null
endif
set k = k + 1
endloop
else
set sd.dum[j] = null
endif
set sd.t = sd.t - 1
endif
endif
set j = j + 1
endloop
set j = 0
loop
exitwhen(j >= 5)
if(sd.dum[j] != null) then
if(not IsUnitDead(sd.dum[j])) then
//if(j == 0) then
set face = GetUnitFacing(sd.u)
set x = GetUnitX(sd.u) + (FOLLOW_DISTANCE * (j + 1)) * Cos((face + 180) * bj_DEGTORAD)
set y = GetUnitY(sd.u) + (FOLLOW_DISTANCE * (j + 1)) * Sin((face + 180) * bj_DEGTORAD)
//call IssueTargetOrder(sd.dum[j], "move", sd.u)
//call SetUnitX(sd.dum[j], x)
//call SetUnitY(sd.dum[j], y)
call IssuePointOrder(sd.dum[j], "move", x, y)
call SetUnitFacing(sd.dum[j], face)
call SetUnitFlyHeight(sd.dum[j], 0.0, 0.0)
/*else
set face = GetUnitFacing(sd.dum[j-1])
set x = GetUnitX(sd.dum[j-1]) + FOLLOW_DISTANCE * Cos((face + 180) * bj_DEGTORAD)
set y = GetUnitY(sd.dum[j-1]) + FOLLOW_DISTANCE * Sin((face + 180) * bj_DEGTORAD)
//call IssueTargetOrder(sd.dum[j], "move", sd.dum[j-1])
//call IssuePointOrder(sd.dum[j], "move", x, y)
call SetUnitX(sd.dum[j], x)
call SetUnitY(sd.dum[j], y)
call IssuePointOrder(sd.dum[j], "move", x, y)
call SetUnitFacing(sd.dum[j], face)
call SetUnitFlyHeight(sd.dum[j], 0.0, 0.0)
endif*/
endif
endif
set j = j + 1
endloop
if(sd.i > 0.0) then
set sd.i = sd.i - Interval()
else
set sd.i = sd.im
if(sd.t < MAX_SUMMON) then
set x = GetUnitX(sd.u)
set y = GetUnitY(sd.u)
set sd.dum[sd.t] = CreateUnit(sd.o, Dummy(sd.l), x, y, GetUnitFacing(sd.u))
//call UnitAddAbility(sd.dum[sd.t], 'Arav')
//call UnitRemoveAbility(sd.dum[sd.t], 'Arav')
//call SetUnitPathing(sd.dum[sd.t], false)
set sd.t = sd.t + 1
endif
endif
set j = 0
loop
exitwhen(j >= 5)
set life = GetUnitState(sd.dum[j], UNIT_STATE_LIFE)
set maxLife = GetUnitState(sd.dum[j], UNIT_STATE_MAX_LIFE)
set regeneration = ((5 - j) * Regeneration(sd.l))
if(life < maxLife) then
call SetUnitState(sd.dum[j], UNIT_STATE_LIFE, life + regeneration)
endif
set j = j + 1
endloop
set life = GetUnitState(sd.u, UNIT_STATE_LIFE)
set maxLife = GetUnitState(sd.u, UNIT_STATE_MAX_LIFE)
set regeneration = (sd.t * Regeneration(sd.l))
if(life < maxLife) then
call SetUnitState(sd.u, UNIT_STATE_LIFE, life + regeneration)
endif
endif
set i = i + 1
endloop
if Total == 0 then
call PauseTimer(Tim)
endif
endfunction
//----------------------------------------------------------------
private function Actions takes nothing returns nothing
local KineticSupply_Data sd
local unit learner = GetTriggerUnit()
local integer learnerID = GetUnitUserData(learner)
local integer level = GetUnitAbilityLevel(learner, SPELL_ID)
local player owner = GetOwningPlayer(learner)
local integer i = 0
local boolean exist = false
if(level == 1) then
set i = 0
loop
exitwhen(i >= Total)
if(sd.u == learner) then
set exist = true
set sd.im = Summon_Interval(level)
set i = Total
endif
set i = i + 1
endloop
if(not exist) then
set sd = KineticSupply_Data.create()
set sd.u = learner
set sd.o = owner
set sd.l = level
set i = 0
loop
exitwhen(i >= 5)
set sd.dum[i] = null
set i = i + 1
endloop
set sd.t = 0
set sd.i = 0.0
set sd.im = Summon_Interval(level)
if(Total <= 0) then
call TimerStart(Tim, Interval(), true, function Actions_Execute)
endif
set Total = Total + 1
set Ar[Total - 1] = sd
endif
else
set i = 0
loop
exitwhen(i >= Total)
set sd = Ar[i]
if(sd.u == learner) then
set sd.l = level
set sd.im = Summon_Interval(level)
set i = Total
endif
set i = i + 1
endloop
endif
set learner = null
set owner = null
endfunction
//----------------------------------------------------------------
private function Conditions takes nothing returns boolean
local unit learner = GetTriggerUnit()
local boolean okey = (GetLearnedSkill() == SPELL_ID) and (not IsUnitIllusion(learner))
set learner = null
return okey
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local trigger KineticSupplyTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(KineticSupplyTrg, EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(KineticSupplyTrg, Condition(function Conditions))
call TriggerAddAction(KineticSupplyTrg, function Actions)
//setting globals
set Tim = CreateTimer()
set Total = 0
endfunction
//----------------------------------------------------------------
function KineticSupply_Preload takes nothing returns nothing
call Preload(SPELL_EFFECT)
endfunction
endscope
//TESH.scrollpos=67
//TESH.alwaysfold=0
globals
constant integer UNIT_POWER_TOWER_ID = 'hatw' //Tower unit id
constant integer BUFF_DEFEND_AURA_ID = 'Bapl' //Defend aura
constant integer UNIT_REVENANT_ID = 'Uwar' //Revenant rawcode
constant integer BUFF_DEATHNAIL_ID = 'B01I' //Buff Deathnail Carapace rawcode
constant integer ABILITY_ESOTERIC_FORM_ID = 'A04E' //Spell Esoteric Form
constant integer BUFF_IMPOTENT_ID = 'B01K' //Buff Impotent rawcode
constant integer BUFF_BASH_ID = 'B01M' //Buff Bash (Attack) rawcode
constant integer SPELL_BASH_ID = 'A04M' //Spell Bash rawcode
constant integer BUFF_BURNING_ORBS_ID = 'Blsh' //Buff Burning Orbs (Attack) rawcode
constant integer SPELL_BURNING_ORBS_ID = 'A04V' //Spell Burning Orbs rawcode
constant integer BUFF_FATAL_STRIKE_ID = 'B01Q' //Buff Fatal Strike (Attack) rawcode
constant integer SPELL_FATAL_STRIKE_ID = 'A056' //Spell Fatal Strike rawcode
constant integer BUFF_VOODOO_ID = 'B01S' //Buff Voodoo rawcode
constant integer BUFF_SWORD_ABYSS_ID = 'B01T' //Buff Sword of Abyss rawcode
constant integer ABILITY_SWORD_ABYSS_ID = 'A067' //Ability Sword of Abyss rawcode
constant integer ABILITY_FROST_SHATTERS_ID = 'A06A' //Ability Frost Shatters rawcode
constant integer ABILITY_FROST_SHATTERS_DUMMY_ID = 'A0BH' //Ability Frost Shatters Dummy rawcode
constant integer BUFF_WICKED_PRESENCE_ID = 'BUfa' //Buff Wicked Presence (Dummy) rawcode
constant integer BUFF_GROUND_BREAKER_ID = 'B021' //Buff Ground Breaker rawcode
constant integer ABILITY_GROUND_BREAKER_ID = 'A06O' //Ability Ground Breaker rawcode
constant integer UNIT_LOCUST1_ID = 'n017' //Locust rawcode
constant integer UNIT_LOCUST2_ID = 'u002' //Locust rawcode
constant integer UNIT_LOCUST3_ID = 'u003' //Locust rawcode
constant integer BUFF_POLLEN_DISPERSE_ID = 'B020' //Buff Pollen Disperse rawcode
constant integer BUFF_LUCENT_ARROW_ID = 'B023' //Buff Lucent Arrow rawcode
constant integer ABILITY_LUCENT_ARROW_ID = 'A072' //Ability Lucent Arrow rawcode
constant integer BUFF_POISON_GLAIVE_ID = 'B024' //Buff Poison Glaive rawcode
constant integer ABILITY_POISON_GLAIVE_ID = 'A07G' //Ability Poison Glaive rawcode
constant integer ABILITY_SHADE_SHIFT_ID = 'A07I' //Spell Shade Shift rawcode
constant integer ABILITY_SHADE_SHIFT_INVI_ID = 'Apiv' //Spell Shade Shift Invisible rawcode
constant integer UNIT_FRENZY1_ID = 'Uvar' //Unit Frenzy Brutelord rawcode
constant integer UNIT_FRENZY2_ID = 'osw1' //Unit Frenzy Wolves level 1 rawcode
constant integer UNIT_FRENZY3_ID = 'osw2' //Unit Frenzy Wolves level 2 rawcode
constant integer UNIT_FRENZY4_ID = 'osw3' //Unit Frenzy Wolves level 3 rawcode
constant integer ABILITY_ENRAGE_ID = 'A082' //Spell Madness rawcode
constant integer ABILITY_MADNESS_ID = 'AId7' //Spell Madness rawcode
constant integer ABILITY_AQUASHIELD_ID = 'A093' //Spell Aquashield rawcode
constant integer BUFF_DESOLATION_ID = 'B02O' //Buff Desolation rawcode
constant integer BUFF_WHIRLBLOW_ID = 'B02S' //Buff Whirlblow rawcode
constant integer ABILITY_LAVA_BIRTH_ID = 'A0AJ' //Ability Lava Birth rawcode
endglobals
struct Damage extends array
//----------------------------------------------------------------
private static constant integer PRIORITY = 5
//----------------------------------------------------------------
private static method onDamage takes nothing returns nothing
//set damage = damageOriginal
local unit attacker = source
local player ownerAttacker = GetOwningPlayer(attacker)
local integer ownerAttackerId = GetPlayerId(ownerAttacker)
local integer attackerID = GetUnitUserData(attacker)
local integer attackerType = GetUnitTypeId(attacker)
local unit attacked = target
local player ownerAttacked = GetOwningPlayer(attacked)
local integer ownerAttackedId = GetPlayerId(ownerAttacked)
local integer attackedID = GetUnitUserData(attacked)
local integer attackedType = GetUnitTypeId(attacked)
local real amount = damageOriginal
//call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,GetUnitName(source) + " dealt " + R2S(damage) + " to " + GetUnitName(target))
/*if(ownerAttackerId == 0) then
if (archetype == Archetype.PHYSICAL) then
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,"Physical Attack")
elseif (archetype == Archetype.SPELL) then
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,"Spell Attack")
elseif (archetype == Archetype.CODE) then
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,"Code Attack")
endif
endif*/
//call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,GetUnitName(target) + " has " + R2S(life) + " life left")
if(amount > 0) then
if(IsUnitType(attacker, UNIT_TYPE_HERO) and /*
*/IsUnitType(attacked, UNIT_TYPE_HERO) and /*
*/(not IsUnitType(attacked, UNIT_TYPE_STRUCTURE)) and /*
*/(not IsUnitType(attacker, UNIT_TYPE_STRUCTURE))) then
call Register_Assist(attacker, attacked, amount)
endif
if(attackedType == UNIT_POWER_TOWER_ID) then
call Power_Tower_onDamage(attacker, attacked, amount)
endif
if(GetUnitAbilityLevel(attacked, BUFF_DEFEND_AURA_ID) > 0 and attackerType != UNIT_POWER_TOWER_ID) then
call Defend_Aura_onDamage(attacker, attacked, amount)
endif
if(attackedType == UNIT_REVENANT_ID) then
call Revenant_onDamage(attacker, attacked, amount)
endif
if(ownerAttackedId >= 8 and ownerAttackedId < 12 and IsUnitInGroup(attacked, Creature)) then
call Skeleton_onDamage(attacker, attacked, amount)
endif
if(GetUnitAbilityLevel(attacked, BUFF_DEATHNAIL_ID) > 0) then
call Deathshard_onDamage(attacker, attacked, amount)
endif
if(GetUnitAbilityLevel(attacked, BUFF_IMPOTENT_ID) > 0) then
call Impotent_onDamage(attacker, attacked, amount)
endif
if((GetUnitAbilityLevel(attacked, ABILITY_ESOTERIC_FORM_ID) > 0) and /*
*/(IsUnitInGroup(attacked, EsotericFormAttackedUnit))) then
call EsotericForm_onDamage(attacker, attacked, amount)
endif
if(GetUnitAbilityLevel(attacker, SPELL_BASH_ID) > 0 and GetUnitAbilityLevel(attacked, BUFF_BASH_ID) > 0) then
call Bash_onDamage(attacker, attacked, amount)
endif
if(GetUnitAbilityLevel(attacker, SPELL_BURNING_ORBS_ID) > 0 and GetUnitAbilityLevel(attacked, BUFF_BURNING_ORBS_ID) > 0) then
call BurningOrbs_onDamage(attacker, attacked, amount)
endif
if(GetUnitAbilityLevel(attacker, SPELL_FATAL_STRIKE_ID) > 0 and GetUnitAbilityLevel(attacked, BUFF_FATAL_STRIKE_ID) > 0) then
call FatalStrike_onDamage(attacker, attacked, amount)
endif
if(IsUnitInGroup(attacker, TormentWard) and /*
*/(not IsUnitType(attacked, UNIT_TYPE_STRUCTURE))) then
call TormentWard_onDamage(attacker, attacked, amount)
endif
if(GetUnitAbilityLevel(attacked, BUFF_VOODOO_ID) > 0) then
call Voodoo_onDamage(attacker, attacked, amount)
endif
if(GetUnitAbilityLevel(attacked, BUFF_SWORD_ABYSS_ID) > 0 and GetUnitAbilityLevel(attacker, ABILITY_SWORD_ABYSS_ID) > 0) then
call SwordAbyss_onDamage(attacker, attacked, amount)
endif
if(GetUnitAbilityLevel(attacker, ABILITY_FROST_SHATTERS_ID) > 0 and IsUnitInGroup(attacker, FrostShattersAttacker) and GetUnitAbilityLevel(attacked, ABILITY_FROST_SHATTERS_DUMMY_ID) > 0) then
call FrostShatters_onDamage(attacker, attacked, amount)
endif
if(GetUnitAbilityLevel(attacked, BUFF_WICKED_PRESENCE_ID) > 0) then
call WickedPresence_onDamage(attacker, attacked, amount)
endif
if(GetUnitAbilityLevel(attacked, BUFF_GROUND_BREAKER_ID) > 0 and GetUnitAbilityLevel(attacker, ABILITY_GROUND_BREAKER_ID) > 0 and IsUnitInGroup(attacker, GroundBreaking)) then
call GroundBreaker_onDamage(attacker, attacked, amount)
endif
if(GetUnitTypeId(attacker) == UNIT_LOCUST1_ID or GetUnitTypeId(attacker) == UNIT_LOCUST2_ID or GetUnitTypeId(attacker) == UNIT_LOCUST3_ID) then
call LocustsAttack_onDamage(attacker, attacked, amount)
endif
if(GetUnitAbilityLevel(attacker, BUFF_POLLEN_DISPERSE_ID) > 0) then
call PollenDisperse_onDamage(attacker, attacked, amount)
endif
if(GetUnitAbilityLevel(attacked, BUFF_LUCENT_ARROW_ID) > 0 and GetUnitAbilityLevel(attacker, ABILITY_LUCENT_ARROW_ID) > 0) then
call LucentArrow_onDamage(attacker, attacked, amount)
endif
if(GetUnitAbilityLevel(attacked, BUFF_POISON_GLAIVE_ID) > 0 and GetUnitAbilityLevel(attacker, ABILITY_POISON_GLAIVE_ID) > 0) then
call PoisonGlaive_onDamage(attacker, attacked, amount)
endif
if(GetUnitAbilityLevel(attacker, ABILITY_SHADE_SHIFT_ID) > 0 and /*
*/GetUnitAbilityLevel(attacker, ABILITY_SHADE_SHIFT_INVI_ID) > 0 and /*
*/IsUnitType(attacked, UNIT_TYPE_HERO)) then
call ShadeShift_onDamage(attacker, attacked, amount)
endif
if(GetUnitAbilityLevel(attacker, ABILITY_ENRAGE_ID) > 0) then
call Enrage_onDamage(attacker, attacked, amount)
endif
if(GetUnitAbilityLevel(attacker, ABILITY_MADNESS_ID) > 0) then
call Attack_Madness_onDamage(attacker, attacked, amount)
endif
if(GetUnitAbilityLevel(attacked, ABILITY_MADNESS_ID) > 0) then
call Defend_Madness_onDamage(attacker, attacked, amount)
endif
if(GetUnitAbilityLevel(attacked, ABILITY_AQUASHIELD_ID) > 0) then
call Aquashield_onDamage(attacker, attacked, amount)
endif
if(GetUnitAbilityLevel(attacked, BUFF_DESOLATION_ID) > 0) then
call Desolation_onDamage(attacker, attacked, amount)
endif
if(GetUnitAbilityLevel(attacked, BUFF_WHIRLBLOW_ID) > 0) then
call Circlingblow_onDamage(attacker, attacked, amount)
endif
if(IsUnitInGroup(attacker, IllusionHit) and LoadBoolean(Illusion_Ht, attackerID, ILLUSION_HALLUCINATION_DAMAGE_KEY)) then
call Hallucination_onDamage(attacker, attacked, amount)
endif
if(GetUnitAbilityLevel(attacked, ABILITY_LAVA_BIRTH_ID) > 0) then
call LavaBirth_onDamage(attacker, attacked, amount)
endif
endif
set attacker = null
set attacked = null
set ownerAttacker = null
set ownerAttacked = null
//set DDS[targetId].enabled = false
//call UnitDamageTarget(source, target, 1, true, true, null, null, null)
//set DDS[targetId].enabled = true
endmethod
//----------------------------------------------------------------
implement DDS
//----------------------------------------------------------------
private static method onInit takes nothing returns nothing
endmethod
endstruct
//TESH.scrollpos=54
//TESH.alwaysfold=0
globals
constant integer TOTAL_LIFE_ZONE = 3
constant integer TOTAL_MANA_ZONE = 3
constant integer TOTAL_ATTACK_RANGE_ZONE = 2
constant integer TOTAL_HERO_LEVEL = 15
constant integer TOTAL_HERO_SKILL = 5
constant integer TOTAL_SKILL_LEVEL = 4
constant integer TOTAL_AI_HERO = 26
constant integer TOTAL_HERO_ATTITUDE_TYPE = 3
constant integer TOTAL_LOCATION_RUNE_RESTORATION = 4
constant integer TOTAL_LOCATION_GLYPH = 2
constant integer KNOWLEDGE_ABILITY_MODE_UNKNOWN = 0
constant integer KNOWLEDGE_ABILITY_MODE_SELF = 0
constant integer KNOWLEDGE_ABILITY_MODE_ALLY = 1
constant integer KNOWLEDGE_ABILITY_MODE_ENEMY = 2
constant integer LIFE_ZONE_GREEN = 2
constant integer LIFE_ZONE_YELLOW = 1
constant integer LIFE_ZONE_RED = 0
constant integer MANA_ZONE_GREEN = 2
constant integer MANA_ZONE_YELLOW = 1
constant integer MANA_ZONE_RED = 0
constant integer ATTACK_RANGE_ZONE_NEAR = 0
constant integer ATTACK_RANGE_ZONE_FAR = 1
constant integer ABILITY_TYPE_OFFENSE = 0
constant integer ABILITY_TYPE_DEFENSE = 1
constant integer ABILITY_TYPE_DEFENSE_ACTIVATE = 2
constant integer ABILITY_TYPE_MOBILE = 3
constant integer ABILITY_TYPE_MOBILE_OFFENSE = 4
constant integer ABILITY_TYPE_ULTIMATE = 5
constant integer ABILITY_TYPE_ULTIMATE_ACTIVATE = 6
constant integer ABILITY_TYPE_ULTIMATE_TRANSFORM = 7
constant integer HERO_ATTITUDE_TYPE_OFFENSE = 0
constant integer HERO_ATTITUDE_TYPE_DEFENSE = 1
constant integer HERO_ATTITUDE_TYPE_SUPPORT = 2
constant real KNOWLEDGE_SAFE_DISTANCE_TOWARDS_SAFE_LOCATION = 2000.0
constant real KNOWLEDGE_LOCATION_NEAR = 500.0
constant real KNOWLEDGE_BOAT_LOCATION_NEAR = 200.0
constant real KNOWLEDGE_LIFE_ABSORB_DANGER = 0.02
constant integer KNOWLEDGE_DETECT_AMOUNT_UNITS = 3
constant integer KNOWLEDGE_DETECT_AMOUNT_HEROES = 1
constant integer KNOWLEDGE_POINT_NEED_FARM = 20
constant integer KNOWLEDGE_POINT_NEED_VICTOR = 50
constant integer KNOWLEDGE_REVENANT_WAKE = 'Uwar'
constant integer KNOWLEDGE_REVENANT_SLEEP = 'U000'
constant integer KNOWLEDGE_RUNE_RESTORATION = 'lmbr'
constant integer KNOWLEDGE_REPOSITIONING_AMOUNT_HEROES = 1
constant real LIFE_WEIGHTAGE = 5.0
constant real ATTACK_RANGE_WEIGHTAGE = 1.0
rect array AI_Boat_Location[TOTAL_PLAYER_SLOTS]
rect array AI_Rune_Restoration_Location[TOTAL_LOCATION_RUNE_RESTORATION]
rect array AI_Glyph_Fortification_Location[TOTAL_LOCATION_GLYPH]
real array AI_Life_Zone[TOTAL_AI_HERO][TOTAL_LIFE_ZONE]
real array AI_Mana_Zone[TOTAL_AI_HERO][TOTAL_MANA_ZONE]
real array AI_Attack_Range_Zone[TOTAL_AI_HERO][TOTAL_ATTACK_RANGE_ZONE]
integer array AI_Ability_Level[TOTAL_AI_HERO][TOTAL_HERO_LEVEL]
integer array AI_Ability_Type[TOTAL_AI_HERO][TOTAL_HERO_LEVEL]
integer array AI_Ability_Order_Type[TOTAL_AI_HERO][TOTAL_HERO_LEVEL]
integer array AI_Ability_Type_Score[TOTAL_AI_HERO][TOTAL_HERO_LEVEL]
integer array AI_Ability_ID[TOTAL_AI_HERO][TOTAL_HERO_SKILL]
integer array AI_Ability_Learn_Skip[TOTAL_AI_HERO][TOTAL_HERO_SKILL]
integer array AI_Ability_Level_Required[TOTAL_AI_HERO][TOTAL_HERO_SKILL]
string array AI_Ability_Order[TOTAL_AI_HERO][TOTAL_HERO_SKILL]
string array AI_Ability_Order_Next[TOTAL_AI_HERO][TOTAL_HERO_SKILL]
integer array AI_Ability_Buff[TOTAL_AI_HERO][TOTAL_HERO_SKILL]
rect KNOWLEDGE_READY_TOP_RIGHT
rect KNOWLEDGE_READY_BOTTOM_LEFT
rect KNOWLEDGE_READY_TOP_LEFT
rect KNOWLEDGE_READY_BOTTOM_RIGHT
//Light Bringer
integer array AI_LB_Item_Total_Plan[TOTAL_HERO_ATTITUDE_TYPE]
integer array AI_LB_Item_Plan[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_LB_Item_Point[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_LB_Ability_Cooldown[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_LB_Ability_Mana[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_LB_Ability_Range[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_LB_Ability_Detect_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_LB_Ability_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_LB_Ability_Mode[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_LB_Ability_Perceive[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
//Arcane Wizard
integer array AI_AW_Item_Total_Plan[TOTAL_HERO_ATTITUDE_TYPE]
integer array AI_AW_Item_Plan[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_AW_Item_Point[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_AW_Ability_Cooldown[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_AW_Ability_Mana[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_AW_Ability_Range[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_AW_Ability_Detect_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_AW_Ability_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_AW_Ability_Mode[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_AW_Ability_Perceive[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
//King of Tempest
integer array AI_KT_Item_Total_Plan[TOTAL_HERO_ATTITUDE_TYPE]
integer array AI_KT_Item_Plan[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_KT_Item_Point[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_KT_Ability_Cooldown[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_KT_Ability_Mana[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_KT_Ability_Range[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_KT_Ability_Detect_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_KT_Ability_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_KT_Ability_Mode[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_KT_Ability_Perceive[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
//Pyromancer
integer array AI_PM_Item_Total_Plan[TOTAL_HERO_ATTITUDE_TYPE]
integer array AI_PM_Item_Plan[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_PM_Item_Point[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_PM_Ability_Cooldown[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_PM_Ability_Mana[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_PM_Ability_Range[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_PM_Ability_Detect_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_PM_Ability_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_PM_Ability_Mode[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_PM_Ability_Perceive[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
//Archslayer
integer array AI_AS_Item_Total_Plan[TOTAL_HERO_ATTITUDE_TYPE]
integer array AI_AS_Item_Plan[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_AS_Item_Point[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_AS_Ability_Cooldown[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_AS_Ability_Mana[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_AS_Ability_Range[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_AS_Ability_Detect_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_AS_Ability_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_AS_Ability_Mode[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_AS_Ability_Perceive[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
//Spirit Caller
integer array AI_SC_Item_Total_Plan[TOTAL_HERO_ATTITUDE_TYPE]
integer array AI_SC_Item_Plan[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_SC_Item_Point[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_SC_Ability_Cooldown[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_SC_Ability_Mana[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_SC_Ability_Range[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_SC_Ability_Detect_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_SC_Ability_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_SC_Ability_Mode[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_SC_Ability_Perceive[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
//Grandtaur
integer array AI_GT_Item_Total_Plan[TOTAL_HERO_ATTITUDE_TYPE]
integer array AI_GT_Item_Plan[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_GT_Item_Point[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_GT_Ability_Cooldown[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_GT_Ability_Mana[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_GT_Ability_Range[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_GT_Ability_Detect_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_GT_Ability_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_GT_Ability_Mode[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_GT_Ability_Perceive[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
//Occult Sage
integer array AI_OS_Item_Total_Plan[TOTAL_HERO_ATTITUDE_TYPE]
integer array AI_OS_Item_Plan[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_OS_Item_Point[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_OS_Ability_Cooldown[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_OS_Ability_Mana[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_OS_Ability_Range[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_OS_Ability_Detect_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_OS_Ability_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_OS_Ability_Mode[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_OS_Ability_Perceive[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
//Death Legion
integer array AI_DL_Item_Total_Plan[TOTAL_HERO_ATTITUDE_TYPE]
integer array AI_DL_Item_Plan[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_DL_Item_Point[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_DL_Ability_Cooldown[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_DL_Ability_Mana[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_DL_Ability_Range[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_DL_Ability_Detect_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_DL_Ability_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_DL_Ability_Mode[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_DL_Ability_Perceive[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
//Skeleton Witch
integer array AI_SW_Item_Total_Plan[TOTAL_HERO_ATTITUDE_TYPE]
integer array AI_SW_Item_Plan[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_SW_Item_Point[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_SW_Ability_Cooldown[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_SW_Ability_Mana[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_SW_Ability_Range[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_SW_Ability_Detect_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_SW_Ability_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_SW_Ability_Mode[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_SW_Ability_Perceive[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
//Mortal Predator
integer array AI_MP_Item_Total_Plan[TOTAL_HERO_ATTITUDE_TYPE]
integer array AI_MP_Item_Plan[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_MP_Item_Point[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_MP_Ability_Cooldown[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_MP_Ability_Mana[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_MP_Ability_Range[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_MP_Ability_Detect_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_MP_Ability_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_MP_Ability_Mode[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_MP_Ability_Perceive[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
//Swarm Titan
integer array AI_ST_Item_Total_Plan[TOTAL_HERO_ATTITUDE_TYPE]
integer array AI_ST_Item_Plan[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_ST_Item_Point[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_ST_Ability_Cooldown[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_ST_Ability_Mana[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_ST_Ability_Range[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_ST_Ability_Detect_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_ST_Ability_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_ST_Ability_Mode[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_ST_Ability_Perceive[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
//Guardian of the Nature
integer array AI_GN_Item_Total_Plan[TOTAL_HERO_ATTITUDE_TYPE]
integer array AI_GN_Item_Plan[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_GN_Item_Point[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_GN_Ability_Cooldown[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_GN_Ability_Mana[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_GN_Ability_Range[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_GN_Ability_Detect_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_GN_Ability_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_GN_Ability_Mode[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_GN_Ability_Perceive[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
//Celestial Princess
integer array AI_CP_Item_Total_Plan[TOTAL_HERO_ATTITUDE_TYPE]
integer array AI_CP_Item_Plan[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_CP_Item_Point[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_CP_Ability_Cooldown[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_CP_Ability_Mana[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_CP_Ability_Range[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_CP_Ability_Detect_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_CP_Ability_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_CP_Ability_Mode[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_CP_Ability_Perceive[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
//Demon-half
integer array AI_DH_Item_Total_Plan[TOTAL_HERO_ATTITUDE_TYPE]
integer array AI_DH_Item_Plan[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_DH_Item_Point[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_DH_Ability_Cooldown[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_DH_Ability_Mana[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_DH_Ability_Range[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_DH_Ability_Detect_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_DH_Ability_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_DH_Ability_Mode[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_DH_Ability_Perceive[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
//Shadow Assassin
integer array AI_SA_Item_Total_Plan[TOTAL_HERO_ATTITUDE_TYPE]
integer array AI_SA_Item_Plan[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_SA_Item_Point[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_SA_Ability_Cooldown[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_SA_Ability_Mana[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_SA_Ability_Range[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_SA_Ability_Detect_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_SA_Ability_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_SA_Ability_Mode[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_SA_Ability_Perceive[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
//Damned Amok
integer array AI_DA_Item_Total_Plan[TOTAL_HERO_ATTITUDE_TYPE]
integer array AI_DA_Item_Plan[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_DA_Item_Point[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_DA_Ability_Cooldown[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_DA_Ability_Mana[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_DA_Ability_Range[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_DA_Ability_Detect_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_DA_Ability_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_DA_Ability_Mode[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_DA_Ability_Perceive[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
//Lone Ranger
integer array AI_LR_Item_Total_Plan[TOTAL_HERO_ATTITUDE_TYPE]
integer array AI_LR_Item_Plan[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_LR_Item_Point[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_LR_Ability_Cooldown[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_LR_Ability_Mana[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_LR_Ability_Range[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_LR_Ability_Detect_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_LR_Ability_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_LR_Ability_Mode[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_LR_Ability_Perceive[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
//Brutelord
integer array AI_BL_Item_Total_Plan[TOTAL_HERO_ATTITUDE_TYPE]
integer array AI_BL_Item_Plan[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_BL_Item_Point[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_BL_Ability_Cooldown[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_BL_Ability_Mana[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_BL_Ability_Range[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_BL_Ability_Detect_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_BL_Ability_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_BL_Ability_Mode[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_BL_Ability_Perceive[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
//Aquasorceress
integer array AI_AQ_Item_Total_Plan[TOTAL_HERO_ATTITUDE_TYPE]
integer array AI_AQ_Item_Plan[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_AQ_Item_Point[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_AQ_Ability_Cooldown[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_AQ_Ability_Mana[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_AQ_Ability_Range[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_AQ_Ability_Detect_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_AQ_Ability_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_AQ_Ability_Mode[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_AQ_Ability_Perceive[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
//Black Archer
integer array AI_BA_Item_Total_Plan[TOTAL_HERO_ATTITUDE_TYPE]
integer array AI_BA_Item_Plan[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_BA_Item_Point[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_BA_Ability_Cooldown[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_BA_Ability_Mana[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_BA_Ability_Range[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_BA_Ability_Detect_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_BA_Ability_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_BA_Ability_Mode[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_BA_Ability_Perceive[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
//Sky Wanderer
integer array AI_SY_Item_Total_Plan[TOTAL_HERO_ATTITUDE_TYPE]
integer array AI_SY_Item_Plan[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_SY_Item_Point[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_SY_Ability_Cooldown[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_SY_Ability_Mana[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_SY_Ability_Range[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_SY_Ability_Detect_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_SY_Ability_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_SY_Ability_Mode[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_SY_Ability_Perceive[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
//Beast Hunter
integer array AI_BH_Item_Total_Plan[TOTAL_HERO_ATTITUDE_TYPE]
integer array AI_BH_Item_Plan[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_BH_Item_Point[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_BH_Ability_Cooldown[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_BH_Ability_Mana[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_BH_Ability_Range[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_BH_Ability_Detect_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_BH_Ability_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_BH_Ability_Mode[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_BH_Ability_Perceive[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
//Snake Widow
integer array AI_SK_Item_Total_Plan[TOTAL_HERO_ATTITUDE_TYPE]
integer array AI_SK_Item_Plan[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_SK_Item_Point[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_SK_Ability_Cooldown[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_SK_Ability_Mana[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_SK_Ability_Range[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_SK_Ability_Detect_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_SK_Ability_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_SK_Ability_Mode[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_SK_Ability_Perceive[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
//First Conjurer
integer array AI_FC_Item_Total_Plan[TOTAL_HERO_ATTITUDE_TYPE]
integer array AI_FC_Item_Plan[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_FC_Item_Point[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_FC_Ability_Cooldown[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_FC_Ability_Mana[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_FC_Ability_Range[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_FC_Ability_Detect_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_FC_Ability_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_FC_Ability_Mode[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_FC_Ability_Perceive[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
//Volcanic Core
integer array AI_VC_Item_Total_Plan[TOTAL_HERO_ATTITUDE_TYPE]
integer array AI_VC_Item_Plan[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_VC_Item_Point[TOTAL_HERO_ATTITUDE_TYPE][30]
integer array AI_VC_Ability_Cooldown[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_VC_Ability_Mana[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_VC_Ability_Range[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_VC_Ability_Detect_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
real array AI_VC_Ability_Area[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_VC_Ability_Mode[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
integer array AI_VC_Ability_Perceive[TOTAL_HERO_SKILL][TOTAL_SKILL_LEVEL]
endglobals
scope AIKnowledge initializer Init
//----------------------------------------------------------------
function NeglectingUnits takes unit u returns boolean
local integer unitType = GetUnitTypeId(u)
local boolean check = false
local integer i = 0
if(unitType == LUMINOUS_BOAT_ID) then
set check = true
elseif(unitType == OVERCAST_BOAT_ID) then
set check = true
else
set i = 0
loop
exitwhen(i >= 8)
if(unitType == Player_Rune[i]) then
set check = true
set i = 8
endif
set i = i + 1
endloop
if(not check) then
if(IsUnitType(u, UNIT_TYPE_STRUCTURE)) then
set check = true
endif
endif
endif
return check
endfunction
//----------------------------------------------------------------
function NonAttackingUnits takes unit u returns boolean
local integer unitType = GetUnitTypeId(u)
local boolean check = false
local integer i = 0
return check
endfunction
//----------------------------------------------------------------
function SkeletonUnits takes unit u returns boolean
local integer unitType = GetUnitTypeId(u)
local boolean check = false
local integer i = 0
if(unitType == CREEP_SKELETON_GIANT_ID) then
set check = true
elseif(unitType == CREEP_SKELETON_WARRIOR_ID) then
set check = true
elseif(unitType == CREEP_SKELETON_ARCHER_ID) then
set check = true
elseif(unitType == CREEP_SKELETON_MAGE_ID) then
set check = true
endif
return check
endfunction
//----------------------------------------------------------------
function GetLifeZone takes integer heroIndex, integer zone returns real
return AI_Life_Zone[heroIndex][zone]
endfunction
//----------------------------------------------------------------
function GetManaZone takes integer heroIndex, integer zone returns real
return AI_Mana_Zone[heroIndex][zone]
endfunction
//----------------------------------------------------------------
function GetAttackZone takes integer heroIndex, integer zone returns real
return AI_Attack_Range_Zone[heroIndex][zone]
endfunction
//----------------------------------------------------------------
function GetTotalItemPlan takes integer heroIndex, integer heroType returns integer
if(heroIndex == 0) then
return AI_LB_Item_Total_Plan[heroType]
elseif(heroIndex == 1) then
return AI_AW_Item_Total_Plan[heroType]
elseif(heroIndex == 2) then
return AI_KT_Item_Total_Plan[heroType]
elseif(heroIndex == 3) then
return AI_PM_Item_Total_Plan[heroType]
elseif(heroIndex == 4) then
return AI_AS_Item_Total_Plan[heroType]
elseif(heroIndex == 5) then
return AI_SC_Item_Total_Plan[heroType]
elseif(heroIndex == 6) then
return AI_GT_Item_Total_Plan[heroType]
elseif(heroIndex == 7) then
return AI_OS_Item_Total_Plan[heroType]
elseif(heroIndex == 8) then
return AI_DL_Item_Total_Plan[heroType]
elseif(heroIndex == 9) then
return AI_SW_Item_Total_Plan[heroType]
elseif(heroIndex == 10) then
return AI_MP_Item_Total_Plan[heroType]
elseif(heroIndex == 11) then
return AI_ST_Item_Total_Plan[heroType]
elseif(heroIndex == 12) then
return AI_GN_Item_Total_Plan[heroType]
elseif(heroIndex == 13) then
return AI_CP_Item_Total_Plan[heroType]
elseif(heroIndex == 14) then
return AI_DH_Item_Total_Plan[heroType]
elseif(heroIndex == 15) then
return AI_SA_Item_Total_Plan[heroType]
elseif(heroIndex == 16) then
return AI_DA_Item_Total_Plan[heroType]
elseif(heroIndex == 17) then
return AI_LR_Item_Total_Plan[heroType]
elseif(heroIndex == 18) then
return AI_BL_Item_Total_Plan[heroType]
elseif(heroIndex == 19) then
return AI_AQ_Item_Total_Plan[heroType]
elseif(heroIndex == 20) then
return AI_BA_Item_Total_Plan[heroType]
elseif(heroIndex == 21) then
return AI_SY_Item_Total_Plan[heroType]
elseif(heroIndex == 22) then
return AI_BH_Item_Total_Plan[heroType]
elseif(heroIndex == 23) then
return AI_SK_Item_Total_Plan[heroType]
elseif(heroIndex == 24) then
return AI_FC_Item_Total_Plan[heroType]
elseif(heroIndex == 25) then
return AI_VC_Item_Total_Plan[heroType]
else
return 0
endif
endfunction
//----------------------------------------------------------------
function GetItemPlan takes integer heroIndex, integer heroType, integer itemIndex returns integer
if(heroIndex == 0) then
return AI_LB_Item_Plan[heroType][itemIndex]
elseif(heroIndex == 1) then
return AI_AW_Item_Plan[heroType][itemIndex]
elseif(heroIndex == 2) then
return AI_KT_Item_Plan[heroType][itemIndex]
elseif(heroIndex == 3) then
return AI_PM_Item_Plan[heroType][itemIndex]
elseif(heroIndex == 4) then
return AI_AS_Item_Plan[heroType][itemIndex]
elseif(heroIndex == 5) then
return AI_SC_Item_Plan[heroType][itemIndex]
elseif(heroIndex == 6) then
return AI_GT_Item_Plan[heroType][itemIndex]
elseif(heroIndex == 7) then
return AI_OS_Item_Plan[heroType][itemIndex]
elseif(heroIndex == 8) then
return AI_DL_Item_Plan[heroType][itemIndex]
elseif(heroIndex == 9) then
return AI_SW_Item_Plan[heroType][itemIndex]
elseif(heroIndex == 10) then
return AI_MP_Item_Plan[heroType][itemIndex]
elseif(heroIndex == 11) then
return AI_ST_Item_Plan[heroType][itemIndex]
elseif(heroIndex == 12) then
return AI_GN_Item_Plan[heroType][itemIndex]
elseif(heroIndex == 13) then
return AI_CP_Item_Plan[heroType][itemIndex]
elseif(heroIndex == 14) then
return AI_DH_Item_Plan[heroType][itemIndex]
elseif(heroIndex == 15) then
return AI_SA_Item_Plan[heroType][itemIndex]
elseif(heroIndex == 16) then
return AI_DA_Item_Plan[heroType][itemIndex]
elseif(heroIndex == 17) then
return AI_LR_Item_Plan[heroType][itemIndex]
elseif(heroIndex == 18) then
return AI_BL_Item_Plan[heroType][itemIndex]
elseif(heroIndex == 19) then
return AI_AQ_Item_Plan[heroType][itemIndex]
elseif(heroIndex == 20) then
return AI_BA_Item_Plan[heroType][itemIndex]
elseif(heroIndex == 21) then
return AI_SY_Item_Plan[heroType][itemIndex]
elseif(heroIndex == 22) then
return AI_BH_Item_Plan[heroType][itemIndex]
elseif(heroIndex == 23) then
return AI_SK_Item_Plan[heroType][itemIndex]
elseif(heroIndex == 24) then
return AI_FC_Item_Plan[heroType][itemIndex]
elseif(heroIndex == 25) then
return AI_VC_Item_Plan[heroType][itemIndex]
else
return 0
endif
endfunction
//----------------------------------------------------------------
function GetItemPoints takes integer heroIndex, integer heroType, integer itemIndex returns integer
if(heroIndex == 0) then
return AI_LB_Item_Point[heroType][itemIndex]
elseif(heroIndex == 1) then
return AI_AW_Item_Point[heroType][itemIndex]
elseif(heroIndex == 2) then
return AI_KT_Item_Point[heroType][itemIndex]
elseif(heroIndex == 3) then
return AI_PM_Item_Point[heroType][itemIndex]
elseif(heroIndex == 4) then
return AI_AS_Item_Point[heroType][itemIndex]
elseif(heroIndex == 5) then
return AI_SC_Item_Point[heroType][itemIndex]
elseif(heroIndex == 6) then
return AI_GT_Item_Point[heroType][itemIndex]
elseif(heroIndex == 7) then
return AI_OS_Item_Point[heroType][itemIndex]
elseif(heroIndex == 8) then
return AI_DL_Item_Point[heroType][itemIndex]
elseif(heroIndex == 9) then
return AI_SW_Item_Point[heroType][itemIndex]
elseif(heroIndex == 10) then
return AI_MP_Item_Point[heroType][itemIndex]
elseif(heroIndex == 11) then
return AI_ST_Item_Point[heroType][itemIndex]
elseif(heroIndex == 12) then
return AI_GN_Item_Point[heroType][itemIndex]
elseif(heroIndex == 13) then
return AI_CP_Item_Point[heroType][itemIndex]
elseif(heroIndex == 14) then
return AI_DH_Item_Point[heroType][itemIndex]
elseif(heroIndex == 15) then
return AI_SA_Item_Point[heroType][itemIndex]
elseif(heroIndex == 16) then
return AI_DA_Item_Point[heroType][itemIndex]
elseif(heroIndex == 17) then
return AI_LR_Item_Point[heroType][itemIndex]
elseif(heroIndex == 18) then
return AI_BL_Item_Point[heroType][itemIndex]
elseif(heroIndex == 19) then
return AI_AQ_Item_Point[heroType][itemIndex]
elseif(heroIndex == 20) then
return AI_BA_Item_Point[heroType][itemIndex]
elseif(heroIndex == 21) then
return AI_SY_Item_Point[heroType][itemIndex]
elseif(heroIndex == 22) then
return AI_BH_Item_Point[heroType][itemIndex]
elseif(heroIndex == 23) then
return AI_SK_Item_Point[heroType][itemIndex]
elseif(heroIndex == 24) then
return AI_FC_Item_Point[heroType][itemIndex]
elseif(heroIndex == 25) then
return AI_VC_Item_Point[heroType][itemIndex]
else
return 0
endif
endfunction
//----------------------------------------------------------------
function IsHeroAbilityRequireRefresh takes integer heroIndex, integer abilityIndex returns boolean
if(AI_Ability_Type[heroIndex][abilityIndex] == ABILITY_TYPE_ULTIMATE_ACTIVATE or /*
*/AI_Ability_Type[heroIndex][abilityIndex] == ABILITY_TYPE_ULTIMATE_TRANSFORM or /*
*/AI_Ability_Type[heroIndex][abilityIndex] == ABILITY_TYPE_DEFENSE_ACTIVATE) then
return true
else
return false
endif
endfunction
//----------------------------------------------------------------
function GetHeroAbilityCooldown takes integer heroIndex, integer abilityIndex, integer level returns integer
if(heroIndex == 0) then
return AI_LB_Ability_Cooldown[abilityIndex][level-1]
elseif(heroIndex == 1) then
return AI_AW_Ability_Cooldown[abilityIndex][level-1]
elseif(heroIndex == 2) then
return AI_KT_Ability_Cooldown[abilityIndex][level-1]
elseif(heroIndex == 3) then
return AI_PM_Ability_Cooldown[abilityIndex][level-1]
elseif(heroIndex == 4) then
return AI_AS_Ability_Cooldown[abilityIndex][level-1]
elseif(heroIndex == 5) then
return AI_SC_Ability_Cooldown[abilityIndex][level-1]
elseif(heroIndex == 6) then
return AI_GT_Ability_Cooldown[abilityIndex][level-1]
elseif(heroIndex == 7) then
return AI_OS_Ability_Cooldown[abilityIndex][level-1]
elseif(heroIndex == 8) then
return AI_DL_Ability_Cooldown[abilityIndex][level-1]
elseif(heroIndex == 9) then
return AI_SW_Ability_Cooldown[abilityIndex][level-1]
elseif(heroIndex == 10) then
return AI_MP_Ability_Cooldown[abilityIndex][level-1]
elseif(heroIndex == 11) then
return AI_ST_Ability_Cooldown[abilityIndex][level-1]
elseif(heroIndex == 12) then
return AI_GN_Ability_Cooldown[abilityIndex][level-1]
elseif(heroIndex == 13) then
return AI_CP_Ability_Cooldown[abilityIndex][level-1]
elseif(heroIndex == 14) then
return AI_DH_Ability_Cooldown[abilityIndex][level-1]
elseif(heroIndex == 15) then
return AI_SA_Ability_Cooldown[abilityIndex][level-1]
elseif(heroIndex == 16) then
return AI_DA_Ability_Cooldown[abilityIndex][level-1]
elseif(heroIndex == 17) then
return AI_LR_Ability_Cooldown[abilityIndex][level-1]
elseif(heroIndex == 18) then
return AI_BL_Ability_Cooldown[abilityIndex][level-1]
elseif(heroIndex == 19) then
return AI_AQ_Ability_Cooldown[abilityIndex][level-1]
elseif(heroIndex == 20) then
return AI_BA_Ability_Cooldown[abilityIndex][level-1]
elseif(heroIndex == 21) then
return AI_SY_Ability_Cooldown[abilityIndex][level-1]
elseif(heroIndex == 22) then
return AI_BH_Ability_Cooldown[abilityIndex][level-1]
elseif(heroIndex == 23) then
return AI_SK_Ability_Cooldown[abilityIndex][level-1]
elseif(heroIndex == 24) then
return AI_FC_Ability_Cooldown[abilityIndex][level-1]
elseif(heroIndex == 25) then
return AI_VC_Ability_Cooldown[abilityIndex][level-1]
else
return 0
endif
endfunction
//----------------------------------------------------------------
function GetHeroAbilityManaCost takes integer heroIndex, integer abilityIndex, integer level returns real
if(heroIndex == 0) then
return AI_LB_Ability_Mana[abilityIndex][level-1]
elseif(heroIndex == 1) then
return AI_AW_Ability_Mana[abilityIndex][level-1]
elseif(heroIndex == 2) then
return AI_KT_Ability_Mana[abilityIndex][level-1]
elseif(heroIndex == 3) then
return AI_PM_Ability_Mana[abilityIndex][level-1]
elseif(heroIndex == 4) then
return AI_AS_Ability_Mana[abilityIndex][level-1]
elseif(heroIndex == 5) then
return AI_SC_Ability_Mana[abilityIndex][level-1]
elseif(heroIndex == 6) then
return AI_GT_Ability_Mana[abilityIndex][level-1]
elseif(heroIndex == 7) then
return AI_OS_Ability_Mana[abilityIndex][level-1]
elseif(heroIndex == 8) then
return AI_DL_Ability_Mana[abilityIndex][level-1]
elseif(heroIndex == 9) then
return AI_SW_Ability_Mana[abilityIndex][level-1]
elseif(heroIndex == 10) then
return AI_MP_Ability_Mana[abilityIndex][level-1]
elseif(heroIndex == 11) then
return AI_ST_Ability_Mana[abilityIndex][level-1]
elseif(heroIndex == 12) then
return AI_GN_Ability_Mana[abilityIndex][level-1]
elseif(heroIndex == 13) then
return AI_CP_Ability_Mana[abilityIndex][level-1]
elseif(heroIndex == 14) then
return AI_DH_Ability_Mana[abilityIndex][level-1]
elseif(heroIndex == 15) then
return AI_SA_Ability_Mana[abilityIndex][level-1]
elseif(heroIndex == 16) then
return AI_DA_Ability_Mana[abilityIndex][level-1]
elseif(heroIndex == 17) then
return AI_LR_Ability_Mana[abilityIndex][level-1]
elseif(heroIndex == 18) then
return AI_BL_Ability_Mana[abilityIndex][level-1]
elseif(heroIndex == 19) then
return AI_AQ_Ability_Mana[abilityIndex][level-1]
elseif(heroIndex == 20) then
return AI_BA_Ability_Mana[abilityIndex][level-1]
elseif(heroIndex == 21) then
return AI_SY_Ability_Mana[abilityIndex][level-1]
elseif(heroIndex == 22) then
return AI_BH_Ability_Mana[abilityIndex][level-1]
elseif(heroIndex == 23) then
return AI_SK_Ability_Mana[abilityIndex][level-1]
elseif(heroIndex == 24) then
return AI_FC_Ability_Mana[abilityIndex][level-1]
elseif(heroIndex == 25) then
return AI_VC_Ability_Mana[abilityIndex][level-1]
else
return 0.0
endif
endfunction
//----------------------------------------------------------------
function GetHeroAbilityRange takes integer heroIndex, integer abilityIndex, integer level returns real
if(heroIndex == 0) then
return AI_LB_Ability_Range[abilityIndex][level-1]
elseif(heroIndex == 1) then
return AI_AW_Ability_Range[abilityIndex][level-1]
elseif(heroIndex == 2) then
return AI_KT_Ability_Range[abilityIndex][level-1]
elseif(heroIndex == 3) then
return AI_PM_Ability_Range[abilityIndex][level-1]
elseif(heroIndex == 4) then
return AI_AS_Ability_Range[abilityIndex][level-1]
elseif(heroIndex == 5) then
return AI_SC_Ability_Range[abilityIndex][level-1]
elseif(heroIndex == 6) then
return AI_GT_Ability_Range[abilityIndex][level-1]
elseif(heroIndex == 7) then
return AI_OS_Ability_Range[abilityIndex][level-1]
elseif(heroIndex == 8) then
return AI_DL_Ability_Range[abilityIndex][level-1]
elseif(heroIndex == 9) then
return AI_SW_Ability_Range[abilityIndex][level-1]
elseif(heroIndex == 10) then
return AI_MP_Ability_Range[abilityIndex][level-1]
elseif(heroIndex == 11) then
return AI_ST_Ability_Range[abilityIndex][level-1]
elseif(heroIndex == 12) then
return AI_GN_Ability_Range[abilityIndex][level-1]
elseif(heroIndex == 13) then
return AI_CP_Ability_Range[abilityIndex][level-1]
elseif(heroIndex == 14) then
return AI_DH_Ability_Range[abilityIndex][level-1]
elseif(heroIndex == 15) then
return AI_SA_Ability_Range[abilityIndex][level-1]
elseif(heroIndex == 16) then
return AI_DA_Ability_Range[abilityIndex][level-1]
elseif(heroIndex == 17) then
return AI_LR_Ability_Range[abilityIndex][level-1]
elseif(heroIndex == 18) then
return AI_BL_Ability_Range[abilityIndex][level-1]
elseif(heroIndex == 19) then
return AI_AQ_Ability_Range[abilityIndex][level-1]
elseif(heroIndex == 20) then
return AI_BA_Ability_Range[abilityIndex][level-1]
elseif(heroIndex == 21) then
return AI_SY_Ability_Range[abilityIndex][level-1]
elseif(heroIndex == 22) then
return AI_BH_Ability_Range[abilityIndex][level-1]
elseif(heroIndex == 23) then
return AI_SK_Ability_Range[abilityIndex][level-1]
elseif(heroIndex == 24) then
return AI_FC_Ability_Range[abilityIndex][level-1]
elseif(heroIndex == 25) then
return AI_VC_Ability_Range[abilityIndex][level-1]
else
return 0.0
endif
endfunction
//----------------------------------------------------------------
function GetHeroAbilityDetectArea takes integer heroIndex, integer abilityIndex, integer level returns real
if(heroIndex == 0) then
return AI_LB_Ability_Detect_Area[abilityIndex][level-1]
elseif(heroIndex == 1) then
return AI_AW_Ability_Detect_Area[abilityIndex][level-1]
elseif(heroIndex == 2) then
return AI_KT_Ability_Detect_Area[abilityIndex][level-1]
elseif(heroIndex == 3) then
return AI_PM_Ability_Detect_Area[abilityIndex][level-1]
elseif(heroIndex == 4) then
return AI_AS_Ability_Detect_Area[abilityIndex][level-1]
elseif(heroIndex == 5) then
return AI_SC_Ability_Detect_Area[abilityIndex][level-1]
elseif(heroIndex == 6) then
return AI_GT_Ability_Detect_Area[abilityIndex][level-1]
elseif(heroIndex == 7) then
return AI_OS_Ability_Detect_Area[abilityIndex][level-1]
elseif(heroIndex == 8) then
return AI_DL_Ability_Detect_Area[abilityIndex][level-1]
elseif(heroIndex == 9) then
return AI_SW_Ability_Detect_Area[abilityIndex][level-1]
elseif(heroIndex == 10) then
return AI_MP_Ability_Detect_Area[abilityIndex][level-1]
elseif(heroIndex == 11) then
return AI_ST_Ability_Detect_Area[abilityIndex][level-1]
elseif(heroIndex == 12) then
return AI_GN_Ability_Detect_Area[abilityIndex][level-1]
elseif(heroIndex == 13) then
return AI_CP_Ability_Detect_Area[abilityIndex][level-1]
elseif(heroIndex == 14) then
return AI_DH_Ability_Detect_Area[abilityIndex][level-1]
elseif(heroIndex == 15) then
return AI_SA_Ability_Detect_Area[abilityIndex][level-1]
elseif(heroIndex == 16) then
return AI_DA_Ability_Detect_Area[abilityIndex][level-1]
elseif(heroIndex == 17) then
return AI_LR_Ability_Detect_Area[abilityIndex][level-1]
elseif(heroIndex == 18) then
return AI_BL_Ability_Detect_Area[abilityIndex][level-1]
elseif(heroIndex == 19) then
return AI_AQ_Ability_Detect_Area[abilityIndex][level-1]
elseif(heroIndex == 20) then
return AI_BA_Ability_Detect_Area[abilityIndex][level-1]
elseif(heroIndex == 21) then
return AI_SY_Ability_Detect_Area[abilityIndex][level-1]
elseif(heroIndex == 22) then
return AI_BH_Ability_Detect_Area[abilityIndex][level-1]
elseif(heroIndex == 23) then
return AI_SK_Ability_Detect_Area[abilityIndex][level-1]
elseif(heroIndex == 24) then
return AI_FC_Ability_Detect_Area[abilityIndex][level-1]
elseif(heroIndex == 25) then
return AI_VC_Ability_Detect_Area[abilityIndex][level-1]
else
return 0.0
endif
endfunction
//----------------------------------------------------------------
function GetHeroAbilityArea takes integer heroIndex, integer abilityIndex, integer level returns real
if(heroIndex == 0) then
return AI_LB_Ability_Area[abilityIndex][level-1]
elseif(heroIndex == 1) then
return AI_AW_Ability_Area[abilityIndex][level-1]
elseif(heroIndex == 2) then
return AI_KT_Ability_Area[abilityIndex][level-1]
elseif(heroIndex == 3) then
return AI_PM_Ability_Area[abilityIndex][level-1]
elseif(heroIndex == 4) then
return AI_AS_Ability_Area[abilityIndex][level-1]
elseif(heroIndex == 5) then
return AI_SC_Ability_Area[abilityIndex][level-1]
elseif(heroIndex == 6) then
return AI_GT_Ability_Area[abilityIndex][level-1]
elseif(heroIndex == 7) then
return AI_OS_Ability_Area[abilityIndex][level-1]
elseif(heroIndex == 8) then
return AI_DL_Ability_Area[abilityIndex][level-1]
elseif(heroIndex == 9) then
return AI_SW_Ability_Area[abilityIndex][level-1]
elseif(heroIndex == 10) then
return AI_MP_Ability_Area[abilityIndex][level-1]
elseif(heroIndex == 11) then
return AI_ST_Ability_Area[abilityIndex][level-1]
elseif(heroIndex == 12) then
return AI_GN_Ability_Area[abilityIndex][level-1]
elseif(heroIndex == 13) then
return AI_CP_Ability_Area[abilityIndex][level-1]
elseif(heroIndex == 14) then
return AI_DH_Ability_Area[abilityIndex][level-1]
elseif(heroIndex == 15) then
return AI_SA_Ability_Area[abilityIndex][level-1]
elseif(heroIndex == 16) then
return AI_DA_Ability_Area[abilityIndex][level-1]
elseif(heroIndex == 17) then
return AI_LR_Ability_Area[abilityIndex][level-1]
elseif(heroIndex == 18) then
return AI_BL_Ability_Area[abilityIndex][level-1]
elseif(heroIndex == 19) then
return AI_AQ_Ability_Area[abilityIndex][level-1]
elseif(heroIndex == 20) then
return AI_BA_Ability_Area[abilityIndex][level-1]
elseif(heroIndex == 21) then
return AI_SY_Ability_Area[abilityIndex][level-1]
elseif(heroIndex == 22) then
return AI_BH_Ability_Area[abilityIndex][level-1]
elseif(heroIndex == 23) then
return AI_SK_Ability_Area[abilityIndex][level-1]
elseif(heroIndex == 23) then
return AI_FC_Ability_Area[abilityIndex][level-1]
elseif(heroIndex == 24) then
return AI_VC_Ability_Area[abilityIndex][level-1]
else
return 0.0
endif
endfunction
//----------------------------------------------------------------
function GetHeroAbilityMode takes integer heroIndex, integer abilityIndex, integer level returns integer
if(heroIndex == 0) then
return AI_LB_Ability_Mode[abilityIndex][level-1]
elseif(heroIndex == 1) then
return AI_AW_Ability_Mode[abilityIndex][level-1]
elseif(heroIndex == 2) then
return AI_KT_Ability_Mode[abilityIndex][level-1]
elseif(heroIndex == 3) then
return AI_PM_Ability_Mode[abilityIndex][level-1]
elseif(heroIndex == 4) then
return AI_AS_Ability_Mode[abilityIndex][level-1]
elseif(heroIndex == 5) then
return AI_SC_Ability_Mode[abilityIndex][level-1]
elseif(heroIndex == 6) then
return AI_GT_Ability_Mode[abilityIndex][level-1]
elseif(heroIndex == 7) then
return AI_OS_Ability_Mode[abilityIndex][level-1]
elseif(heroIndex == 8) then
return AI_DL_Ability_Mode[abilityIndex][level-1]
elseif(heroIndex == 9) then
return AI_SW_Ability_Mode[abilityIndex][level-1]
elseif(heroIndex == 10) then
return AI_MP_Ability_Mode[abilityIndex][level-1]
elseif(heroIndex == 11) then
return AI_ST_Ability_Mode[abilityIndex][level-1]
elseif(heroIndex == 12) then
return AI_GN_Ability_Mode[abilityIndex][level-1]
elseif(heroIndex == 13) then
return AI_CP_Ability_Mode[abilityIndex][level-1]
elseif(heroIndex == 14) then
return AI_DH_Ability_Mode[abilityIndex][level-1]
elseif(heroIndex == 15) then
return AI_SA_Ability_Mode[abilityIndex][level-1]
elseif(heroIndex == 16) then
return AI_DA_Ability_Mode[abilityIndex][level-1]
elseif(heroIndex == 17) then
return AI_LR_Ability_Mode[abilityIndex][level-1]
elseif(heroIndex == 18) then
return AI_BL_Ability_Mode[abilityIndex][level-1]
elseif(heroIndex == 19) then
return AI_AQ_Ability_Mode[abilityIndex][level-1]
elseif(heroIndex == 20) then
return AI_BA_Ability_Mode[abilityIndex][level-1]
elseif(heroIndex == 21) then
return AI_SY_Ability_Mode[abilityIndex][level-1]
elseif(heroIndex == 22) then
return AI_BH_Ability_Mode[abilityIndex][level-1]
elseif(heroIndex == 23) then
return AI_SK_Ability_Mode[abilityIndex][level-1]
elseif(heroIndex == 24) then
return AI_FC_Ability_Mode[abilityIndex][level-1]
elseif(heroIndex == 25) then
return AI_VC_Ability_Mode[abilityIndex][level-1]
else
return 0
endif
endfunction
//----------------------------------------------------------------
function GetHeroAbilityPerceive takes integer heroIndex, integer abilityIndex, integer level returns integer
if(heroIndex == 0) then
return AI_LB_Ability_Perceive[abilityIndex][level-1]
elseif(heroIndex == 1) then
return AI_AW_Ability_Perceive[abilityIndex][level-1]
elseif(heroIndex == 2) then
return AI_KT_Ability_Perceive[abilityIndex][level-1]
elseif(heroIndex == 3) then
return AI_PM_Ability_Perceive[abilityIndex][level-1]
elseif(heroIndex == 4) then
return AI_AS_Ability_Perceive[abilityIndex][level-1]
elseif(heroIndex == 5) then
return AI_SC_Ability_Perceive[abilityIndex][level-1]
elseif(heroIndex == 6) then
return AI_GT_Ability_Perceive[abilityIndex][level-1]
elseif(heroIndex == 7) then
return AI_OS_Ability_Perceive[abilityIndex][level-1]
elseif(heroIndex == 8) then
return AI_DL_Ability_Perceive[abilityIndex][level-1]
elseif(heroIndex == 9) then
return AI_SW_Ability_Perceive[abilityIndex][level-1]
elseif(heroIndex == 10) then
return AI_MP_Ability_Perceive[abilityIndex][level-1]
elseif(heroIndex == 11) then
return AI_ST_Ability_Perceive[abilityIndex][level-1]
elseif(heroIndex == 12) then
return AI_GN_Ability_Perceive[abilityIndex][level-1]
elseif(heroIndex == 13) then
return AI_CP_Ability_Perceive[abilityIndex][level-1]
elseif(heroIndex == 14) then
return AI_DH_Ability_Perceive[abilityIndex][level-1]
elseif(heroIndex == 15) then
return AI_SA_Ability_Perceive[abilityIndex][level-1]
elseif(heroIndex == 16) then
return AI_DA_Ability_Perceive[abilityIndex][level-1]
elseif(heroIndex == 17) then
return AI_LR_Ability_Perceive[abilityIndex][level-1]
elseif(heroIndex == 18) then
return AI_BL_Ability_Perceive[abilityIndex][level-1]
elseif(heroIndex == 19) then
return AI_AQ_Ability_Perceive[abilityIndex][level-1]
elseif(heroIndex == 20) then
return AI_BA_Ability_Perceive[abilityIndex][level-1]
elseif(heroIndex == 21) then
return AI_SY_Ability_Perceive[abilityIndex][level-1]
elseif(heroIndex == 22) then
return AI_BH_Ability_Perceive[abilityIndex][level-1]
elseif(heroIndex == 23) then
return AI_SK_Ability_Perceive[abilityIndex][level-1]
elseif(heroIndex == 24) then
return AI_FC_Ability_Perceive[abilityIndex][level-1]
elseif(heroIndex == 25) then
return AI_FC_Ability_Perceive[abilityIndex][level-1]
else
return 0
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set AI_Boat_Location[0] = gg_rct_AI_Boat_Location_1
set AI_Boat_Location[1] = gg_rct_AI_Boat_Location_2
set AI_Boat_Location[2] = gg_rct_AI_Boat_Location_3
set AI_Boat_Location[3] = gg_rct_AI_Boat_Location_4
set AI_Boat_Location[4] = gg_rct_AI_Boat_Location_5
set AI_Boat_Location[5] = gg_rct_AI_Boat_Location_6
set AI_Boat_Location[6] = gg_rct_AI_Boat_Location_7
set AI_Boat_Location[7] = gg_rct_AI_Boat_Location_8
set AI_Rune_Restoration_Location[0] = gg_rct_Rune_Top_Right_Corner
set AI_Rune_Restoration_Location[1] = gg_rct_Rune_Bottom_Left_Corner
set AI_Rune_Restoration_Location[2] = gg_rct_Rune_Top_Left
set AI_Rune_Restoration_Location[3] = gg_rct_Rune_Bottom_Right
set AI_Glyph_Fortification_Location[0] = gg_rct_Rune_Top_Right
set AI_Glyph_Fortification_Location[1] = gg_rct_Rune_Bottom_Left
set KNOWLEDGE_READY_TOP_RIGHT = gg_rct_Rune_Top_Right_Middle
set KNOWLEDGE_READY_TOP_LEFT = gg_rct_Rune_Top_Left_Middle
set KNOWLEDGE_READY_BOTTOM_LEFT = gg_rct_Rune_Bottom_Left_Middle
set KNOWLEDGE_READY_BOTTOM_RIGHT = gg_rct_Rune_Bottom_Right_Middle
endfunction
endscope
//TESH.scrollpos=221
//TESH.alwaysfold=0
scope AIKnowledgeLB initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Light Bringer
if(true) then
set AI_Life_Zone[0][0] = 40
set AI_Life_Zone[0][1] = 60
set AI_Life_Zone[0][2] = 100
set AI_Mana_Zone[0][0] = 30
set AI_Mana_Zone[0][1] = 70
set AI_Mana_Zone[0][2] = 100
set AI_Attack_Range_Zone[0][0] = 200
set AI_Attack_Range_Zone[0][1] = 200
//Offense attitude
set AI_LB_Item_Total_Plan[0] = 22
if(true) then
//Wrist of Hercules
set AI_LB_Item_Plan[0][0] = 'bgst'
set AI_LB_Item_Plan[0][1] = 'bgst'
set AI_LB_Item_Plan[0][2] = 'rlif'
set AI_LB_Item_Plan[0][3] = 'rlif'
set AI_LB_Item_Plan[0][4] = 'bgst'
set AI_LB_Item_Plan[0][5] = 'bgst'
set AI_LB_Item_Plan[0][6] = 'rlif'
set AI_LB_Item_Plan[0][7] = 'rlif'
set AI_LB_Item_Point[0][0] = 2
set AI_LB_Item_Point[0][1] = 2
set AI_LB_Item_Point[0][2] = 2
set AI_LB_Item_Point[0][3] = 2
set AI_LB_Item_Point[0][4] = 2
set AI_LB_Item_Point[0][5] = 2
set AI_LB_Item_Point[0][6] = 2
set AI_LB_Item_Point[0][7] = 2
//Throne of Emperor
set AI_LB_Item_Plan[0][8] = 'I00F'
set AI_LB_Item_Plan[0][9] = 'I00F'
set AI_LB_Item_Plan[0][10] = 'I00A'
set AI_LB_Item_Plan[0][11] = 'I00K'
set AI_LB_Item_Plan[0][12] = 'I00K'
set AI_LB_Item_Point[0][8] = 5
set AI_LB_Item_Point[0][9] = 5
set AI_LB_Item_Point[0][10] = 3
set AI_LB_Item_Point[0][11] = 2
set AI_LB_Item_Point[0][12] = 2
//Power Fragment
set AI_LB_Item_Plan[0][13] = 'penr'
set AI_LB_Item_Plan[0][14] = 'penr'
set AI_LB_Item_Plan[0][15] = 'sman'
set AI_LB_Item_Point[0][13] = 1
set AI_LB_Item_Point[0][14] = 1
set AI_LB_Item_Point[0][15] = 5
//Havocrave Dissever
set AI_LB_Item_Plan[0][16] = 'I00M'
set AI_LB_Item_Plan[0][17] = 'rej6'
set AI_LB_Item_Plan[0][18] = 'rej6'
set AI_LB_Item_Point[0][16] = 10
set AI_LB_Item_Point[0][17] = 5
set AI_LB_Item_Point[0][18] = 5
//Heaven Rapier
set AI_LB_Item_Plan[0][19] = 'kpin'
set AI_LB_Item_Plan[0][20] = 'I00Q'
set AI_LB_Item_Point[0][19] = 15
set AI_LB_Item_Point[0][20] = 15
//Aphotical Scythe
set AI_LB_Item_Plan[0][21] = 'rugt'
set AI_LB_Item_Point[0][21] = 26
endif
//Defense attitude
set AI_LB_Item_Total_Plan[1] = 14
if(true) then
//Royaltouch
set AI_LB_Item_Plan[1][0] = 'rlif'
set AI_LB_Item_Plan[1][1] = 'rlif'
set AI_LB_Item_Plan[1][2] = 'shea'
set AI_LB_Item_Point[1][0] = 2
set AI_LB_Item_Point[1][1] = 2
set AI_LB_Item_Point[1][2] = 2
//Power Fragment
set AI_LB_Item_Plan[1][3] = 'penr'
set AI_LB_Item_Plan[1][4] = 'penr'
set AI_LB_Item_Plan[1][5] = 'sman'
set AI_LB_Item_Point[1][3] = 1
set AI_LB_Item_Point[1][4] = 1
set AI_LB_Item_Point[1][5] = 5
//Orenda Spectrum
set AI_LB_Item_Plan[1][6] = 'rde2'
set AI_LB_Item_Plan[1][7] = 'scul'
set AI_LB_Item_Plan[1][8] = 'I00%'
set AI_LB_Item_Point[1][6] = 5
set AI_LB_Item_Point[1][7] = 2
set AI_LB_Item_Point[1][8] = 5
//Wrist of Hercules
set AI_LB_Item_Plan[1][9] = 'brac'
set AI_LB_Item_Plan[1][10] = 'brac'
set AI_LB_Item_Point[1][9] = 10
set AI_LB_Item_Point[1][10] = 10
//Throne of Emperor
set AI_LB_Item_Plan[1][11] = 'I01F'
set AI_LB_Item_Plan[1][12] = 'bspd'
set AI_LB_Item_Point[1][11] = 20
set AI_LB_Item_Point[1][12] = 20
//Skypath Strider
set AI_LB_Item_Plan[1][13] = 'I019'
set AI_LB_Item_Point[1][13] = 30
endif
//General ability
if(true) then
set AI_Ability_Type[0][0] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[0][1] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[0][2] = ABILITY_TYPE_MOBILE
set AI_Ability_Type[0][3] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[0][4] = ABILITY_TYPE_ULTIMATE
set AI_Ability_Order_Type[0][0] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Order_Type[0][1] = ACTION_ORDER_TYPE_UNKNOWN
set AI_Ability_Order_Type[0][2] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Order_Type[0][3] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[0][4] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Level[0][0] = 4
set AI_Ability_Level[0][1] = 3
set AI_Ability_Level[0][2] = 3
set AI_Ability_Level[0][3] = 3
set AI_Ability_Level[0][4] = 2
set AI_Ability_Type_Score[0][0] = 6
set AI_Ability_Type_Score[0][1] = 4
set AI_Ability_Type_Score[0][2] = 10
set AI_Ability_Type_Score[0][3] = 6
set AI_Ability_Type_Score[0][4] = 10
set AI_Ability_ID[0][0] = 'A047'
set AI_Ability_ID[0][1] = 'AHad'
set AI_Ability_ID[0][2] = 'A049'
set AI_Ability_ID[0][3] = 'A048'
set AI_Ability_ID[0][4] = 'A04A'
set AI_Ability_Learn_Skip[0][0] = 2
set AI_Ability_Learn_Skip[0][1] = 2
set AI_Ability_Learn_Skip[0][2] = 2
set AI_Ability_Learn_Skip[0][3] = 2
set AI_Ability_Learn_Skip[0][4] = 7
set AI_Ability_Level_Required[0][0] = 0
set AI_Ability_Level_Required[0][1] = 0
set AI_Ability_Level_Required[0][2] = 0
set AI_Ability_Level_Required[0][3] = 0
set AI_Ability_Level_Required[0][4] = 6
set AI_Ability_Order[0][0] = "web"
set AI_Ability_Order[0][1] = ""
set AI_Ability_Order[0][2] = "windwalk"
set AI_Ability_Order[0][3] = "weboff"
set AI_Ability_Order[0][4] = "whirlwind"
set AI_Ability_Order_Next[0][0] = ""
set AI_Ability_Order_Next[0][1] = ""
set AI_Ability_Order_Next[0][2] = ""
set AI_Ability_Order_Next[0][3] = ""
set AI_Ability_Order_Next[0][4] = ""
set AI_Ability_Buff[0][0] = 0
set AI_Ability_Buff[0][1] = 0
set AI_Ability_Buff[0][2] = 0
set AI_Ability_Buff[0][3] = 0
set AI_Ability_Buff[0][4] = 0
endif
//Holy Light
if(true) then
set AI_LB_Ability_Cooldown[0][0] = 28
set AI_LB_Ability_Cooldown[0][1] = 24
set AI_LB_Ability_Cooldown[0][2] = 18
set AI_LB_Ability_Cooldown[0][3] = 10
set AI_LB_Ability_Mana[0][0] = 140
set AI_LB_Ability_Mana[0][1] = 140
set AI_LB_Ability_Mana[0][2] = 140
set AI_LB_Ability_Mana[0][3] = 140
set AI_LB_Ability_Range[0][0] = 600.0
set AI_LB_Ability_Range[0][1] = 700.0
set AI_LB_Ability_Range[0][2] = 800.0
set AI_LB_Ability_Range[0][3] = 900.0
set AI_LB_Ability_Detect_Area[0][0] = 250.0
set AI_LB_Ability_Detect_Area[0][1] = 250.0
set AI_LB_Ability_Detect_Area[0][2] = 250.0
set AI_LB_Ability_Detect_Area[0][3] = 250.0
set AI_LB_Ability_Area[0][0] = 200.0
set AI_LB_Ability_Area[0][1] = 200.0
set AI_LB_Ability_Area[0][2] = 200.0
set AI_LB_Ability_Area[0][3] = 200.0
set AI_LB_Ability_Mode[0][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_LB_Ability_Mode[0][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_LB_Ability_Mode[0][2] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_LB_Ability_Mode[0][3] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_LB_Ability_Perceive[0][0] = 75
set AI_LB_Ability_Perceive[0][1] = 50
set AI_LB_Ability_Perceive[0][2] = 40
set AI_LB_Ability_Perceive[0][3] = 25
endif
//Unity Bless
if(true) then
set AI_LB_Ability_Cooldown[1][0] = 0
set AI_LB_Ability_Cooldown[1][1] = 0
set AI_LB_Ability_Cooldown[1][2] = 0
set AI_LB_Ability_Cooldown[1][3] = 0
set AI_LB_Ability_Mana[1][0] = 0
set AI_LB_Ability_Mana[1][1] = 0
set AI_LB_Ability_Mana[1][2] = 0
set AI_LB_Ability_Mana[1][3] = 0
set AI_LB_Ability_Range[1][0] = 0.0
set AI_LB_Ability_Range[1][1] = 0.0
set AI_LB_Ability_Range[1][2] = 0.0
set AI_LB_Ability_Range[1][3] = 0.0
set AI_LB_Ability_Area[1][0] = 0.0
set AI_LB_Ability_Area[1][1] = 0.0
set AI_LB_Ability_Area[1][2] = 0.0
set AI_LB_Ability_Area[1][3] = 0.0
set AI_LB_Ability_Mode[1][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_LB_Ability_Mode[1][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_LB_Ability_Mode[1][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_LB_Ability_Mode[1][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_LB_Ability_Perceive[1][0] = 0
set AI_LB_Ability_Perceive[1][1] = 0
set AI_LB_Ability_Perceive[1][2] = 0
set AI_LB_Ability_Perceive[1][3] = 0
endif
//Angel Flash
if(true) then
set AI_LB_Ability_Cooldown[2][0] = 60
set AI_LB_Ability_Cooldown[2][1] = 50
set AI_LB_Ability_Cooldown[2][2] = 30
set AI_LB_Ability_Cooldown[2][3] = 0
set AI_LB_Ability_Mana[2][0] = 150
set AI_LB_Ability_Mana[2][1] = 150
set AI_LB_Ability_Mana[2][2] = 150
set AI_LB_Ability_Mana[2][3] = 0
set AI_LB_Ability_Range[2][0] = 5000.0
set AI_LB_Ability_Range[2][1] = 5000.0
set AI_LB_Ability_Range[2][2] = 5000.0
set AI_LB_Ability_Range[2][3] = 0.0
set AI_LB_Ability_Detect_Area[2][0] = 0.0
set AI_LB_Ability_Detect_Area[2][1] = 0.0
set AI_LB_Ability_Detect_Area[2][2] = 0.0
set AI_LB_Ability_Detect_Area[2][3] = 0.0
set AI_LB_Ability_Area[2][0] = 0.0
set AI_LB_Ability_Area[2][1] = 0.0
set AI_LB_Ability_Area[2][2] = 0.0
set AI_LB_Ability_Area[2][3] = 0.0
set AI_LB_Ability_Mode[2][0] = KNOWLEDGE_ABILITY_MODE_ALLY
set AI_LB_Ability_Mode[2][1] = KNOWLEDGE_ABILITY_MODE_ALLY
set AI_LB_Ability_Mode[2][2] = KNOWLEDGE_ABILITY_MODE_ALLY
set AI_LB_Ability_Mode[2][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_LB_Ability_Perceive[2][0] = 5
set AI_LB_Ability_Perceive[2][1] = 5
set AI_LB_Ability_Perceive[2][2] = 5
set AI_LB_Ability_Perceive[2][3] = 5
endif
//Grace
if(true) then
set AI_LB_Ability_Cooldown[3][0] = 24
set AI_LB_Ability_Cooldown[3][1] = 20
set AI_LB_Ability_Cooldown[3][2] = 16
set AI_LB_Ability_Cooldown[3][3] = 0
set AI_LB_Ability_Mana[3][0] = 80
set AI_LB_Ability_Mana[3][1] = 100
set AI_LB_Ability_Mana[3][2] = 120
set AI_LB_Ability_Mana[3][3] = 0
set AI_LB_Ability_Range[3][0] = 0.0
set AI_LB_Ability_Range[3][1] = 0.0
set AI_LB_Ability_Range[3][2] = 0.0
set AI_LB_Ability_Range[3][3] = 0.0
set AI_LB_Ability_Detect_Area[3][0] = 500.0
set AI_LB_Ability_Detect_Area[3][1] = 600.0
set AI_LB_Ability_Detect_Area[3][2] = 700.0
set AI_LB_Ability_Detect_Area[3][3] = 800.0
set AI_LB_Ability_Area[3][0] = 1000.0
set AI_LB_Ability_Area[3][1] = 1000.0
set AI_LB_Ability_Area[3][2] = 1000.0
set AI_LB_Ability_Area[3][3] = 1000.0
set AI_LB_Ability_Mode[3][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_LB_Ability_Mode[3][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_LB_Ability_Mode[3][2] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_LB_Ability_Mode[3][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_LB_Ability_Perceive[3][0] = 15
set AI_LB_Ability_Perceive[3][1] = 15
set AI_LB_Ability_Perceive[3][2] = 15
set AI_LB_Ability_Perceive[3][3] = 15
endif
//Divine Intervention
if(true) then
set AI_LB_Ability_Cooldown[4][0] = 90
set AI_LB_Ability_Cooldown[4][1] = 50
set AI_LB_Ability_Cooldown[4][2] = 0
set AI_LB_Ability_Cooldown[4][3] = 0
set AI_LB_Ability_Mana[4][0] = 200
set AI_LB_Ability_Mana[4][1] = 300
set AI_LB_Ability_Mana[4][2] = 0
set AI_LB_Ability_Mana[4][3] = 0
set AI_LB_Ability_Range[4][0] = 0.0
set AI_LB_Ability_Range[4][1] = 0.0
set AI_LB_Ability_Range[4][2] = 0.0
set AI_LB_Ability_Range[4][3] = 0.0
set AI_LB_Ability_Detect_Area[4][0] = 400.0
set AI_LB_Ability_Detect_Area[4][1] = 400.0
set AI_LB_Ability_Detect_Area[4][2] = 0.0
set AI_LB_Ability_Detect_Area[4][3] = 0.0
set AI_LB_Ability_Area[4][0] = 600.0
set AI_LB_Ability_Area[4][1] = 600.0
set AI_LB_Ability_Area[4][2] = 0.0
set AI_LB_Ability_Area[4][3] = 0.0
set AI_LB_Ability_Mode[4][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_LB_Ability_Mode[4][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_LB_Ability_Mode[4][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_LB_Ability_Mode[4][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_LB_Ability_Perceive[4][0] = 5
set AI_LB_Ability_Perceive[4][1] = 5
set AI_LB_Ability_Perceive[4][2] = 0
set AI_LB_Ability_Perceive[4][3] = 0
endif
endif
endfunction
endscope
//TESH.scrollpos=125
//TESH.alwaysfold=0
scope AIKnowledgeAW initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Arcane Wizard
if(true) then
set AI_Life_Zone[1][0] = 50
set AI_Life_Zone[1][1] = 70
set AI_Life_Zone[1][2] = 100
set AI_Mana_Zone[1][0] = 20
set AI_Mana_Zone[1][1] = 50
set AI_Mana_Zone[1][2] = 100
set AI_Attack_Range_Zone[1][0] = 200
set AI_Attack_Range_Zone[1][1] = 500
//Offense attitude
set AI_AW_Item_Total_Plan[0] = 17
if(true) then
//Orb of Descent
set AI_AW_Item_Plan[0][0] = 'prvt'
set AI_AW_Item_Plan[0][1] = 'prvt'
set AI_AW_Item_Plan[0][2] = 'shea'
set AI_AW_Item_Point[0][0] = 3
set AI_AW_Item_Point[0][1] = 3
set AI_AW_Item_Point[0][2] = 3
//Bloodeye Lynch
set AI_AW_Item_Plan[0][3] = 'stel'
set AI_AW_Item_Plan[0][4] = 'stel'
set AI_AW_Item_Plan[0][5] = 'stel'
set AI_AW_Item_Plan[0][6] = 'stel'
set AI_AW_Item_Plan[0][7] = 'rej6'
set AI_AW_Item_Point[0][3] = 2
set AI_AW_Item_Point[0][4] = 2
set AI_AW_Item_Point[0][5] = 2
set AI_AW_Item_Point[0][6] = 2
set AI_AW_Item_Point[0][7] = 4
//Jungle Runner
set AI_AW_Item_Plan[0][8] = 'I00K'
set AI_AW_Item_Plan[0][9] = 'I00K'
set AI_AW_Item_Plan[0][10] = 'bspd'
set AI_AW_Item_Point[0][8] = 5
set AI_AW_Item_Point[0][9] = 5
set AI_AW_Item_Point[0][10] = 5
//Havocrave Dissever
set AI_AW_Item_Plan[0][11] = 'rej6'
set AI_AW_Item_Point[0][11] = 10
//Mindseer of Ultimate
set AI_AW_Item_Plan[0][12] = 'I00M'
set AI_AW_Item_Plan[0][13] = 'I00I'
set AI_AW_Item_Point[0][12] = 10
set AI_AW_Item_Point[0][13] = 5
//Sunstalker
set AI_AW_Item_Plan[0][14] = 'I01N'
set AI_AW_Item_Plan[0][15] = 'I01Z'
set AI_AW_Item_Point[0][14] = 20
set AI_AW_Item_Point[0][15] = 15
//Prime Lucent
set AI_AW_Item_Plan[0][16] = 'I009'
set AI_AW_Item_Point[0][16] = 20
endif
//Defense attitude
set AI_AW_Item_Total_Plan[1] = 14
if(true) then
//Orb of Descent
set AI_AW_Item_Plan[1][0] = 'prvt'
set AI_AW_Item_Plan[1][1] = 'prvt'
set AI_AW_Item_Plan[1][2] = 'shea'
set AI_AW_Item_Point[1][0] = 2
set AI_AW_Item_Point[1][1] = 2
set AI_AW_Item_Point[1][2] = 2
//Power Fragment
set AI_AW_Item_Plan[1][3] = 'penr'
set AI_AW_Item_Plan[1][4] = 'penr'
set AI_AW_Item_Plan[1][5] = 'sman'
set AI_AW_Item_Point[1][3] = 1
set AI_AW_Item_Point[1][4] = 1
set AI_AW_Item_Point[1][5] = 5
//Orenda Spectrum
set AI_AW_Item_Plan[1][6] = 'I005'
set AI_AW_Item_Plan[1][7] = 'rde2'
set AI_AW_Item_Plan[1][8] = 'scul'
set AI_AW_Item_Point[1][6] = 5
set AI_AW_Item_Point[1][7] = 2
set AI_AW_Item_Point[1][8] = 5
//Encease Siege
set AI_AW_Item_Plan[1][9] = 'rde2'
set AI_AW_Item_Plan[1][10] = 'rde3'
set AI_AW_Item_Point[1][9] = 10
set AI_AW_Item_Point[1][10] = 10
//Mindseer of Ultimate
set AI_AW_Item_Plan[1][11] = 'I00M'
set AI_AW_Item_Plan[1][12] = 'I00I'
set AI_AW_Item_Point[1][11] = 12
set AI_AW_Item_Point[1][12] = 12
//Prime Lucent
set AI_AW_Item_Plan[1][13] = 'I009'
set AI_AW_Item_Point[1][13] = 30
endif
//General ability
if(true) then
set AI_Ability_Type[1][0] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[1][1] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[1][2] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[1][3] = ABILITY_TYPE_MOBILE
set AI_Ability_Type[1][4] = ABILITY_TYPE_ULTIMATE
set AI_Ability_Order_Type[1][0] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[1][1] = ACTION_ORDER_TYPE_UNKNOWN
set AI_Ability_Order_Type[1][2] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Order_Type[1][3] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[1][4] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Level[1][0] = 4
set AI_Ability_Level[1][1] = 3
set AI_Ability_Level[1][2] = 3
set AI_Ability_Level[1][3] = 3
set AI_Ability_Level[1][4] = 2
set AI_Ability_Type_Score[1][0] = 9
set AI_Ability_Type_Score[1][1] = 3
set AI_Ability_Type_Score[1][2] = 4
set AI_Ability_Type_Score[1][3] = 9
set AI_Ability_Type_Score[1][4] = 7
set AI_Ability_ID[1][0] = 'A04B'
set AI_Ability_ID[1][1] = 'A06E'
set AI_Ability_ID[1][2] = 'A04C'
set AI_Ability_ID[1][3] = 'A04E'
set AI_Ability_ID[1][4] = 'A04G'
set AI_Ability_Learn_Skip[1][0] = 2
set AI_Ability_Learn_Skip[1][1] = 2
set AI_Ability_Learn_Skip[1][2] = 2
set AI_Ability_Learn_Skip[1][3] = 2
set AI_Ability_Learn_Skip[1][4] = 7
set AI_Ability_Level_Required[1][0] = 0
set AI_Ability_Level_Required[1][1] = 0
set AI_Ability_Level_Required[1][2] = 0
set AI_Ability_Level_Required[1][3] = 0
set AI_Ability_Level_Required[1][4] = 6
set AI_Ability_Order[1][0] = "web"
set AI_Ability_Order[1][1] = ""
set AI_Ability_Order[1][2] = "wispharvest"
set AI_Ability_Order[1][3] = "metamorphosis"
set AI_Ability_Order[1][4] = "whirlwind"
set AI_Ability_Order_Next[1][0] = ""
set AI_Ability_Order_Next[1][1] = ""
set AI_Ability_Order_Next[1][2] = ""
set AI_Ability_Order_Next[1][3] = ""
set AI_Ability_Order_Next[1][4] = ""
set AI_Ability_Buff[1][0] = 0
set AI_Ability_Buff[1][1] = 0
set AI_Ability_Buff[1][2] = 0
set AI_Ability_Buff[1][3] = 0
set AI_Ability_Buff[1][4] = 0
endif
//Arcane Fall
if(true) then
set AI_AW_Ability_Cooldown[0][0] = 12
set AI_AW_Ability_Cooldown[0][1] = 11
set AI_AW_Ability_Cooldown[0][2] = 9
set AI_AW_Ability_Cooldown[0][3] = 6
set AI_AW_Ability_Mana[0][0] = 200
set AI_AW_Ability_Mana[0][1] = 240
set AI_AW_Ability_Mana[0][2] = 280
set AI_AW_Ability_Mana[0][3] = 320
set AI_AW_Ability_Range[0][0] = 900.0
set AI_AW_Ability_Range[0][1] = 900.0
set AI_AW_Ability_Range[0][2] = 900.0
set AI_AW_Ability_Range[0][3] = 900.0
set AI_AW_Ability_Detect_Area[0][0] = 1100.0
set AI_AW_Ability_Detect_Area[0][1] = 1100.0
set AI_AW_Ability_Detect_Area[0][2] = 1100.0
set AI_AW_Ability_Detect_Area[0][3] = 1100.0
set AI_AW_Ability_Area[0][0] = 300.0
set AI_AW_Ability_Area[0][1] = 300.0
set AI_AW_Ability_Area[0][2] = 300.0
set AI_AW_Ability_Area[0][3] = 300.0
set AI_AW_Ability_Mode[0][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_AW_Ability_Mode[0][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_AW_Ability_Mode[0][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_AW_Ability_Mode[0][3] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_AW_Ability_Perceive[0][0] = 25
set AI_AW_Ability_Perceive[0][1] = 25
set AI_AW_Ability_Perceive[0][2] = 25
set AI_AW_Ability_Perceive[0][3] = 25
endif
//Energy Reflux
if(true) then
set AI_AW_Ability_Cooldown[1][0] = 0
set AI_AW_Ability_Cooldown[1][1] = 0
set AI_AW_Ability_Cooldown[1][2] = 0
set AI_AW_Ability_Cooldown[1][3] = 0
set AI_AW_Ability_Mana[1][0] = 0
set AI_AW_Ability_Mana[1][1] = 0
set AI_AW_Ability_Mana[1][2] = 0
set AI_AW_Ability_Mana[1][3] = 0
set AI_AW_Ability_Range[1][0] = 0.0
set AI_AW_Ability_Range[1][1] = 0.0
set AI_AW_Ability_Range[1][2] = 0.0
set AI_AW_Ability_Range[1][3] = 0.0
set AI_AW_Ability_Detect_Area[1][0] = 0.0
set AI_AW_Ability_Detect_Area[1][1] = 0.0
set AI_AW_Ability_Detect_Area[1][2] = 0.0
set AI_AW_Ability_Detect_Area[1][3] = 0.0
set AI_AW_Ability_Area[1][0] = 0.0
set AI_AW_Ability_Area[1][1] = 0.0
set AI_AW_Ability_Area[1][2] = 0.0
set AI_AW_Ability_Area[1][3] = 0.0
set AI_AW_Ability_Mode[1][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AW_Ability_Mode[1][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AW_Ability_Mode[1][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AW_Ability_Mode[1][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AW_Ability_Perceive[1][0] = 0
set AI_AW_Ability_Perceive[1][1] = 0
set AI_AW_Ability_Perceive[1][2] = 0
set AI_AW_Ability_Perceive[1][3] = 0
endif
//Impotent
if(true) then
set AI_AW_Ability_Cooldown[2][0] = 18
set AI_AW_Ability_Cooldown[2][1] = 16
set AI_AW_Ability_Cooldown[2][2] = 12
set AI_AW_Ability_Cooldown[2][3] = 0
set AI_AW_Ability_Mana[2][0] = 100
set AI_AW_Ability_Mana[2][1] = 100
set AI_AW_Ability_Mana[2][2] = 100
set AI_AW_Ability_Mana[2][3] = 0
set AI_AW_Ability_Range[2][0] = 700.0
set AI_AW_Ability_Range[2][1] = 700.0
set AI_AW_Ability_Range[2][2] = 700.0
set AI_AW_Ability_Range[2][3] = 0.0
set AI_AW_Ability_Detect_Area[2][0] = 700.0
set AI_AW_Ability_Detect_Area[2][1] = 700.0
set AI_AW_Ability_Detect_Area[2][2] = 700.0
set AI_AW_Ability_Detect_Area[2][3] = 0.0
set AI_AW_Ability_Area[2][0] = 0.0
set AI_AW_Ability_Area[2][1] = 0.0
set AI_AW_Ability_Area[2][2] = 0.0
set AI_AW_Ability_Area[2][3] = 0.0
set AI_AW_Ability_Mode[2][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_AW_Ability_Mode[2][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_AW_Ability_Mode[2][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_AW_Ability_Mode[2][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AW_Ability_Perceive[2][0] = 5
set AI_AW_Ability_Perceive[2][1] = 5
set AI_AW_Ability_Perceive[2][2] = 5
set AI_AW_Ability_Perceive[2][3] = 0
endif
//Esoteric Form
if(true) then
set AI_AW_Ability_Cooldown[3][0] = 25
set AI_AW_Ability_Cooldown[3][1] = 22
set AI_AW_Ability_Cooldown[3][2] = 16
set AI_AW_Ability_Cooldown[3][3] = 0
set AI_AW_Ability_Mana[3][0] = 150
set AI_AW_Ability_Mana[3][1] = 200
set AI_AW_Ability_Mana[3][2] = 250
set AI_AW_Ability_Mana[3][3] = 0
set AI_AW_Ability_Range[3][0] = 0.0
set AI_AW_Ability_Range[3][1] = 0.0
set AI_AW_Ability_Range[3][2] = 0.0
set AI_AW_Ability_Range[3][3] = 0.0
set AI_AW_Ability_Detect_Area[3][0] = 2000.0
set AI_AW_Ability_Detect_Area[3][1] = 2000.0
set AI_AW_Ability_Detect_Area[3][2] = 2000.0
set AI_AW_Ability_Detect_Area[3][3] = 2000.0
set AI_AW_Ability_Area[3][0] = 0.0
set AI_AW_Ability_Area[3][1] = 0.0
set AI_AW_Ability_Area[3][2] = 0.0
set AI_AW_Ability_Area[3][3] = 0.0
set AI_AW_Ability_Mode[3][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_AW_Ability_Mode[3][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_AW_Ability_Mode[3][2] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_AW_Ability_Mode[3][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AW_Ability_Perceive[3][0] = 5
set AI_AW_Ability_Perceive[3][1] = 5
set AI_AW_Ability_Perceive[3][2] = 5
set AI_AW_Ability_Perceive[3][3] = 0
endif
//Force Nova
if(true) then
set AI_AW_Ability_Cooldown[4][0] = 30
set AI_AW_Ability_Cooldown[4][1] = 20
set AI_AW_Ability_Cooldown[4][2] = 0
set AI_AW_Ability_Cooldown[4][3] = 0
set AI_AW_Ability_Mana[4][0] = 300
set AI_AW_Ability_Mana[4][1] = 400
set AI_AW_Ability_Mana[4][2] = 0
set AI_AW_Ability_Mana[4][3] = 0
set AI_AW_Ability_Range[4][0] = 800.0
set AI_AW_Ability_Range[4][1] = 600.0
set AI_AW_Ability_Range[4][2] = 0.0
set AI_AW_Ability_Range[4][3] = 0.0
set AI_AW_Ability_Detect_Area[4][0] = 1200.0
set AI_AW_Ability_Detect_Area[4][1] = 1200.0
set AI_AW_Ability_Detect_Area[4][2] = 0.0
set AI_AW_Ability_Detect_Area[4][3] = 0.0
set AI_AW_Ability_Area[4][0] = 1200.0
set AI_AW_Ability_Area[4][1] = 1200.0
set AI_AW_Ability_Area[4][2] = 0.0
set AI_AW_Ability_Area[4][3] = 0.0
set AI_AW_Ability_Mode[4][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_AW_Ability_Mode[4][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_AW_Ability_Mode[4][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AW_Ability_Mode[4][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AW_Ability_Perceive[4][0] = 12
set AI_AW_Ability_Perceive[4][1] = 12
set AI_AW_Ability_Perceive[4][2] = 0
set AI_AW_Ability_Perceive[4][3] = 0
endif
endif
endfunction
endscope
//TESH.scrollpos=376
//TESH.alwaysfold=0
scope AIKnowledgeKT initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//King of Tempest
if(true) then
set AI_Life_Zone[2][0] = 50
set AI_Life_Zone[2][1] = 70
set AI_Life_Zone[2][2] = 100
set AI_Mana_Zone[2][0] = 20
set AI_Mana_Zone[2][1] = 50
set AI_Mana_Zone[2][2] = 100
set AI_Attack_Range_Zone[2][0] = 200
set AI_Attack_Range_Zone[2][1] = 200
//Offense attitude
set AI_KT_Item_Total_Plan[0] = 24
if(true) then
//Throne of Emperor
set AI_KT_Item_Plan[0][0] = 'bgst'
set AI_KT_Item_Plan[0][1] = 'bgst'
set AI_KT_Item_Plan[0][2] = 'bgst'
set AI_KT_Item_Plan[0][3] = 'bgst'
set AI_KT_Item_Plan[0][4] = 'rlif'
set AI_KT_Item_Plan[0][5] = 'rlif'
set AI_KT_Item_Plan[0][6] = 'rag1'
set AI_KT_Item_Plan[0][7] = 'shas'
set AI_KT_Item_Plan[0][8] = 'rag1'
set AI_KT_Item_Plan[0][9] = 'shas'
set AI_KT_Item_Point[0][0] = 2
set AI_KT_Item_Point[0][1] = 2
set AI_KT_Item_Point[0][2] = 2
set AI_KT_Item_Point[0][3] = 2
set AI_KT_Item_Point[0][4] = 2
set AI_KT_Item_Point[0][5] = 2
set AI_KT_Item_Point[0][6] = 2
set AI_KT_Item_Point[0][7] = 2
set AI_KT_Item_Point[0][8] = 2
set AI_KT_Item_Point[0][9] = 2
//Sneaker of Exzel
set AI_KT_Item_Plan[0][10] = 'rag1'
set AI_KT_Item_Plan[0][11] = 'shas'
set AI_KT_Item_Plan[0][12] = 'rag1'
set AI_KT_Item_Plan[0][13] = 'shas'
set AI_KT_Item_Plan[0][14] = 'gcel'
set AI_KT_Item_Plan[0][15] = 'sres'
set AI_KT_Item_Point[0][10] = 2
set AI_KT_Item_Point[0][11] = 2
set AI_KT_Item_Point[0][12] = 2
set AI_KT_Item_Point[0][13] = 2
set AI_KT_Item_Point[0][14] = 3
set AI_KT_Item_Point[0][15] = 3
//Power Fragment
set AI_KT_Item_Plan[0][16] = 'penr'
set AI_KT_Item_Plan[0][17] = 'penr'
set AI_KT_Item_Plan[0][18] = 'sman'
set AI_KT_Item_Point[0][16] = 1
set AI_KT_Item_Point[0][17] = 1
set AI_KT_Item_Point[0][18] = 5
//Havocrave Dissever
set AI_KT_Item_Plan[0][19] = 'I00T'
set AI_KT_Item_Plan[0][20] = 'I00T'
set AI_KT_Item_Point[0][19] = 10
set AI_KT_Item_Point[0][20] = 10
//Stormanifer
set AI_KT_Item_Plan[0][21] = 'I01J'
set AI_KT_Item_Plan[0][22] = 'I01J'
set AI_KT_Item_Point[0][21] = 12
set AI_KT_Item_Point[0][22] = 12
//Brutalic
set AI_KT_Item_Plan[0][23] = 'anfg'
set AI_KT_Item_Point[0][23] = 25
endif
//Defense attitude
set AI_KT_Item_Total_Plan[1] = 21
if(true) then
//Throne of Emperor
set AI_KT_Item_Plan[0][0] = 'bgst'
set AI_KT_Item_Plan[0][1] = 'bgst'
set AI_KT_Item_Plan[0][2] = 'bgst'
set AI_KT_Item_Plan[0][3] = 'bgst'
set AI_KT_Item_Plan[0][4] = 'rlif'
set AI_KT_Item_Plan[0][5] = 'rlif'
set AI_KT_Item_Plan[0][6] = 'rag1'
set AI_KT_Item_Plan[0][7] = 'shas'
set AI_KT_Item_Plan[0][8] = 'rag1'
set AI_KT_Item_Plan[0][9] = 'shas'
set AI_KT_Item_Point[0][0] = 2
set AI_KT_Item_Point[0][1] = 2
set AI_KT_Item_Point[0][2] = 2
set AI_KT_Item_Point[0][3] = 2
set AI_KT_Item_Point[0][4] = 2
set AI_KT_Item_Point[0][5] = 2
set AI_KT_Item_Point[0][6] = 2
set AI_KT_Item_Point[0][7] = 2
set AI_KT_Item_Point[0][8] = 2
set AI_KT_Item_Point[0][9] = 2
//Power Fragment
set AI_KT_Item_Plan[1][10] = 'penr'
set AI_KT_Item_Plan[1][11] = 'penr'
set AI_KT_Item_Plan[1][12] = 'sman'
set AI_KT_Item_Point[1][10] = 1
set AI_KT_Item_Point[1][11] = 1
set AI_KT_Item_Point[1][12] = 5
//Brutalic
set AI_KT_Item_Plan[1][13] = 'I00G'
set AI_KT_Item_Plan[1][14] = 'modt'
set AI_KT_Item_Plan[1][15] = 'I01B'
set AI_KT_Item_Point[1][13] = 5
set AI_KT_Item_Point[1][14] = 5
set AI_KT_Item_Point[1][15] = 5
//Wrist of Hercules
set AI_KT_Item_Plan[1][16] = 'brac'
set AI_KT_Item_Plan[1][17] = 'brac'
set AI_KT_Item_Point[1][16] = 10
set AI_KT_Item_Point[1][17] = 10
//Throne of Emperor
set AI_KT_Item_Plan[1][18] = 'I01F'
set AI_KT_Item_Plan[1][19] = 'bspd'
set AI_KT_Item_Point[1][18] = 20
set AI_KT_Item_Point[1][19] = 20
//Skull Crusher
set AI_KT_Item_Plan[1][20] = 'I00U'
set AI_KT_Item_Point[1][20] = 28
endif
//General ability
if(true) then
set AI_Ability_Type[2][0] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[2][1] = ABILITY_TYPE_MOBILE_OFFENSE
set AI_Ability_Type[2][2] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[2][3] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[2][4] = ABILITY_TYPE_ULTIMATE_TRANSFORM
set AI_Ability_Order_Type[2][0] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[2][1] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[2][2] = ACTION_ORDER_TYPE_UNKNOWN
set AI_Ability_Order_Type[2][3] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[2][4] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Level[2][0] = 4
set AI_Ability_Level[2][1] = 3
set AI_Ability_Level[2][2] = 3
set AI_Ability_Level[2][3] = 3
set AI_Ability_Level[2][4] = 2
set AI_Ability_Type_Score[2][0] = 9
set AI_Ability_Type_Score[2][1] = 3
set AI_Ability_Type_Score[2][2] = 4
set AI_Ability_Type_Score[2][3] = 9
set AI_Ability_Type_Score[2][4] = 7
set AI_Ability_ID[2][0] = 'A04J'
set AI_Ability_ID[2][1] = 'A04L'
set AI_Ability_ID[2][2] = 'A04M'
set AI_Ability_ID[2][3] = 'A04Q'
set AI_Ability_ID[2][4] = 'A04P'
set AI_Ability_Learn_Skip[2][0] = 2
set AI_Ability_Learn_Skip[2][1] = 2
set AI_Ability_Learn_Skip[2][2] = 2
set AI_Ability_Learn_Skip[2][3] = 2
set AI_Ability_Learn_Skip[2][4] = 7
set AI_Ability_Level_Required[2][0] = 0
set AI_Ability_Level_Required[2][1] = 0
set AI_Ability_Level_Required[2][2] = 0
set AI_Ability_Level_Required[2][3] = 0
set AI_Ability_Level_Required[2][4] = 6
set AI_Ability_Order[2][0] = "web"
set AI_Ability_Order[2][1] = "windwalk"
set AI_Ability_Order[2][2] = ""
set AI_Ability_Order[2][3] = "weboff"
set AI_Ability_Order[2][4] = "robogoblin"
set AI_Ability_Order_Next[2][0] = ""
set AI_Ability_Order_Next[2][1] = ""
set AI_Ability_Order_Next[2][2] = ""
set AI_Ability_Order_Next[2][3] = ""
set AI_Ability_Order_Next[2][4] = "unrobogoblin"
set AI_Ability_Buff[2][0] = 0
set AI_Ability_Buff[2][1] = 0
set AI_Ability_Buff[2][2] = 0
set AI_Ability_Buff[2][3] = 0
set AI_Ability_Buff[2][4] = 0
endif
//Storm Hammer
if(true) then
set AI_KT_Ability_Cooldown[0][0] = 28
set AI_KT_Ability_Cooldown[0][1] = 25
set AI_KT_Ability_Cooldown[0][2] = 20
set AI_KT_Ability_Cooldown[0][3] = 13
set AI_KT_Ability_Mana[0][0] = 85
set AI_KT_Ability_Mana[0][1] = 85
set AI_KT_Ability_Mana[0][2] = 85
set AI_KT_Ability_Mana[0][3] = 85
set AI_KT_Ability_Range[0][0] = 900.0
set AI_KT_Ability_Range[0][1] = 900.0
set AI_KT_Ability_Range[0][2] = 900.0
set AI_KT_Ability_Range[0][3] = 900.0
set AI_KT_Ability_Detect_Area[0][0] = 1800.0
set AI_KT_Ability_Detect_Area[0][1] = 1800.0
set AI_KT_Ability_Detect_Area[0][2] = 1800.0
set AI_KT_Ability_Detect_Area[0][3] = 1800.0
set AI_KT_Ability_Area[0][0] = 150.0
set AI_KT_Ability_Area[0][1] = 150.0
set AI_KT_Ability_Area[0][2] = 150.0
set AI_KT_Ability_Area[0][3] = 150.0
set AI_KT_Ability_Mode[0][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_KT_Ability_Mode[0][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_KT_Ability_Mode[0][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_KT_Ability_Mode[0][3] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_KT_Ability_Perceive[0][0] = 5
set AI_KT_Ability_Perceive[0][1] = 5
set AI_KT_Ability_Perceive[0][2] = 5
set AI_KT_Ability_Perceive[0][3] = 5
endif
//Thunder Smack
if(true) then
set AI_KT_Ability_Cooldown[1][0] = 26
set AI_KT_Ability_Cooldown[1][1] = 22
set AI_KT_Ability_Cooldown[1][2] = 16
set AI_KT_Ability_Cooldown[1][3] = 0
set AI_KT_Ability_Mana[1][0] = 120
set AI_KT_Ability_Mana[1][1] = 120
set AI_KT_Ability_Mana[1][2] = 120
set AI_KT_Ability_Mana[1][3] = 0
set AI_KT_Ability_Range[1][0] = 900.0
set AI_KT_Ability_Range[1][1] = 900.0
set AI_KT_Ability_Range[1][2] = 900.0
set AI_KT_Ability_Range[1][3] = 0.0
set AI_KT_Ability_Detect_Area[1][0] = 1000.0
set AI_KT_Ability_Detect_Area[1][1] = 1000.0
set AI_KT_Ability_Detect_Area[1][2] = 1000.0
set AI_KT_Ability_Detect_Area[1][3] = 0.0
set AI_KT_Ability_Area[1][0] = 400.0
set AI_KT_Ability_Area[1][1] = 400.0
set AI_KT_Ability_Area[1][2] = 400.0
set AI_KT_Ability_Area[1][3] = 0.0
set AI_KT_Ability_Mode[1][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_KT_Ability_Mode[1][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_KT_Ability_Mode[1][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_KT_Ability_Mode[1][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_KT_Ability_Perceive[1][0] = 5
set AI_KT_Ability_Perceive[1][1] = 5
set AI_KT_Ability_Perceive[1][2] = 5
set AI_KT_Ability_Perceive[1][3] = 0
endif
//Bash
if(true) then
set AI_KT_Ability_Cooldown[2][0] = 0
set AI_KT_Ability_Cooldown[2][1] = 0
set AI_KT_Ability_Cooldown[2][2] = 0
set AI_KT_Ability_Cooldown[2][3] = 0
set AI_KT_Ability_Mana[2][0] = 0
set AI_KT_Ability_Mana[2][1] = 0
set AI_KT_Ability_Mana[2][2] = 0
set AI_KT_Ability_Mana[2][3] = 0
set AI_KT_Ability_Range[2][0] = 0.0
set AI_KT_Ability_Range[2][1] = 0.0
set AI_KT_Ability_Range[2][2] = 0.0
set AI_KT_Ability_Range[2][3] = 0.0
set AI_KT_Ability_Detect_Area[2][0] = 0.0
set AI_KT_Ability_Detect_Area[2][1] = 0.0
set AI_KT_Ability_Detect_Area[2][2] = 0.0
set AI_KT_Ability_Detect_Area[2][3] = 0.0
set AI_KT_Ability_Area[2][0] = 0.0
set AI_KT_Ability_Area[2][1] = 0.0
set AI_KT_Ability_Area[2][2] = 0.0
set AI_KT_Ability_Area[2][3] = 0.0
set AI_KT_Ability_Mode[2][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_KT_Ability_Mode[2][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_KT_Ability_Mode[2][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_KT_Ability_Mode[2][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_KT_Ability_Perceive[2][0] = 0
set AI_KT_Ability_Perceive[2][1] = 0
set AI_KT_Ability_Perceive[2][2] = 0
set AI_KT_Ability_Perceive[2][3] = 0
endif
//Lightning Charge
if(true) then
set AI_KT_Ability_Cooldown[3][0] = 20
set AI_KT_Ability_Cooldown[3][1] = 15
set AI_KT_Ability_Cooldown[3][2] = 10
set AI_KT_Ability_Cooldown[3][3] = 0
set AI_KT_Ability_Mana[3][0] = 70
set AI_KT_Ability_Mana[3][1] = 50
set AI_KT_Ability_Mana[3][2] = 30
set AI_KT_Ability_Mana[3][3] = 0
set AI_KT_Ability_Range[3][0] = 200.0
set AI_KT_Ability_Range[3][1] = 200.0
set AI_KT_Ability_Range[3][2] = 200.0
set AI_KT_Ability_Range[3][3] = 200.0
set AI_KT_Ability_Detect_Area[3][0] = 200.0
set AI_KT_Ability_Detect_Area[3][1] = 200.0
set AI_KT_Ability_Detect_Area[3][2] = 200.0
set AI_KT_Ability_Detect_Area[3][3] = 200.0
set AI_KT_Ability_Area[3][0] = 200.0
set AI_KT_Ability_Area[3][1] = 200.0
set AI_KT_Ability_Area[3][2] = 200.0
set AI_KT_Ability_Area[3][3] = 200.0
set AI_KT_Ability_Mode[3][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_KT_Ability_Mode[3][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_KT_Ability_Mode[3][2] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_KT_Ability_Mode[3][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_KT_Ability_Perceive[3][0] = 5
set AI_KT_Ability_Perceive[3][1] = 5
set AI_KT_Ability_Perceive[3][2] = 5
set AI_KT_Ability_Perceive[3][3] = 0
endif
//Avatar of Wrath
if(true) then
set AI_KT_Ability_Cooldown[4][0] = 5
set AI_KT_Ability_Cooldown[4][1] = 5
set AI_KT_Ability_Cooldown[4][2] = 0
set AI_KT_Ability_Cooldown[4][3] = 0
set AI_KT_Ability_Mana[4][0] = 25
set AI_KT_Ability_Mana[4][1] = 25
set AI_KT_Ability_Mana[4][2] = 0
set AI_KT_Ability_Mana[4][3] = 0
set AI_KT_Ability_Range[4][0] = 0.0
set AI_KT_Ability_Range[4][1] = 0.0
set AI_KT_Ability_Range[4][2] = 0.0
set AI_KT_Ability_Range[4][3] = 0.0
set AI_KT_Ability_Detect_Area[4][0] = 2000.0
set AI_KT_Ability_Detect_Area[4][1] = 2000.0
set AI_KT_Ability_Detect_Area[4][2] = 2000.0
set AI_KT_Ability_Detect_Area[4][3] = 2000.0
set AI_KT_Ability_Area[4][0] = 0.0
set AI_KT_Ability_Area[4][1] = 0.0
set AI_KT_Ability_Area[4][2] = 0.0
set AI_KT_Ability_Area[4][3] = 0.0
set AI_KT_Ability_Mode[4][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_KT_Ability_Mode[4][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_KT_Ability_Mode[4][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_KT_Ability_Mode[4][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_KT_Ability_Perceive[4][0] = 5
set AI_KT_Ability_Perceive[4][1] = 5
set AI_KT_Ability_Perceive[4][2] = 0
set AI_KT_Ability_Perceive[4][3] = 0
endif
endif
endfunction
endscope
//TESH.scrollpos=306
//TESH.alwaysfold=0
scope AIKnowledgePM initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Pyromancer
if(true) then
set AI_Life_Zone[3][0] = 50
set AI_Life_Zone[3][1] = 70
set AI_Life_Zone[3][2] = 100
set AI_Mana_Zone[3][0] = 20
set AI_Mana_Zone[3][1] = 50
set AI_Mana_Zone[3][2] = 100
set AI_Attack_Range_Zone[3][0] = 200
set AI_Attack_Range_Zone[3][1] = 400
//Offense attitude
set AI_PM_Item_Total_Plan[0] = 16
if(true) then
//Orb of Descent
set AI_PM_Item_Plan[0][0] = 'prvt'
set AI_PM_Item_Plan[0][1] = 'prvt'
set AI_PM_Item_Plan[0][2] = 'shea'
set AI_PM_Item_Point[0][0] = 3
set AI_PM_Item_Point[0][1] = 3
set AI_PM_Item_Point[0][2] = 3
//Havocrave Dissever
set AI_PM_Item_Plan[0][3] = 'stel'
set AI_PM_Item_Plan[0][4] = 'stel'
set AI_PM_Item_Plan[0][5] = 'stel'
set AI_PM_Item_Plan[0][6] = 'stel'
set AI_PM_Item_Plan[0][7] = 'rej6'
set AI_PM_Item_Plan[0][8] = 'rej6'
set AI_PM_Item_Point[0][3] = 2
set AI_PM_Item_Point[0][4] = 2
set AI_PM_Item_Point[0][5] = 2
set AI_PM_Item_Point[0][6] = 2
set AI_PM_Item_Point[0][7] = 4
set AI_PM_Item_Point[0][8] = 10
//Brutalic
set AI_PM_Item_Plan[0][9] = 'I00G'
set AI_PM_Item_Plan[0][10] = 'modt'
set AI_PM_Item_Plan[0][11] = 'I01B'
set AI_PM_Item_Point[0][9] = 5
set AI_PM_Item_Point[0][10] = 5
set AI_PM_Item_Point[0][11] = 5
//Sneaker of Exzel
set AI_PM_Item_Plan[0][12] = 'bspd'
set AI_PM_Item_Plan[0][13] = 'rst1'
set AI_PM_Item_Point[0][12] = 10
set AI_PM_Item_Point[0][13] = 5
//Power Fragment
set AI_PM_Item_Plan[0][14] = 'I01V'
set AI_PM_Item_Point[0][14] = 20
//Chronos the Forbidden
set AI_PM_Item_Plan[0][15] = 'gvsm'
set AI_PM_Item_Point[0][15] = 20
endif
//Defense attitude
set AI_PM_Item_Total_Plan[1] = 16
if(true) then
//Orb of Descent
set AI_PM_Item_Plan[1][0] = 'prvt'
set AI_PM_Item_Plan[1][1] = 'prvt'
set AI_PM_Item_Plan[1][2] = 'shea'
set AI_PM_Item_Point[1][0] = 2
set AI_PM_Item_Point[1][1] = 2
set AI_PM_Item_Point[1][2] = 2
//Power Fragment
set AI_PM_Item_Plan[1][3] = 'penr'
set AI_PM_Item_Plan[1][4] = 'penr'
set AI_PM_Item_Plan[1][5] = 'sman'
set AI_PM_Item_Point[1][3] = 1
set AI_PM_Item_Point[1][4] = 1
set AI_PM_Item_Point[1][5] = 5
//Sneaker of Exzel
set AI_PM_Item_Plan[1][6] = 'I00K'
set AI_PM_Item_Plan[1][7] = 'I00K'
set AI_PM_Item_Plan[1][8] = 'gcel'
set AI_PM_Item_Plan[1][9] = 'sres'
set AI_PM_Item_Point[1][6] = 5
set AI_PM_Item_Point[1][7] = 5
set AI_PM_Item_Point[1][8] = 5
set AI_PM_Item_Point[1][9] = 5
//Brutalic
set AI_PM_Item_Plan[1][10] = 'modt'
set AI_PM_Item_Plan[1][11] = 'I01B'
set AI_PM_Item_Plan[1][12] = 'I00G'
set AI_PM_Item_Point[1][10] = 5
set AI_PM_Item_Point[1][11] = 5
set AI_PM_Item_Point[1][12] = 5
//Mindseer of Ultimate
set AI_PM_Item_Plan[1][13] = 'I00M'
set AI_PM_Item_Plan[1][14] = 'I00I'
set AI_PM_Item_Point[1][13] = 12
set AI_PM_Item_Point[1][14] = 12
//Heaven Rapier
set AI_PM_Item_Plan[1][15] = 'frgd'
set AI_PM_Item_Point[1][15] = 30
endif
//General ability
if(true) then
set AI_Ability_Type[3][0] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[3][1] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[3][2] = ABILITY_TYPE_MOBILE_OFFENSE
set AI_Ability_Type[3][3] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[3][4] = ABILITY_TYPE_ULTIMATE
set AI_Ability_Order_Type[3][0] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Order_Type[3][1] = ACTION_ORDER_TYPE_UNKNOWN
set AI_Ability_Order_Type[3][2] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Order_Type[3][3] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[3][4] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Level[3][0] = 4
set AI_Ability_Level[3][1] = 3
set AI_Ability_Level[3][2] = 3
set AI_Ability_Level[3][3] = 3
set AI_Ability_Level[3][4] = 2
set AI_Ability_Type_Score[3][0] = 4
set AI_Ability_Type_Score[3][1] = 5
set AI_Ability_Type_Score[3][2] = 8
set AI_Ability_Type_Score[3][3] = 7
set AI_Ability_Type_Score[3][4] = 10
set AI_Ability_ID[3][0] = 'A04Z'
set AI_Ability_ID[3][1] = 'A04W'
set AI_Ability_ID[3][2] = 'A04T'
set AI_Ability_ID[3][3] = 'A04V'
set AI_Ability_ID[3][4] = 'A04S'
set AI_Ability_Learn_Skip[3][0] = 2
set AI_Ability_Learn_Skip[3][1] = 2
set AI_Ability_Learn_Skip[3][2] = 2
set AI_Ability_Learn_Skip[3][3] = 2
set AI_Ability_Learn_Skip[3][4] = 7
set AI_Ability_Level_Required[3][0] = 0
set AI_Ability_Level_Required[3][1] = 0
set AI_Ability_Level_Required[3][2] = 0
set AI_Ability_Level_Required[3][3] = 0
set AI_Ability_Level_Required[3][4] = 6
set AI_Ability_Order[3][0] = "web"
set AI_Ability_Order[3][1] = ""
set AI_Ability_Order[3][2] = "windwalk"
set AI_Ability_Order[3][3] = "weboff"
set AI_Ability_Order[3][4] = "whirlwind"
set AI_Ability_Order_Next[3][0] = ""
set AI_Ability_Order_Next[3][1] = ""
set AI_Ability_Order_Next[3][2] = ""
set AI_Ability_Order_Next[3][3] = ""
set AI_Ability_Order_Next[3][4] = ""
set AI_Ability_Buff[3][0] = 0
set AI_Ability_Buff[3][1] = 0
set AI_Ability_Buff[3][2] = 0
set AI_Ability_Buff[3][3] = 0
set AI_Ability_Buff[3][4] = 0
endif
//Fire Blast
if(true) then
set AI_PM_Ability_Cooldown[0][0] = 17
set AI_PM_Ability_Cooldown[0][1] = 16
set AI_PM_Ability_Cooldown[0][2] = 14
set AI_PM_Ability_Cooldown[0][3] = 11
set AI_PM_Ability_Mana[0][0] = 100
set AI_PM_Ability_Mana[0][1] = 120
set AI_PM_Ability_Mana[0][2] = 140
set AI_PM_Ability_Mana[0][3] = 160
set AI_PM_Ability_Range[0][0] = 700.0
set AI_PM_Ability_Range[0][1] = 800.0
set AI_PM_Ability_Range[0][2] = 900.0
set AI_PM_Ability_Range[0][3] = 1000.0
set AI_PM_Ability_Detect_Area[0][0] = 700.0
set AI_PM_Ability_Detect_Area[0][1] = 700.0
set AI_PM_Ability_Detect_Area[0][2] = 700.0
set AI_PM_Ability_Detect_Area[0][3] = 700.0
set AI_PM_Ability_Area[0][0] = 500.0
set AI_PM_Ability_Area[0][1] = 500.0
set AI_PM_Ability_Area[0][2] = 500.0
set AI_PM_Ability_Area[0][3] = 500.0
set AI_PM_Ability_Mode[0][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_PM_Ability_Mode[0][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_PM_Ability_Mode[0][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_PM_Ability_Mode[0][3] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_PM_Ability_Perceive[0][0] = 5
set AI_PM_Ability_Perceive[0][1] = 5
set AI_PM_Ability_Perceive[0][2] = 5
set AI_PM_Ability_Perceive[0][3] = 5
endif
//Blood Siphon
if(true) then
set AI_PM_Ability_Cooldown[1][0] = 0
set AI_PM_Ability_Cooldown[1][1] = 0
set AI_PM_Ability_Cooldown[1][2] = 0
set AI_PM_Ability_Cooldown[1][3] = 0
set AI_PM_Ability_Mana[1][0] = 0
set AI_PM_Ability_Mana[1][1] = 0
set AI_PM_Ability_Mana[1][2] = 0
set AI_PM_Ability_Mana[1][3] = 0
set AI_PM_Ability_Range[1][0] = 0.0
set AI_PM_Ability_Range[1][1] = 0.0
set AI_PM_Ability_Range[1][2] = 0.0
set AI_PM_Ability_Range[1][3] = 0.0
set AI_PM_Ability_Detect_Area[1][0] = 0.0
set AI_PM_Ability_Detect_Area[1][1] = 0.0
set AI_PM_Ability_Detect_Area[1][2] = 0.0
set AI_PM_Ability_Detect_Area[1][3] = 0.0
set AI_PM_Ability_Area[1][0] = 0.0
set AI_PM_Ability_Area[1][1] = 0.0
set AI_PM_Ability_Area[1][2] = 0.0
set AI_PM_Ability_Area[1][3] = 0.0
set AI_PM_Ability_Mode[1][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_PM_Ability_Mode[1][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_PM_Ability_Mode[1][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_PM_Ability_Mode[1][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_PM_Ability_Perceive[1][0] = 0
set AI_PM_Ability_Perceive[1][1] = 0
set AI_PM_Ability_Perceive[1][2] = 0
set AI_PM_Ability_Perceive[1][3] = 0
endif
//Incinerate
if(true) then
set AI_PM_Ability_Cooldown[2][0] = 26
set AI_PM_Ability_Cooldown[2][1] = 24
set AI_PM_Ability_Cooldown[2][2] = 20
set AI_PM_Ability_Cooldown[2][3] = 0
set AI_PM_Ability_Mana[2][0] = 140
set AI_PM_Ability_Mana[2][1] = 140
set AI_PM_Ability_Mana[2][2] = 140
set AI_PM_Ability_Mana[2][3] = 0
set AI_PM_Ability_Range[2][0] = 1000.0
set AI_PM_Ability_Range[2][1] = 1000.0
set AI_PM_Ability_Range[2][2] = 1000.0
set AI_PM_Ability_Range[2][3] = 0.0
set AI_PM_Ability_Detect_Area[2][0] = 1000.0
set AI_PM_Ability_Detect_Area[2][1] = 1000.0
set AI_PM_Ability_Detect_Area[2][2] = 1000.0
set AI_PM_Ability_Detect_Area[2][3] = 0.0
set AI_PM_Ability_Area[2][0] = 200.0
set AI_PM_Ability_Area[2][1] = 200.0
set AI_PM_Ability_Area[2][2] = 200.0
set AI_PM_Ability_Area[2][3] = 200.0
set AI_PM_Ability_Mode[2][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_PM_Ability_Mode[2][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_PM_Ability_Mode[2][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_PM_Ability_Mode[2][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_PM_Ability_Perceive[2][0] = 5
set AI_PM_Ability_Perceive[2][1] = 5
set AI_PM_Ability_Perceive[2][2] = 5
set AI_PM_Ability_Perceive[2][3] = 0
endif
//Burning Orbs
if(true) then
set AI_PM_Ability_Cooldown[3][0] = 9
set AI_PM_Ability_Cooldown[3][1] = 6
set AI_PM_Ability_Cooldown[3][2] = 2
set AI_PM_Ability_Cooldown[3][3] = 0
set AI_PM_Ability_Mana[3][0] = 0
set AI_PM_Ability_Mana[3][1] = 0
set AI_PM_Ability_Mana[3][2] = 0
set AI_PM_Ability_Mana[3][3] = 0
set AI_PM_Ability_Range[3][0] = 0.0
set AI_PM_Ability_Range[3][1] = 0.0
set AI_PM_Ability_Range[3][2] = 0.0
set AI_PM_Ability_Range[3][3] = 0.0
set AI_PM_Ability_Detect_Area[3][0] = 2000.0
set AI_PM_Ability_Detect_Area[3][1] = 2000.0
set AI_PM_Ability_Detect_Area[3][2] = 2000.0
set AI_PM_Ability_Detect_Area[3][3] = 2000.0
set AI_PM_Ability_Area[3][0] = 0.0
set AI_PM_Ability_Area[3][1] = 0.0
set AI_PM_Ability_Area[3][2] = 0.0
set AI_PM_Ability_Area[3][3] = 0.0
set AI_PM_Ability_Mode[3][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_PM_Ability_Mode[3][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_PM_Ability_Mode[3][2] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_PM_Ability_Mode[3][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_PM_Ability_Perceive[3][0] = 5
set AI_PM_Ability_Perceive[3][1] = 5
set AI_PM_Ability_Perceive[3][2] = 5
set AI_PM_Ability_Perceive[3][3] = 0
endif
//Apocalypse
if(true) then
set AI_PM_Ability_Cooldown[4][0] = 100
set AI_PM_Ability_Cooldown[4][1] = 60
set AI_PM_Ability_Cooldown[4][2] = 0
set AI_PM_Ability_Cooldown[4][3] = 0
set AI_PM_Ability_Mana[4][0] = 400
set AI_PM_Ability_Mana[4][1] = 600
set AI_PM_Ability_Mana[4][2] = 0
set AI_PM_Ability_Mana[4][3] = 0
set AI_PM_Ability_Range[4][0] = 1200.0
set AI_PM_Ability_Range[4][1] = 1200.0
set AI_PM_Ability_Range[4][2] = 0.0
set AI_PM_Ability_Range[4][3] = 0.0
set AI_PM_Ability_Detect_Area[4][0] = 800.0
set AI_PM_Ability_Detect_Area[4][1] = 800.0
set AI_PM_Ability_Detect_Area[4][2] = 0.0
set AI_PM_Ability_Detect_Area[4][3] = 0.0
set AI_PM_Ability_Area[4][0] = 600.0
set AI_PM_Ability_Area[4][1] = 600.0
set AI_PM_Ability_Area[4][2] = 0.0
set AI_PM_Ability_Area[4][3] = 0.0
set AI_PM_Ability_Mode[4][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_PM_Ability_Mode[4][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_PM_Ability_Mode[4][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_PM_Ability_Mode[4][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_PM_Ability_Perceive[4][0] = 50
set AI_PM_Ability_Perceive[4][1] = 50
set AI_PM_Ability_Perceive[4][2] = 0
set AI_PM_Ability_Perceive[4][3] = 0
endif
endif
endfunction
endscope
//TESH.scrollpos=238
//TESH.alwaysfold=0
scope AIKnowledgeAS initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Archslayer
if(true) then
set AI_Life_Zone[4][0] = 50
set AI_Life_Zone[4][1] = 70
set AI_Life_Zone[4][2] = 100
set AI_Mana_Zone[4][0] = 20
set AI_Mana_Zone[4][1] = 50
set AI_Mana_Zone[4][2] = 100
set AI_Attack_Range_Zone[4][0] = 200
set AI_Attack_Range_Zone[4][1] = 200
//Offense attitude
set AI_AS_Item_Total_Plan[0] = 20
if(true) then
//Arcanite Reaver
set AI_AS_Item_Plan[0][0] = 'rat6'
set AI_AS_Item_Plan[0][1] = 'stwp'
set AI_AS_Item_Plan[0][2] = 'prvt'
set AI_AS_Item_Plan[0][3] = 'rat6'
set AI_AS_Item_Plan[0][4] = 'stwp'
set AI_AS_Item_Plan[0][5] = 'prvt'
set AI_AS_Item_Point[0][0] = 1
set AI_AS_Item_Point[0][1] = 1
set AI_AS_Item_Point[0][2] = 1
set AI_AS_Item_Point[0][3] = 3
set AI_AS_Item_Point[0][4] = 3
set AI_AS_Item_Point[0][5] = 3
//Scourge Visor
set AI_AS_Item_Plan[0][6] = 'bgst'
set AI_AS_Item_Plan[0][7] = 'srrc'
set AI_AS_Item_Point[0][6] = 3
set AI_AS_Item_Point[0][7] = 3
//Fist of Firebringer
set AI_AS_Item_Plan[0][8] = 'gcel'
set AI_AS_Item_Plan[0][9] = 'rlif'
set AI_AS_Item_Plan[0][10] = 'gcel'
set AI_AS_Item_Plan[0][11] = 'rlif'
set AI_AS_Item_Point[0][8] = 2
set AI_AS_Item_Point[0][9] = 2
set AI_AS_Item_Point[0][10] = 3
set AI_AS_Item_Point[0][11] = 3
//Power Fragment
set AI_AS_Item_Plan[0][12] = 'pmna'
set AI_AS_Item_Plan[0][13] = 'sman'
set AI_AS_Item_Point[0][12] = 20
set AI_AS_Item_Point[0][13] = 20
//Amazon Meld
set AI_AS_Item_Plan[0][14] = 'I00R'
set AI_AS_Item_Plan[0][15] = 'I00R'
set AI_AS_Item_Plan[0][16] = 'I00P'
set AI_AS_Item_Point[0][14] = 5
set AI_AS_Item_Point[0][15] = 5
set AI_AS_Item_Point[0][16] = 8
//Brutalic
set AI_AS_Item_Plan[0][17] = 'I00G'
set AI_AS_Item_Plan[0][18] = 'I01B'
set AI_AS_Item_Point[0][17] = 16
set AI_AS_Item_Point[0][18] = 5
//Sneaker of Exzel
set AI_AS_Item_Plan[0][19] = 'I01T'
set AI_AS_Item_Point[0][19] = 20
endif
//Defense attitude (need to change)
set AI_AS_Item_Total_Plan[1] = 16
if(true) then
//Orb of Descent
set AI_AS_Item_Plan[1][0] = 'prvt'
set AI_AS_Item_Plan[1][1] = 'prvt'
set AI_AS_Item_Plan[1][2] = 'shea'
set AI_AS_Item_Point[1][0] = 2
set AI_AS_Item_Point[1][1] = 2
set AI_AS_Item_Point[1][2] = 2
//Power Fragment
set AI_AS_Item_Plan[1][3] = 'penr'
set AI_AS_Item_Plan[1][4] = 'penr'
set AI_AS_Item_Plan[1][5] = 'sman'
set AI_AS_Item_Point[1][3] = 1
set AI_AS_Item_Point[1][4] = 1
set AI_AS_Item_Point[1][5] = 5
//Sneaker of Exzel
set AI_AS_Item_Plan[1][6] = 'I00K'
set AI_AS_Item_Plan[1][7] = 'I00K'
set AI_AS_Item_Plan[1][8] = 'gcel'
set AI_AS_Item_Plan[1][9] = 'sres'
set AI_AS_Item_Point[1][6] = 5
set AI_AS_Item_Point[1][7] = 5
set AI_AS_Item_Point[1][8] = 5
set AI_AS_Item_Point[1][9] = 5
//Brutalic
set AI_AS_Item_Plan[1][10] = 'modt'
set AI_AS_Item_Plan[1][11] = 'I01B'
set AI_AS_Item_Plan[1][12] = 'I00G'
set AI_AS_Item_Point[1][10] = 5
set AI_AS_Item_Point[1][11] = 5
set AI_AS_Item_Point[1][12] = 5
//Mindseer of Ultimate
set AI_AS_Item_Plan[1][13] = 'I00M'
set AI_AS_Item_Plan[1][14] = 'I00I'
set AI_AS_Item_Point[1][13] = 12
set AI_AS_Item_Point[1][14] = 12
//Amazon Meld
set AI_AS_Item_Plan[1][15] = 'I002'
set AI_AS_Item_Point[1][15] = 30
endif
//General ability
if(true) then
set AI_Ability_Type[4][0] = ABILITY_TYPE_MOBILE_OFFENSE
set AI_Ability_Type[4][1] = ABILITY_TYPE_DEFENSE_ACTIVATE
set AI_Ability_Type[4][2] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[4][3] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[4][4] = ABILITY_TYPE_ULTIMATE
set AI_Ability_Order_Type[4][0] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Order_Type[4][1] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[4][2] = ACTION_ORDER_TYPE_UNKNOWN
set AI_Ability_Order_Type[4][3] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Order_Type[4][4] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Level[4][0] = 4
set AI_Ability_Level[4][1] = 3
set AI_Ability_Level[4][2] = 3
set AI_Ability_Level[4][3] = 3
set AI_Ability_Level[4][4] = 2
set AI_Ability_Type_Score[4][0] = 10
set AI_Ability_Type_Score[4][1] = 4
set AI_Ability_Type_Score[4][2] = 7
set AI_Ability_Type_Score[4][3] = 9
set AI_Ability_Type_Score[4][4] = 6
set AI_Ability_ID[4][0] = 'A05A'
set AI_Ability_ID[4][1] = 'AEim'
set AI_Ability_ID[4][2] = 'A056'
set AI_Ability_ID[4][3] = 'A058'
set AI_Ability_ID[4][4] = 'A052'
set AI_Ability_Learn_Skip[4][0] = 2
set AI_Ability_Learn_Skip[4][1] = 2
set AI_Ability_Learn_Skip[4][2] = 2
set AI_Ability_Learn_Skip[4][3] = 2
set AI_Ability_Learn_Skip[4][4] = 7
set AI_Ability_Level_Required[4][0] = 0
set AI_Ability_Level_Required[4][1] = 0
set AI_Ability_Level_Required[4][2] = 0
set AI_Ability_Level_Required[4][3] = 0
set AI_Ability_Level_Required[4][4] = 6
set AI_Ability_Order[4][0] = "web"
set AI_Ability_Order[4][1] = "immolation"
set AI_Ability_Order[4][2] = ""
set AI_Ability_Order[4][3] = "weboff"
set AI_Ability_Order[4][4] = "whirlwind"
set AI_Ability_Order_Next[4][0] = ""
set AI_Ability_Order_Next[4][1] = "unimmolation"
set AI_Ability_Order_Next[4][2] = ""
set AI_Ability_Order_Next[4][3] = ""
set AI_Ability_Order_Next[4][4] = ""
set AI_Ability_Buff[4][0] = 0
set AI_Ability_Buff[4][1] = 'BEim'
set AI_Ability_Buff[4][2] = 0
set AI_Ability_Buff[4][3] = 0
set AI_Ability_Buff[4][4] = 0
endif
//Torrid Sting
if(true) then
set AI_AS_Ability_Cooldown[0][0] = 18
set AI_AS_Ability_Cooldown[0][1] = 17
set AI_AS_Ability_Cooldown[0][2] = 15
set AI_AS_Ability_Cooldown[0][3] = 12
set AI_AS_Ability_Mana[0][0] = 100
set AI_AS_Ability_Mana[0][1] = 100
set AI_AS_Ability_Mana[0][2] = 100
set AI_AS_Ability_Mana[0][3] = 100
set AI_AS_Ability_Range[0][0] = 900.0
set AI_AS_Ability_Range[0][1] = 900.0
set AI_AS_Ability_Range[0][2] = 900.0
set AI_AS_Ability_Range[0][3] = 900.0
set AI_AS_Ability_Detect_Area[0][0] = 800.0
set AI_AS_Ability_Detect_Area[0][1] = 800.0
set AI_AS_Ability_Detect_Area[0][2] = 800.0
set AI_AS_Ability_Detect_Area[0][3] = 800.0
set AI_AS_Ability_Area[0][0] = 300.0
set AI_AS_Ability_Area[0][1] = 300.0
set AI_AS_Ability_Area[0][2] = 300.0
set AI_AS_Ability_Area[0][3] = 300.0
set AI_AS_Ability_Mode[0][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_AS_Ability_Mode[0][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_AS_Ability_Mode[0][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_AS_Ability_Mode[0][3] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_AS_Ability_Perceive[0][0] = 5
set AI_AS_Ability_Perceive[0][1] = 5
set AI_AS_Ability_Perceive[0][2] = 5
set AI_AS_Ability_Perceive[0][3] = 5
endif
//Supreme
if(true) then
set AI_AS_Ability_Cooldown[1][0] = 1
set AI_AS_Ability_Cooldown[1][1] = 1
set AI_AS_Ability_Cooldown[1][2] = 1
set AI_AS_Ability_Cooldown[1][3] = 0
set AI_AS_Ability_Mana[1][0] = 80
set AI_AS_Ability_Mana[1][1] = 80
set AI_AS_Ability_Mana[1][2] = 80
set AI_AS_Ability_Mana[1][3] = 0
set AI_AS_Ability_Range[1][0] = 0.0
set AI_AS_Ability_Range[1][1] = 0.0
set AI_AS_Ability_Range[1][2] = 0.0
set AI_AS_Ability_Range[1][3] = 0.0
set AI_AS_Ability_Detect_Area[1][0] = 2000.0
set AI_AS_Ability_Detect_Area[1][1] = 2000.0
set AI_AS_Ability_Detect_Area[1][2] = 2000.0
set AI_AS_Ability_Detect_Area[1][3] = 0.0
set AI_AS_Ability_Area[1][0] = 500.0
set AI_AS_Ability_Area[1][1] = 500.0
set AI_AS_Ability_Area[1][2] = 500.0
set AI_AS_Ability_Area[1][3] = 0.0
set AI_AS_Ability_Mode[1][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_AS_Ability_Mode[1][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_AS_Ability_Mode[1][2] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_AS_Ability_Mode[1][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AS_Ability_Perceive[1][0] = 1
set AI_AS_Ability_Perceive[1][1] = 1
set AI_AS_Ability_Perceive[1][2] = 1
set AI_AS_Ability_Perceive[1][3] = 0
endif
//Fatal Strike
if(true) then
set AI_AS_Ability_Cooldown[2][0] = 0
set AI_AS_Ability_Cooldown[2][1] = 0
set AI_AS_Ability_Cooldown[2][2] = 0
set AI_AS_Ability_Cooldown[2][3] = 0
set AI_AS_Ability_Mana[2][0] = 0
set AI_AS_Ability_Mana[2][1] = 0
set AI_AS_Ability_Mana[2][2] = 0
set AI_AS_Ability_Mana[2][3] = 0
set AI_AS_Ability_Range[2][0] = 0.0
set AI_AS_Ability_Range[2][1] = 0.0
set AI_AS_Ability_Range[2][2] = 0.0
set AI_AS_Ability_Range[2][3] = 0.0
set AI_AS_Ability_Detect_Area[2][0] = 0.0
set AI_AS_Ability_Detect_Area[2][1] = 0.0
set AI_AS_Ability_Detect_Area[2][2] = 0.0
set AI_AS_Ability_Detect_Area[2][3] = 0.0
set AI_AS_Ability_Area[2][0] = 0.0
set AI_AS_Ability_Area[2][1] = 0.0
set AI_AS_Ability_Area[2][2] = 0.0
set AI_AS_Ability_Area[2][3] = 0.0
set AI_AS_Ability_Mode[2][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AS_Ability_Mode[2][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AS_Ability_Mode[2][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AS_Ability_Mode[2][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AS_Ability_Perceive[2][0] = 0
set AI_AS_Ability_Perceive[2][1] = 0
set AI_AS_Ability_Perceive[2][2] = 0
set AI_AS_Ability_Perceive[2][3] = 0
endif
//Zealous
if(true) then
set AI_AS_Ability_Cooldown[3][0] = 16
set AI_AS_Ability_Cooldown[3][1] = 14
set AI_AS_Ability_Cooldown[3][2] = 10
set AI_AS_Ability_Cooldown[3][3] = 0
set AI_AS_Ability_Mana[3][0] = 60
set AI_AS_Ability_Mana[3][1] = 60
set AI_AS_Ability_Mana[3][2] = 60
set AI_AS_Ability_Mana[3][3] = 0
set AI_AS_Ability_Range[3][0] = 900.0
set AI_AS_Ability_Range[3][1] = 900.0
set AI_AS_Ability_Range[3][2] = 900.0
set AI_AS_Ability_Range[3][3] = 0.0
set AI_AS_Ability_Detect_Area[3][0] = 700.0
set AI_AS_Ability_Detect_Area[3][1] = 700.0
set AI_AS_Ability_Detect_Area[3][2] = 700.0
set AI_AS_Ability_Detect_Area[3][3] = 0.0
set AI_AS_Ability_Area[3][0] = 0.0
set AI_AS_Ability_Area[3][1] = 0.0
set AI_AS_Ability_Area[3][2] = 0.0
set AI_AS_Ability_Area[3][3] = 0.0
set AI_AS_Ability_Mode[3][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_AS_Ability_Mode[3][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_AS_Ability_Mode[3][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_AS_Ability_Mode[3][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AS_Ability_Perceive[3][0] = 10
set AI_AS_Ability_Perceive[3][1] = 10
set AI_AS_Ability_Perceive[3][2] = 10
set AI_AS_Ability_Perceive[3][3] = 0
endif
//Whirling Blade
if(true) then
set AI_AS_Ability_Cooldown[4][0] = 40
set AI_AS_Ability_Cooldown[4][1] = 25
set AI_AS_Ability_Cooldown[4][2] = 0
set AI_AS_Ability_Cooldown[4][3] = 0
set AI_AS_Ability_Mana[4][0] = 200
set AI_AS_Ability_Mana[4][1] = 300
set AI_AS_Ability_Mana[4][2] = 0
set AI_AS_Ability_Mana[4][3] = 0
set AI_AS_Ability_Range[4][0] = 600.0
set AI_AS_Ability_Range[4][1] = 600.0
set AI_AS_Ability_Range[4][2] = 0.0
set AI_AS_Ability_Range[4][3] = 0.0
set AI_AS_Ability_Detect_Area[4][0] = 800.0
set AI_AS_Ability_Detect_Area[4][1] = 800.0
set AI_AS_Ability_Detect_Area[4][2] = 0.0
set AI_AS_Ability_Detect_Area[4][3] = 0.0
set AI_AS_Ability_Area[4][0] = 300.0
set AI_AS_Ability_Area[4][1] = 300.0
set AI_AS_Ability_Area[4][2] = 0.0
set AI_AS_Ability_Area[4][3] = 0.0
set AI_AS_Ability_Mode[4][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_AS_Ability_Mode[4][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_AS_Ability_Mode[4][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AS_Ability_Mode[4][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AS_Ability_Perceive[4][0] = 5
set AI_AS_Ability_Perceive[4][1] = 5
set AI_AS_Ability_Perceive[4][2] = 0
set AI_AS_Ability_Perceive[4][3] = 0
endif
endif
endfunction
endscope
//TESH.scrollpos=346
//TESH.alwaysfold=0
scope AIKnowledgeSC initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Spirit Caller
if(true) then
set AI_Life_Zone[5][0] = 50
set AI_Life_Zone[5][1] = 70
set AI_Life_Zone[5][2] = 100
set AI_Mana_Zone[5][0] = 20
set AI_Mana_Zone[5][1] = 50
set AI_Mana_Zone[5][2] = 100
set AI_Attack_Range_Zone[5][0] = 200
set AI_Attack_Range_Zone[5][1] = 500
//Offense attitude
set AI_SC_Item_Total_Plan[0] = 17
if(true) then
//Orb of Descent
set AI_SC_Item_Plan[0][0] = 'prvt'
set AI_SC_Item_Plan[0][1] = 'prvt'
set AI_SC_Item_Plan[0][2] = 'shea'
set AI_SC_Item_Point[0][0] = 3
set AI_SC_Item_Point[0][1] = 3
set AI_SC_Item_Point[0][2] = 3
//Bloodeye Lynch
set AI_SC_Item_Plan[0][3] = 'stel'
set AI_SC_Item_Plan[0][4] = 'stel'
set AI_SC_Item_Plan[0][5] = 'stel'
set AI_SC_Item_Plan[0][6] = 'stel'
set AI_SC_Item_Plan[0][7] = 'rej6'
set AI_SC_Item_Point[0][3] = 2
set AI_SC_Item_Point[0][4] = 2
set AI_SC_Item_Point[0][5] = 2
set AI_SC_Item_Point[0][6] = 2
set AI_SC_Item_Point[0][7] = 4
//Jungle Runner
set AI_SC_Item_Plan[0][8] = 'I00K'
set AI_SC_Item_Plan[0][9] = 'I00K'
set AI_SC_Item_Plan[0][10] = 'bspd'
set AI_SC_Item_Point[0][8] = 5
set AI_SC_Item_Point[0][9] = 5
set AI_SC_Item_Point[0][10] = 5
//Havocrave Dissever
set AI_SC_Item_Plan[0][11] = 'rej6'
set AI_SC_Item_Point[0][11] = 10
//Mindseer of Ultimate
set AI_SC_Item_Plan[0][12] = 'I00M'
set AI_SC_Item_Plan[0][13] = 'I00I'
set AI_SC_Item_Point[0][12] = 10
set AI_SC_Item_Point[0][13] = 5
//Sunstalker
set AI_SC_Item_Plan[0][14] = 'I01N'
set AI_SC_Item_Plan[0][15] = 'I01Z'
set AI_SC_Item_Point[0][14] = 20
set AI_SC_Item_Point[0][15] = 15
//Prime Lucent
set AI_SC_Item_Plan[0][16] = 'I009'
set AI_SC_Item_Point[0][16] = 20
endif
//Defense attitude
set AI_SC_Item_Total_Plan[1] = 14
if(true) then
//Orb of Descent
set AI_SC_Item_Plan[1][0] = 'prvt'
set AI_SC_Item_Plan[1][1] = 'prvt'
set AI_SC_Item_Plan[1][2] = 'shea'
set AI_SC_Item_Point[1][0] = 2
set AI_SC_Item_Point[1][1] = 2
set AI_SC_Item_Point[1][2] = 2
//Power Fragment
set AI_SC_Item_Plan[1][3] = 'penr'
set AI_SC_Item_Plan[1][4] = 'penr'
set AI_SC_Item_Plan[1][5] = 'sman'
set AI_SC_Item_Point[1][3] = 1
set AI_SC_Item_Point[1][4] = 1
set AI_SC_Item_Point[1][5] = 5
//Orenda Spectrum
set AI_SC_Item_Plan[1][6] = 'I005'
set AI_SC_Item_Plan[1][7] = 'rde2'
set AI_SC_Item_Plan[1][8] = 'scul'
set AI_SC_Item_Point[1][6] = 5
set AI_SC_Item_Point[1][7] = 2
set AI_SC_Item_Point[1][8] = 5
//Encease Siege
set AI_SC_Item_Plan[1][9] = 'rde2'
set AI_SC_Item_Plan[1][10] = 'rde3'
set AI_SC_Item_Point[1][9] = 10
set AI_SC_Item_Point[1][10] = 10
//Mindseer of Ultimate
set AI_SC_Item_Plan[1][11] = 'I00M'
set AI_SC_Item_Plan[1][12] = 'I00I'
set AI_SC_Item_Point[1][11] = 12
set AI_SC_Item_Point[1][12] = 12
//Prime Lucent
set AI_SC_Item_Plan[1][13] = 'I009'
set AI_SC_Item_Point[1][13] = 30
endif
//General ability
if(true) then
set AI_Ability_Type[5][0] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[5][1] = ABILITY_TYPE_MOBILE
set AI_Ability_Type[5][2] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[5][3] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[5][4] = ABILITY_TYPE_ULTIMATE
set AI_Ability_Order_Type[5][0] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[5][1] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[5][2] = ACTION_ORDER_TYPE_UNKNOWN
set AI_Ability_Order_Type[5][3] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[5][4] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Level[5][0] = 4
set AI_Ability_Level[5][1] = 3
set AI_Ability_Level[5][2] = 3
set AI_Ability_Level[5][3] = 3
set AI_Ability_Level[5][4] = 2
set AI_Ability_Type_Score[5][0] = 6
set AI_Ability_Type_Score[5][1] = 6
set AI_Ability_Type_Score[5][2] = 7
set AI_Ability_Type_Score[5][3] = 7
set AI_Ability_Type_Score[5][4] = 9
set AI_Ability_ID[5][0] = 'A05C'
set AI_Ability_ID[5][1] = 'A05H'
set AI_Ability_ID[5][2] = 'A05F'
set AI_Ability_ID[5][3] = 'A05E'
set AI_Ability_ID[5][4] = 'A05D'
set AI_Ability_Learn_Skip[5][0] = 2
set AI_Ability_Learn_Skip[5][1] = 2
set AI_Ability_Learn_Skip[5][2] = 2
set AI_Ability_Learn_Skip[5][3] = 2
set AI_Ability_Learn_Skip[5][4] = 7
set AI_Ability_Level_Required[5][0] = 0
set AI_Ability_Level_Required[5][1] = 0
set AI_Ability_Level_Required[5][2] = 0
set AI_Ability_Level_Required[5][3] = 0
set AI_Ability_Level_Required[5][4] = 6
set AI_Ability_Order[5][0] = "web"
set AI_Ability_Order[5][1] = "windwalk"
set AI_Ability_Order[5][2] = ""
set AI_Ability_Order[5][3] = "weboff"
set AI_Ability_Order[5][4] = "whirlwind"
set AI_Ability_Order_Next[5][0] = ""
set AI_Ability_Order_Next[5][1] = ""
set AI_Ability_Order_Next[5][2] = ""
set AI_Ability_Order_Next[5][3] = ""
set AI_Ability_Order_Next[5][4] = ""
set AI_Ability_Buff[5][0] = 0
set AI_Ability_Buff[5][1] = 0
set AI_Ability_Buff[5][2] = 0
set AI_Ability_Buff[5][3] = 0
set AI_Ability_Buff[5][4] = 0
endif
//Earth Tremble
if(true) then
set AI_SC_Ability_Cooldown[0][0] = 18
set AI_SC_Ability_Cooldown[0][1] = 16
set AI_SC_Ability_Cooldown[0][2] = 12
set AI_SC_Ability_Cooldown[0][3] = 6
set AI_SC_Ability_Mana[0][0] = 120
set AI_SC_Ability_Mana[0][1] = 120
set AI_SC_Ability_Mana[0][2] = 120
set AI_SC_Ability_Mana[0][3] = 120
set AI_SC_Ability_Range[0][0] = 900.0
set AI_SC_Ability_Range[0][1] = 900.0
set AI_SC_Ability_Range[0][2] = 900.0
set AI_SC_Ability_Range[0][3] = 900.0
set AI_SC_Ability_Detect_Area[0][0] = 700.0
set AI_SC_Ability_Detect_Area[0][1] = 700.0
set AI_SC_Ability_Detect_Area[0][2] = 700.0
set AI_SC_Ability_Detect_Area[0][3] = 700.0
set AI_SC_Ability_Area[0][0] = 300.0
set AI_SC_Ability_Area[0][1] = 300.0
set AI_SC_Ability_Area[0][2] = 300.0
set AI_SC_Ability_Area[0][3] = 300.0
set AI_SC_Ability_Mode[0][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SC_Ability_Mode[0][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SC_Ability_Mode[0][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SC_Ability_Mode[0][3] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SC_Ability_Perceive[0][0] = 5
set AI_SC_Ability_Perceive[0][1] = 5
set AI_SC_Ability_Perceive[0][2] = 5
set AI_SC_Ability_Perceive[0][3] = 5
endif
//Tracking Sense
if(true) then
set AI_SC_Ability_Cooldown[1][0] = 18
set AI_SC_Ability_Cooldown[1][1] = 16
set AI_SC_Ability_Cooldown[1][2] = 12
set AI_SC_Ability_Cooldown[1][3] = 0
set AI_SC_Ability_Mana[1][0] = 50
set AI_SC_Ability_Mana[1][1] = 50
set AI_SC_Ability_Mana[1][2] = 50
set AI_SC_Ability_Mana[1][3] = 0
set AI_SC_Ability_Range[1][0] = 0.0
set AI_SC_Ability_Range[1][1] = 0.0
set AI_SC_Ability_Range[1][2] = 0.0
set AI_SC_Ability_Range[1][3] = 0.0
set AI_SC_Ability_Detect_Area[1][0] = 5000.0
set AI_SC_Ability_Detect_Area[1][1] = 5000.0
set AI_SC_Ability_Detect_Area[1][2] = 5000.0
set AI_SC_Ability_Detect_Area[1][3] = 0.0
set AI_SC_Ability_Area[1][0] = 0.0
set AI_SC_Ability_Area[1][1] = 0.0
set AI_SC_Ability_Area[1][2] = 0.0
set AI_SC_Ability_Area[1][3] = 0.0
set AI_SC_Ability_Mode[1][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SC_Ability_Mode[1][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SC_Ability_Mode[1][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SC_Ability_Mode[1][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SC_Ability_Perceive[1][0] = 5
set AI_SC_Ability_Perceive[1][1] = 5
set AI_SC_Ability_Perceive[1][2] = 5
set AI_SC_Ability_Perceive[1][3] = 0
endif
//Spirit Bond
if(true) then
set AI_SC_Ability_Cooldown[2][0] = 0
set AI_SC_Ability_Cooldown[2][1] = 0
set AI_SC_Ability_Cooldown[2][2] = 0
set AI_SC_Ability_Cooldown[2][3] = 0
set AI_SC_Ability_Mana[2][0] = 0
set AI_SC_Ability_Mana[2][1] = 0
set AI_SC_Ability_Mana[2][2] = 0
set AI_SC_Ability_Mana[2][3] = 0
set AI_SC_Ability_Range[2][0] = 0.0
set AI_SC_Ability_Range[2][1] = 0.0
set AI_SC_Ability_Range[2][2] = 0.0
set AI_SC_Ability_Range[2][3] = 0.0
set AI_SC_Ability_Detect_Area[2][0] = 0.0
set AI_SC_Ability_Detect_Area[2][1] = 0.0
set AI_SC_Ability_Detect_Area[2][2] = 0.0
set AI_SC_Ability_Detect_Area[2][3] = 0.0
set AI_SC_Ability_Area[2][0] = 0.0
set AI_SC_Ability_Area[2][1] = 0.0
set AI_SC_Ability_Area[2][2] = 0.0
set AI_SC_Ability_Area[2][3] = 0.0
set AI_SC_Ability_Mode[2][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SC_Ability_Mode[2][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SC_Ability_Mode[2][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SC_Ability_Mode[2][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SC_Ability_Perceive[2][0] = 0
set AI_SC_Ability_Perceive[2][1] = 0
set AI_SC_Ability_Perceive[2][2] = 0
set AI_SC_Ability_Perceive[2][3] = 0
endif
//Fire Wall
if(true) then
set AI_SC_Ability_Cooldown[3][0] = 16
set AI_SC_Ability_Cooldown[3][1] = 12
set AI_SC_Ability_Cooldown[3][2] = 6
set AI_SC_Ability_Cooldown[3][3] = 0
set AI_SC_Ability_Mana[3][0] = 80
set AI_SC_Ability_Mana[3][1] = 80
set AI_SC_Ability_Mana[3][2] = 80
set AI_SC_Ability_Mana[3][3] = 0
set AI_SC_Ability_Range[3][0] = 900.0
set AI_SC_Ability_Range[3][1] = 900.0
set AI_SC_Ability_Range[3][2] = 900.0
set AI_SC_Ability_Range[3][3] = 0.0
set AI_SC_Ability_Detect_Area[3][0] = 900.0
set AI_SC_Ability_Detect_Area[3][1] = 900.0
set AI_SC_Ability_Detect_Area[3][2] = 900.0
set AI_SC_Ability_Detect_Area[3][3] = 0.0
set AI_SC_Ability_Area[3][0] = 0.0
set AI_SC_Ability_Area[3][1] = 0.0
set AI_SC_Ability_Area[3][2] = 0.0
set AI_SC_Ability_Area[3][3] = 0.0
set AI_SC_Ability_Mode[3][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SC_Ability_Mode[3][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SC_Ability_Mode[3][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SC_Ability_Mode[3][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SC_Ability_Perceive[3][0] = 5
set AI_SC_Ability_Perceive[3][1] = 5
set AI_SC_Ability_Perceive[3][2] = 5
set AI_SC_Ability_Perceive[3][3] = 0
endif
//Storm Called
if(true) then
set AI_SC_Ability_Cooldown[4][0] = 36
set AI_SC_Ability_Cooldown[4][1] = 18
set AI_SC_Ability_Cooldown[4][2] = 0
set AI_SC_Ability_Cooldown[4][3] = 0
set AI_SC_Ability_Mana[4][0] = 250
set AI_SC_Ability_Mana[4][1] = 500
set AI_SC_Ability_Mana[4][2] = 0
set AI_SC_Ability_Mana[4][3] = 0
set AI_SC_Ability_Range[4][0] = 900.0
set AI_SC_Ability_Range[4][1] = 900.0
set AI_SC_Ability_Range[4][2] = 0.0
set AI_SC_Ability_Range[4][3] = 0.0
set AI_SC_Ability_Detect_Area[4][0] = 900.0
set AI_SC_Ability_Detect_Area[4][1] = 900.0
set AI_SC_Ability_Detect_Area[4][2] = 0.0
set AI_SC_Ability_Detect_Area[4][3] = 0.0
set AI_SC_Ability_Area[4][0] = 300.0
set AI_SC_Ability_Area[4][1] = 300.0
set AI_SC_Ability_Area[4][2] = 0.0
set AI_SC_Ability_Area[4][3] = 0.0
set AI_SC_Ability_Mode[4][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SC_Ability_Mode[4][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SC_Ability_Mode[4][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SC_Ability_Mode[4][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SC_Ability_Perceive[4][0] = 5
set AI_SC_Ability_Perceive[4][1] = 5
set AI_SC_Ability_Perceive[4][2] = 0
set AI_SC_Ability_Perceive[4][3] = 0
endif
endif
endfunction
endscope
//TESH.scrollpos=239
//TESH.alwaysfold=0
scope AIKnowledgeGT initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Grandtaur
if(true) then
set AI_Life_Zone[6][0] = 50
set AI_Life_Zone[6][1] = 70
set AI_Life_Zone[6][2] = 100
set AI_Mana_Zone[6][0] = 20
set AI_Mana_Zone[6][1] = 50
set AI_Mana_Zone[6][2] = 100
set AI_Attack_Range_Zone[6][0] = 200
set AI_Attack_Range_Zone[6][1] = 200
//Offense attitude
set AI_GT_Item_Total_Plan[0] = 24
if(true) then
//Throne of Emperor
set AI_GT_Item_Plan[0][0] = 'bgst'
set AI_GT_Item_Plan[0][1] = 'bgst'
set AI_GT_Item_Plan[0][2] = 'bgst'
set AI_GT_Item_Plan[0][3] = 'bgst'
set AI_GT_Item_Plan[0][4] = 'rlif'
set AI_GT_Item_Plan[0][5] = 'rlif'
set AI_GT_Item_Plan[0][6] = 'rag1'
set AI_GT_Item_Plan[0][7] = 'shas'
set AI_GT_Item_Plan[0][8] = 'rag1'
set AI_GT_Item_Plan[0][9] = 'shas'
set AI_GT_Item_Point[0][0] = 2
set AI_GT_Item_Point[0][1] = 2
set AI_GT_Item_Point[0][2] = 2
set AI_GT_Item_Point[0][3] = 2
set AI_GT_Item_Point[0][4] = 2
set AI_GT_Item_Point[0][5] = 2
set AI_GT_Item_Point[0][6] = 2
set AI_GT_Item_Point[0][7] = 2
set AI_GT_Item_Point[0][8] = 2
set AI_GT_Item_Point[0][9] = 2
//Sneaker of Exzel
set AI_GT_Item_Plan[0][10] = 'rag1'
set AI_GT_Item_Plan[0][11] = 'shas'
set AI_GT_Item_Plan[0][12] = 'rag1'
set AI_GT_Item_Plan[0][13] = 'shas'
set AI_GT_Item_Plan[0][14] = 'gcel'
set AI_GT_Item_Plan[0][15] = 'sres'
set AI_GT_Item_Point[0][10] = 2
set AI_GT_Item_Point[0][11] = 2
set AI_GT_Item_Point[0][12] = 2
set AI_GT_Item_Point[0][13] = 2
set AI_GT_Item_Point[0][14] = 3
set AI_GT_Item_Point[0][15] = 3
//Power Fragment
set AI_GT_Item_Plan[0][16] = 'penr'
set AI_GT_Item_Plan[0][17] = 'penr'
set AI_GT_Item_Plan[0][18] = 'sman'
set AI_GT_Item_Point[0][16] = 1
set AI_GT_Item_Point[0][17] = 1
set AI_GT_Item_Point[0][18] = 5
//Havocrave Dissever
set AI_GT_Item_Plan[0][19] = 'I00T'
set AI_GT_Item_Plan[0][20] = 'I00T'
set AI_GT_Item_Point[0][19] = 10
set AI_GT_Item_Point[0][20] = 10
//Stormanifer
set AI_GT_Item_Plan[0][21] = 'I01J'
set AI_GT_Item_Plan[0][22] = 'I01J'
set AI_GT_Item_Point[0][21] = 12
set AI_GT_Item_Point[0][22] = 12
//Brutalic
set AI_GT_Item_Plan[0][23] = 'anfg'
set AI_GT_Item_Point[0][23] = 25
endif
//Defense attitude
set AI_GT_Item_Total_Plan[1] = 21
if(true) then
//Throne of Emperor
set AI_GT_Item_Plan[0][0] = 'bgst'
set AI_GT_Item_Plan[0][1] = 'bgst'
set AI_GT_Item_Plan[0][2] = 'bgst'
set AI_GT_Item_Plan[0][3] = 'bgst'
set AI_GT_Item_Plan[0][4] = 'rlif'
set AI_GT_Item_Plan[0][5] = 'rlif'
set AI_GT_Item_Plan[0][6] = 'rag1'
set AI_GT_Item_Plan[0][7] = 'shas'
set AI_GT_Item_Plan[0][8] = 'rag1'
set AI_GT_Item_Plan[0][9] = 'shas'
set AI_GT_Item_Point[0][0] = 2
set AI_GT_Item_Point[0][1] = 2
set AI_GT_Item_Point[0][2] = 2
set AI_GT_Item_Point[0][3] = 2
set AI_GT_Item_Point[0][4] = 2
set AI_GT_Item_Point[0][5] = 2
set AI_GT_Item_Point[0][6] = 2
set AI_GT_Item_Point[0][7] = 2
set AI_GT_Item_Point[0][8] = 2
set AI_GT_Item_Point[0][9] = 2
//Power Fragment
set AI_GT_Item_Plan[1][10] = 'penr'
set AI_GT_Item_Plan[1][11] = 'penr'
set AI_GT_Item_Plan[1][12] = 'sman'
set AI_GT_Item_Point[1][10] = 1
set AI_GT_Item_Point[1][11] = 1
set AI_GT_Item_Point[1][12] = 5
//Brutalic
set AI_GT_Item_Plan[1][13] = 'I00G'
set AI_GT_Item_Plan[1][14] = 'modt'
set AI_GT_Item_Plan[1][15] = 'I01B'
set AI_GT_Item_Point[1][13] = 5
set AI_GT_Item_Point[1][14] = 5
set AI_GT_Item_Point[1][15] = 5
//Wrist of Hercules
set AI_GT_Item_Plan[1][16] = 'brac'
set AI_GT_Item_Plan[1][17] = 'brac'
set AI_GT_Item_Point[1][16] = 10
set AI_GT_Item_Point[1][17] = 10
//Throne of Emperor
set AI_GT_Item_Plan[1][18] = 'I01F'
set AI_GT_Item_Plan[1][19] = 'bspd'
set AI_GT_Item_Point[1][18] = 20
set AI_GT_Item_Point[1][19] = 20
//Skull Crusher
set AI_GT_Item_Plan[1][20] = 'I00U'
set AI_GT_Item_Point[1][20] = 28
endif
//General ability
if(true) then
set AI_Ability_Type[6][0] = ABILITY_TYPE_MOBILE_OFFENSE
set AI_Ability_Type[6][1] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[6][2] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[6][3] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[6][4] = ABILITY_TYPE_ULTIMATE
set AI_Ability_Order_Type[6][0] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Order_Type[6][1] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[6][2] = ACTION_ORDER_TYPE_UNKNOWN
set AI_Ability_Order_Type[6][3] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[6][4] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Level[6][0] = 4
set AI_Ability_Level[6][1] = 3
set AI_Ability_Level[6][2] = 3
set AI_Ability_Level[6][3] = 3
set AI_Ability_Level[6][4] = 2
set AI_Ability_Type_Score[6][0] = 10
set AI_Ability_Type_Score[6][1] = 4
set AI_Ability_Type_Score[6][2] = 6
set AI_Ability_Type_Score[6][3] = 5
set AI_Ability_Type_Score[6][4] = 9
set AI_Ability_ID[6][0] = 'A05I'
set AI_Ability_ID[6][1] = 'A05M'
set AI_Ability_ID[6][2] = 'A05N'
set AI_Ability_ID[6][3] = 'A05J'
set AI_Ability_ID[6][4] = 'A05L'
set AI_Ability_Learn_Skip[6][0] = 2
set AI_Ability_Learn_Skip[6][1] = 2
set AI_Ability_Learn_Skip[6][2] = 2
set AI_Ability_Learn_Skip[6][3] = 2
set AI_Ability_Learn_Skip[6][4] = 7
set AI_Ability_Level_Required[6][0] = 0
set AI_Ability_Level_Required[6][1] = 0
set AI_Ability_Level_Required[6][2] = 0
set AI_Ability_Level_Required[6][3] = 0
set AI_Ability_Level_Required[6][4] = 6
set AI_Ability_Order[6][0] = "windwalk"
set AI_Ability_Order[6][1] = "web"
set AI_Ability_Order[6][2] = ""
set AI_Ability_Order[6][3] = "weboff"
set AI_Ability_Order[6][4] = "whirlwind"
set AI_Ability_Order_Next[6][0] = ""
set AI_Ability_Order_Next[6][1] = ""
set AI_Ability_Order_Next[6][2] = ""
set AI_Ability_Order_Next[6][3] = ""
set AI_Ability_Order_Next[6][4] = ""
set AI_Ability_Buff[6][0] = 0
set AI_Ability_Buff[6][1] = 0
set AI_Ability_Buff[6][2] = 0
set AI_Ability_Buff[6][3] = 0
set AI_Ability_Buff[6][4] = 0
endif
//Pulverize
if(true) then
set AI_GT_Ability_Cooldown[0][0] = 20
set AI_GT_Ability_Cooldown[0][1] = 19
set AI_GT_Ability_Cooldown[0][2] = 17
set AI_GT_Ability_Cooldown[0][3] = 14
set AI_GT_Ability_Mana[0][0] = 80
set AI_GT_Ability_Mana[0][1] = 80
set AI_GT_Ability_Mana[0][2] = 80
set AI_GT_Ability_Mana[0][3] = 80
set AI_GT_Ability_Range[0][0] = 1000.0
set AI_GT_Ability_Range[0][1] = 1000.0
set AI_GT_Ability_Range[0][2] = 1000.0
set AI_GT_Ability_Range[0][3] = 1000.0
set AI_GT_Ability_Detect_Area[0][0] = 1000.0
set AI_GT_Ability_Detect_Area[0][1] = 1000.0
set AI_GT_Ability_Detect_Area[0][2] = 1000.0
set AI_GT_Ability_Detect_Area[0][3] = 1000.0
set AI_GT_Ability_Area[0][0] = 300.0
set AI_GT_Ability_Area[0][1] = 300.0
set AI_GT_Ability_Area[0][2] = 300.0
set AI_GT_Ability_Area[0][3] = 300.0
set AI_GT_Ability_Mode[0][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_GT_Ability_Mode[0][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_GT_Ability_Mode[0][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_GT_Ability_Mode[0][3] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_GT_Ability_Perceive[0][0] = 15
set AI_GT_Ability_Perceive[0][1] = 15
set AI_GT_Ability_Perceive[0][2] = 15
set AI_GT_Ability_Perceive[0][3] = 15
endif
//Endurance
if(true) then
set AI_GT_Ability_Cooldown[1][0] = 30
set AI_GT_Ability_Cooldown[1][1] = 25
set AI_GT_Ability_Cooldown[1][2] = 20
set AI_GT_Ability_Cooldown[1][3] = 0
set AI_GT_Ability_Mana[1][0] = 20
set AI_GT_Ability_Mana[1][1] = 20
set AI_GT_Ability_Mana[1][2] = 20
set AI_GT_Ability_Mana[1][3] = 0
set AI_GT_Ability_Range[1][0] = 0.0
set AI_GT_Ability_Range[1][1] = 0.0
set AI_GT_Ability_Range[1][2] = 0.0
set AI_GT_Ability_Range[1][3] = 0.0
set AI_GT_Ability_Detect_Area[1][0] = 2000.0
set AI_GT_Ability_Detect_Area[1][1] = 2000.0
set AI_GT_Ability_Detect_Area[1][2] = 2000.0
set AI_GT_Ability_Detect_Area[1][3] = 0.0
set AI_GT_Ability_Area[1][0] = 0.0
set AI_GT_Ability_Area[1][1] = 0.0
set AI_GT_Ability_Area[1][2] = 0.0
set AI_GT_Ability_Area[1][3] = 0.0
set AI_GT_Ability_Mode[1][0] = KNOWLEDGE_ABILITY_MODE_ALLY
set AI_GT_Ability_Mode[1][1] = KNOWLEDGE_ABILITY_MODE_ALLY
set AI_GT_Ability_Mode[1][2] = KNOWLEDGE_ABILITY_MODE_ALLY
set AI_GT_Ability_Mode[1][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_GT_Ability_Perceive[1][0] = 26
set AI_GT_Ability_Perceive[1][1] = 26
set AI_GT_Ability_Perceive[1][2] = 26
set AI_GT_Ability_Perceive[1][3] = 0
endif
//Vigorous Attack
if(true) then
set AI_GT_Ability_Cooldown[2][0] = 0
set AI_GT_Ability_Cooldown[2][1] = 0
set AI_GT_Ability_Cooldown[2][2] = 0
set AI_GT_Ability_Cooldown[2][3] = 0
set AI_GT_Ability_Mana[2][0] = 0
set AI_GT_Ability_Mana[2][1] = 0
set AI_GT_Ability_Mana[2][2] = 0
set AI_GT_Ability_Mana[2][3] = 0
set AI_GT_Ability_Range[2][0] = 0.0
set AI_GT_Ability_Range[2][1] = 0.0
set AI_GT_Ability_Range[2][2] = 0.0
set AI_GT_Ability_Range[2][3] = 0.0
set AI_GT_Ability_Detect_Area[2][0] = 0.0
set AI_GT_Ability_Detect_Area[2][1] = 0.0
set AI_GT_Ability_Detect_Area[2][2] = 0.0
set AI_GT_Ability_Detect_Area[2][3] = 0.0
set AI_GT_Ability_Area[2][0] = 0.0
set AI_GT_Ability_Area[2][1] = 0.0
set AI_GT_Ability_Area[2][2] = 0.0
set AI_GT_Ability_Area[2][3] = 0.0
set AI_GT_Ability_Mode[2][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_GT_Ability_Mode[2][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_GT_Ability_Mode[2][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_GT_Ability_Mode[2][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_GT_Ability_Perceive[2][0] = 0
set AI_GT_Ability_Perceive[2][1] = 0
set AI_GT_Ability_Perceive[2][2] = 0
set AI_GT_Ability_Perceive[2][3] = 0
endif
//Crushing Stomp
if(true) then
set AI_GT_Ability_Cooldown[3][0] = 25
set AI_GT_Ability_Cooldown[3][1] = 20
set AI_GT_Ability_Cooldown[3][2] = 15
set AI_GT_Ability_Cooldown[3][3] = 0
set AI_GT_Ability_Mana[3][0] = 100
set AI_GT_Ability_Mana[3][1] = 100
set AI_GT_Ability_Mana[3][2] = 100
set AI_GT_Ability_Mana[3][3] = 0
set AI_GT_Ability_Range[3][0] = 0.0
set AI_GT_Ability_Range[3][1] = 0.0
set AI_GT_Ability_Range[3][2] = 0.0
set AI_GT_Ability_Range[3][3] = 0.0
set AI_GT_Ability_Detect_Area[3][0] = 500.0
set AI_GT_Ability_Detect_Area[3][1] = 500.0
set AI_GT_Ability_Detect_Area[3][2] = 500.0
set AI_GT_Ability_Detect_Area[3][3] = 0.0
set AI_GT_Ability_Area[3][0] = 500.0
set AI_GT_Ability_Area[3][1] = 500.0
set AI_GT_Ability_Area[3][2] = 500.0
set AI_GT_Ability_Area[3][3] = 0.0
set AI_GT_Ability_Mode[3][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_GT_Ability_Mode[3][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_GT_Ability_Mode[3][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_GT_Ability_Mode[3][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_GT_Ability_Perceive[3][0] = 5
set AI_GT_Ability_Perceive[3][1] = 5
set AI_GT_Ability_Perceive[3][2] = 5
set AI_GT_Ability_Perceive[3][3] = 0
endif
//Terra Shock
if(true) then
set AI_GT_Ability_Cooldown[4][0] = 80
set AI_GT_Ability_Cooldown[4][1] = 40
set AI_GT_Ability_Cooldown[4][2] = 0
set AI_GT_Ability_Cooldown[4][3] = 0
set AI_GT_Ability_Mana[4][0] = 180
set AI_GT_Ability_Mana[4][1] = 250
set AI_GT_Ability_Mana[4][2] = 0
set AI_GT_Ability_Mana[4][3] = 0
set AI_GT_Ability_Range[4][0] = 500.0
set AI_GT_Ability_Range[4][1] = 500.0
set AI_GT_Ability_Range[4][2] = 0.0
set AI_GT_Ability_Range[4][3] = 0.0
set AI_GT_Ability_Detect_Area[4][0] = 400.0
set AI_GT_Ability_Detect_Area[4][1] = 400.0
set AI_GT_Ability_Detect_Area[4][2] = 0.0
set AI_GT_Ability_Detect_Area[4][3] = 0.0
set AI_GT_Ability_Area[4][0] = 0.0
set AI_GT_Ability_Area[4][1] = 0.0
set AI_GT_Ability_Area[4][2] = 0.0
set AI_GT_Ability_Area[4][3] = 0.0
set AI_GT_Ability_Mode[4][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_GT_Ability_Mode[4][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_GT_Ability_Mode[4][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_GT_Ability_Mode[4][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_GT_Ability_Perceive[4][0] = 5
set AI_GT_Ability_Perceive[4][1] = 5
set AI_GT_Ability_Perceive[4][2] = 0
set AI_GT_Ability_Perceive[4][3] = 0
endif
endif
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope AIKnowledgeOS initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Occult Sage
if(true) then
set AI_Life_Zone[7][0] = 50
set AI_Life_Zone[7][1] = 70
set AI_Life_Zone[7][2] = 100
set AI_Mana_Zone[7][0] = 20
set AI_Mana_Zone[7][1] = 50
set AI_Mana_Zone[7][2] = 100
set AI_Attack_Range_Zone[7][0] = 200
set AI_Attack_Range_Zone[7][1] = 600
//Offense attitude
set AI_OS_Item_Total_Plan[0] = 17
if(true) then
//Orb of Descent
set AI_OS_Item_Plan[0][0] = 'prvt'
set AI_OS_Item_Plan[0][1] = 'prvt'
set AI_OS_Item_Plan[0][2] = 'shea'
set AI_OS_Item_Point[0][0] = 3
set AI_OS_Item_Point[0][1] = 3
set AI_OS_Item_Point[0][2] = 3
//Bloodeye Lynch
set AI_OS_Item_Plan[0][3] = 'stel'
set AI_OS_Item_Plan[0][4] = 'stel'
set AI_OS_Item_Plan[0][5] = 'stel'
set AI_OS_Item_Plan[0][6] = 'stel'
set AI_OS_Item_Plan[0][7] = 'rej6'
set AI_OS_Item_Point[0][3] = 2
set AI_OS_Item_Point[0][4] = 2
set AI_OS_Item_Point[0][5] = 2
set AI_OS_Item_Point[0][6] = 2
set AI_OS_Item_Point[0][7] = 4
//Jungle Runner
set AI_OS_Item_Plan[0][8] = 'I00K'
set AI_OS_Item_Plan[0][9] = 'I00K'
set AI_OS_Item_Plan[0][10] = 'bspd'
set AI_OS_Item_Point[0][8] = 5
set AI_OS_Item_Point[0][9] = 5
set AI_OS_Item_Point[0][10] = 5
//Havocrave Dissever
set AI_OS_Item_Plan[0][11] = 'rej6'
set AI_OS_Item_Point[0][11] = 10
//Mindseer of Ultimate
set AI_OS_Item_Plan[0][12] = 'I00M'
set AI_OS_Item_Plan[0][13] = 'I00I'
set AI_OS_Item_Point[0][12] = 10
set AI_OS_Item_Point[0][13] = 5
//Sunstalker
set AI_OS_Item_Plan[0][14] = 'I01N'
set AI_OS_Item_Plan[0][15] = 'I01Z'
set AI_OS_Item_Point[0][14] = 20
set AI_OS_Item_Point[0][15] = 15
//Prime Lucent
set AI_OS_Item_Plan[0][16] = 'I009'
set AI_OS_Item_Point[0][16] = 20
endif
//Defense attitude
set AI_OS_Item_Total_Plan[1] = 14
if(true) then
//Orb of Descent
set AI_OS_Item_Plan[1][0] = 'prvt'
set AI_OS_Item_Plan[1][1] = 'prvt'
set AI_OS_Item_Plan[1][2] = 'shea'
set AI_OS_Item_Point[1][0] = 2
set AI_OS_Item_Point[1][1] = 2
set AI_OS_Item_Point[1][2] = 2
//Power Fragment
set AI_OS_Item_Plan[1][3] = 'penr'
set AI_OS_Item_Plan[1][4] = 'penr'
set AI_OS_Item_Plan[1][5] = 'sman'
set AI_OS_Item_Point[1][3] = 1
set AI_OS_Item_Point[1][4] = 1
set AI_OS_Item_Point[1][5] = 5
//Orenda Spectrum
set AI_OS_Item_Plan[1][6] = 'I005'
set AI_OS_Item_Plan[1][7] = 'rde2'
set AI_OS_Item_Plan[1][8] = 'scul'
set AI_OS_Item_Point[1][6] = 5
set AI_OS_Item_Point[1][7] = 2
set AI_OS_Item_Point[1][8] = 5
//Encease Siege
set AI_OS_Item_Plan[1][9] = 'rde2'
set AI_OS_Item_Plan[1][10] = 'rde3'
set AI_OS_Item_Point[1][9] = 10
set AI_OS_Item_Point[1][10] = 10
//Mindseer of Ultimate
set AI_OS_Item_Plan[1][11] = 'I00M'
set AI_OS_Item_Plan[1][12] = 'I00I'
set AI_OS_Item_Point[1][11] = 12
set AI_OS_Item_Point[1][12] = 12
//Prime Lucent
set AI_OS_Item_Plan[1][13] = 'I009'
set AI_OS_Item_Point[1][13] = 30
endif
//General ability
if(true) then
set AI_Ability_Type[7][0] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[7][1] = ABILITY_TYPE_MOBILE_OFFENSE
set AI_Ability_Type[7][2] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[7][3] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[7][4] = ABILITY_TYPE_ULTIMATE
set AI_Ability_Order_Type[7][0] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Order_Type[7][1] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[7][2] = ACTION_ORDER_TYPE_UNKNOWN
set AI_Ability_Order_Type[7][3] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[7][4] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Level[7][0] = 4
set AI_Ability_Level[7][1] = 3
set AI_Ability_Level[7][2] = 3
set AI_Ability_Level[7][3] = 3
set AI_Ability_Level[7][4] = 2
set AI_Ability_Type_Score[7][0] = 6
set AI_Ability_Type_Score[7][1] = 2
set AI_Ability_Type_Score[7][2] = 5
set AI_Ability_Type_Score[7][3] = 9
set AI_Ability_Type_Score[7][4] = 8
set AI_Ability_ID[7][0] = 'A05S'
set AI_Ability_ID[7][1] = 'A05T'
set AI_Ability_ID[7][2] = 'A05X'
set AI_Ability_ID[7][3] = 'A05U'
set AI_Ability_ID[7][4] = 'A05Z'
set AI_Ability_Learn_Skip[7][0] = 2
set AI_Ability_Learn_Skip[7][1] = 2
set AI_Ability_Learn_Skip[7][2] = 2
set AI_Ability_Learn_Skip[7][3] = 2
set AI_Ability_Learn_Skip[7][4] = 7
set AI_Ability_Level_Required[7][0] = 0
set AI_Ability_Level_Required[7][1] = 0
set AI_Ability_Level_Required[7][2] = 0
set AI_Ability_Level_Required[7][3] = 0
set AI_Ability_Level_Required[7][4] = 6
set AI_Ability_Order[7][0] = "wispharvest"
set AI_Ability_Order[7][1] = "windwalk"
set AI_Ability_Order[7][2] = ""
set AI_Ability_Order[7][3] = "weboff"
set AI_Ability_Order[7][4] = "whirlwind"
set AI_Ability_Order_Next[7][0] = ""
set AI_Ability_Order_Next[7][1] = ""
set AI_Ability_Order_Next[7][2] = ""
set AI_Ability_Order_Next[7][3] = ""
set AI_Ability_Order_Next[7][4] = ""
set AI_Ability_Buff[7][0] = 0
set AI_Ability_Buff[7][1] = 0
set AI_Ability_Buff[7][2] = 0
set AI_Ability_Buff[7][3] = 0
set AI_Ability_Buff[7][4] = 0
endif
//Mystic Wave
if(true) then
set AI_OS_Ability_Cooldown[0][0] = 21
set AI_OS_Ability_Cooldown[0][1] = 18
set AI_OS_Ability_Cooldown[0][2] = 14
set AI_OS_Ability_Cooldown[0][3] = 10
set AI_OS_Ability_Mana[0][0] = 90
set AI_OS_Ability_Mana[0][1] = 90
set AI_OS_Ability_Mana[0][2] = 90
set AI_OS_Ability_Mana[0][3] = 90
set AI_OS_Ability_Range[0][0] = 1000.0
set AI_OS_Ability_Range[0][1] = 1000.0
set AI_OS_Ability_Range[0][2] = 1000.0
set AI_OS_Ability_Range[0][3] = 1000.0
set AI_OS_Ability_Detect_Area[0][0] = 500.0
set AI_OS_Ability_Detect_Area[0][1] = 500.0
set AI_OS_Ability_Detect_Area[0][2] = 500.0
set AI_OS_Ability_Detect_Area[0][3] = 500.0
set AI_OS_Ability_Area[0][0] = 700.0
set AI_OS_Ability_Area[0][1] = 700.0
set AI_OS_Ability_Area[0][2] = 700.0
set AI_OS_Ability_Area[0][3] = 700.0
set AI_OS_Ability_Mode[0][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_OS_Ability_Mode[0][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_OS_Ability_Mode[0][2] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_OS_Ability_Mode[0][3] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_OS_Ability_Perceive[0][0] = 5
set AI_OS_Ability_Perceive[0][1] = 5
set AI_OS_Ability_Perceive[0][2] = 5
set AI_OS_Ability_Perceive[0][3] = 5
endif
//Palm Flip
if(true) then
set AI_OS_Ability_Cooldown[1][0] = 14
set AI_OS_Ability_Cooldown[1][1] = 12
set AI_OS_Ability_Cooldown[1][2] = 8
set AI_OS_Ability_Cooldown[1][3] = 0
set AI_OS_Ability_Mana[1][0] = 75
set AI_OS_Ability_Mana[1][1] = 75
set AI_OS_Ability_Mana[1][2] = 75
set AI_OS_Ability_Mana[1][3] = 0
set AI_OS_Ability_Range[1][0] = 0.0
set AI_OS_Ability_Range[1][1] = 0.0
set AI_OS_Ability_Range[1][2] = 0.0
set AI_OS_Ability_Range[1][3] = 0.0
set AI_OS_Ability_Detect_Area[1][0] = 200.0
set AI_OS_Ability_Detect_Area[1][1] = 200.0
set AI_OS_Ability_Detect_Area[1][2] = 200.0
set AI_OS_Ability_Detect_Area[1][3] = 0.0
set AI_OS_Ability_Area[1][0] = 200.0
set AI_OS_Ability_Area[1][1] = 200.0
set AI_OS_Ability_Area[1][2] = 200.0
set AI_OS_Ability_Area[1][3] = 0.0
set AI_OS_Ability_Mode[1][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_OS_Ability_Mode[1][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_OS_Ability_Mode[1][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_OS_Ability_Mode[1][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_OS_Ability_Perceive[1][0] = 5
set AI_OS_Ability_Perceive[1][1] = 5
set AI_OS_Ability_Perceive[1][2] = 5
set AI_OS_Ability_Perceive[1][3] = 0
endif
//Hex
if(true) then
set AI_OS_Ability_Cooldown[2][0] = 0
set AI_OS_Ability_Cooldown[2][1] = 0
set AI_OS_Ability_Cooldown[2][2] = 0
set AI_OS_Ability_Cooldown[2][3] = 0
set AI_OS_Ability_Mana[2][0] = 0
set AI_OS_Ability_Mana[2][1] = 0
set AI_OS_Ability_Mana[2][2] = 0
set AI_OS_Ability_Mana[2][3] = 0
set AI_OS_Ability_Range[2][0] = 0.0
set AI_OS_Ability_Range[2][1] = 0.0
set AI_OS_Ability_Range[2][2] = 0.0
set AI_OS_Ability_Range[2][3] = 0.0
set AI_OS_Ability_Detect_Area[2][0] = 0.0
set AI_OS_Ability_Detect_Area[2][1] = 0.0
set AI_OS_Ability_Detect_Area[2][2] = 0.0
set AI_OS_Ability_Detect_Area[2][3] = 0.0
set AI_OS_Ability_Area[2][0] = 0.0
set AI_OS_Ability_Area[2][1] = 0.0
set AI_OS_Ability_Area[2][2] = 0.0
set AI_OS_Ability_Area[2][3] = 0.0
set AI_OS_Ability_Mode[2][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_OS_Ability_Mode[2][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_OS_Ability_Mode[2][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_OS_Ability_Mode[2][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_OS_Ability_Perceive[2][0] = 0
set AI_OS_Ability_Perceive[2][1] = 0
set AI_OS_Ability_Perceive[2][2] = 0
set AI_OS_Ability_Perceive[2][3] = 0
endif
//Torment Ward
if(true) then
set AI_OS_Ability_Cooldown[3][0] = 29
set AI_OS_Ability_Cooldown[3][1] = 25
set AI_OS_Ability_Cooldown[3][2] = 20
set AI_OS_Ability_Cooldown[3][3] = 0
set AI_OS_Ability_Mana[3][0] = 110
set AI_OS_Ability_Mana[3][1] = 110
set AI_OS_Ability_Mana[3][2] = 110
set AI_OS_Ability_Mana[3][3] = 0
set AI_OS_Ability_Range[3][0] = 0.0
set AI_OS_Ability_Range[3][1] = 0.0
set AI_OS_Ability_Range[3][2] = 0.0
set AI_OS_Ability_Range[3][3] = 0.0
set AI_OS_Ability_Detect_Area[3][0] = 1200.0
set AI_OS_Ability_Detect_Area[3][1] = 1200.0
set AI_OS_Ability_Detect_Area[3][2] = 1200.0
set AI_OS_Ability_Detect_Area[3][3] = 0.0
set AI_OS_Ability_Area[3][0] = 0.0
set AI_OS_Ability_Area[3][1] = 0.0
set AI_OS_Ability_Area[3][2] = 0.0
set AI_OS_Ability_Area[3][3] = 0.0
set AI_OS_Ability_Mode[3][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_OS_Ability_Mode[3][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_OS_Ability_Mode[3][2] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_OS_Ability_Mode[3][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_OS_Ability_Perceive[3][0] = 5
set AI_OS_Ability_Perceive[3][1] = 5
set AI_OS_Ability_Perceive[3][2] = 5
set AI_OS_Ability_Perceive[3][3] = 0
endif
//Voodoo
if(true) then
set AI_OS_Ability_Cooldown[4][0] = 60
set AI_OS_Ability_Cooldown[4][1] = 40
set AI_OS_Ability_Cooldown[4][2] = 0
set AI_OS_Ability_Cooldown[4][3] = 0
set AI_OS_Ability_Mana[4][0] = 150
set AI_OS_Ability_Mana[4][1] = 300
set AI_OS_Ability_Mana[4][2] = 0
set AI_OS_Ability_Mana[4][3] = 0
set AI_OS_Ability_Range[4][0] = 1000.0
set AI_OS_Ability_Range[4][1] = 1000.0
set AI_OS_Ability_Range[4][2] = 0.0
set AI_OS_Ability_Range[4][3] = 0.0
set AI_OS_Ability_Detect_Area[4][0] = 400.0
set AI_OS_Ability_Detect_Area[4][1] = 400.0
set AI_OS_Ability_Detect_Area[4][2] = 0.0
set AI_OS_Ability_Detect_Area[4][3] = 0.0
set AI_OS_Ability_Area[4][0] = 0.0
set AI_OS_Ability_Area[4][1] = 0.0
set AI_OS_Ability_Area[4][2] = 0.0
set AI_OS_Ability_Area[4][3] = 0.0
set AI_OS_Ability_Mode[4][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_OS_Ability_Mode[4][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_OS_Ability_Mode[4][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_OS_Ability_Mode[4][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_OS_Ability_Perceive[4][0] = 20
set AI_OS_Ability_Perceive[4][1] = 20
set AI_OS_Ability_Perceive[4][2] = 0
set AI_OS_Ability_Perceive[4][3] = 0
endif
endif
endfunction
endscope
//TESH.scrollpos=132
//TESH.alwaysfold=0
scope AIKnowledgeDL initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Death Legion
if(true) then
set AI_Life_Zone[8][0] = 50
set AI_Life_Zone[8][1] = 70
set AI_Life_Zone[8][2] = 100
set AI_Mana_Zone[8][0] = 20
set AI_Mana_Zone[8][1] = 50
set AI_Mana_Zone[8][2] = 100
set AI_Attack_Range_Zone[8][0] = 200
set AI_Attack_Range_Zone[8][1] = 200
//Offense attitude
set AI_DL_Item_Total_Plan[0] = 22
if(true) then
//Wrist of Hercules
set AI_DL_Item_Plan[0][0] = 'bgst'
set AI_DL_Item_Plan[0][1] = 'bgst'
set AI_DL_Item_Plan[0][2] = 'rlif'
set AI_DL_Item_Plan[0][3] = 'rlif'
set AI_DL_Item_Plan[0][4] = 'bgst'
set AI_DL_Item_Plan[0][5] = 'bgst'
set AI_DL_Item_Plan[0][6] = 'rlif'
set AI_DL_Item_Plan[0][7] = 'rlif'
set AI_DL_Item_Point[0][0] = 2
set AI_DL_Item_Point[0][1] = 2
set AI_DL_Item_Point[0][2] = 2
set AI_DL_Item_Point[0][3] = 2
set AI_DL_Item_Point[0][4] = 2
set AI_DL_Item_Point[0][5] = 2
set AI_DL_Item_Point[0][6] = 2
set AI_DL_Item_Point[0][7] = 2
//Throne of Emperor
set AI_DL_Item_Plan[0][8] = 'I00F'
set AI_DL_Item_Plan[0][9] = 'I00F'
set AI_DL_Item_Plan[0][10] = 'I00A'
set AI_DL_Item_Plan[0][11] = 'I00K'
set AI_DL_Item_Plan[0][12] = 'I00K'
set AI_DL_Item_Point[0][8] = 5
set AI_DL_Item_Point[0][9] = 5
set AI_DL_Item_Point[0][10] = 3
set AI_DL_Item_Point[0][11] = 2
set AI_DL_Item_Point[0][12] = 2
//Power Fragment
set AI_DL_Item_Plan[0][13] = 'penr'
set AI_DL_Item_Plan[0][14] = 'penr'
set AI_DL_Item_Plan[0][15] = 'sman'
set AI_DL_Item_Point[0][13] = 1
set AI_DL_Item_Point[0][14] = 1
set AI_DL_Item_Point[0][15] = 5
//Havocrave Dissever
set AI_DL_Item_Plan[0][16] = 'I00M'
set AI_DL_Item_Plan[0][17] = 'rej6'
set AI_DL_Item_Plan[0][18] = 'rej6'
set AI_DL_Item_Point[0][16] = 10
set AI_DL_Item_Point[0][17] = 5
set AI_DL_Item_Point[0][18] = 5
//Heaven Rapier
set AI_DL_Item_Plan[0][19] = 'kpin'
set AI_DL_Item_Plan[0][20] = 'I00Q'
set AI_DL_Item_Point[0][19] = 15
set AI_DL_Item_Point[0][20] = 15
//Aphotical Scythe
set AI_DL_Item_Plan[0][21] = 'rugt'
set AI_DL_Item_Point[0][21] = 26
endif
//Defense attitude
set AI_DL_Item_Total_Plan[1] = 14
if(true) then
//Royaltouch
set AI_DL_Item_Plan[1][0] = 'rlif'
set AI_DL_Item_Plan[1][1] = 'rlif'
set AI_DL_Item_Plan[1][2] = 'shea'
set AI_DL_Item_Point[1][0] = 2
set AI_DL_Item_Point[1][1] = 2
set AI_DL_Item_Point[1][2] = 2
//Power Fragment
set AI_DL_Item_Plan[1][3] = 'penr'
set AI_DL_Item_Plan[1][4] = 'penr'
set AI_DL_Item_Plan[1][5] = 'sman'
set AI_DL_Item_Point[1][3] = 1
set AI_DL_Item_Point[1][4] = 1
set AI_DL_Item_Point[1][5] = 5
//Orenda Spectrum
set AI_DL_Item_Plan[1][6] = 'rde2'
set AI_DL_Item_Plan[1][7] = 'scul'
set AI_DL_Item_Plan[1][8] = 'I00%'
set AI_DL_Item_Point[1][6] = 5
set AI_DL_Item_Point[1][7] = 2
set AI_DL_Item_Point[1][8] = 5
//Wrist of Hercules
set AI_DL_Item_Plan[1][9] = 'brac'
set AI_DL_Item_Plan[1][10] = 'brac'
set AI_DL_Item_Point[1][9] = 10
set AI_DL_Item_Point[1][10] = 10
//Throne of Emperor
set AI_DL_Item_Plan[1][11] = 'I01F'
set AI_DL_Item_Plan[1][12] = 'bspd'
set AI_DL_Item_Point[1][11] = 20
set AI_DL_Item_Point[1][12] = 20
//Skypath Strider
set AI_DL_Item_Plan[1][13] = 'I019'
set AI_DL_Item_Point[1][13] = 30
endif
//General ability
if(true) then
set AI_Ability_Type[8][0] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[8][1] = ABILITY_TYPE_MOBILE_OFFENSE
set AI_Ability_Type[8][2] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[8][3] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[8][4] = ABILITY_TYPE_ULTIMATE
set AI_Ability_Order_Type[8][0] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[8][1] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[8][2] = ACTION_ORDER_TYPE_UNKNOWN
set AI_Ability_Order_Type[8][3] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Order_Type[8][4] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Level[8][0] = 4
set AI_Ability_Level[8][1] = 3
set AI_Ability_Level[8][2] = 3
set AI_Ability_Level[8][3] = 3
set AI_Ability_Level[8][4] = 2
set AI_Ability_Type_Score[8][0] = 10
set AI_Ability_Type_Score[8][1] = 7
set AI_Ability_Type_Score[8][2] = 4
set AI_Ability_Type_Score[8][3] = 6
set AI_Ability_Type_Score[8][4] = 9
set AI_Ability_ID[8][0] = 'A063'
set AI_Ability_ID[8][1] = 'A065'
set AI_Ability_ID[8][2] = 'A067'
set AI_Ability_ID[8][3] = 'A064'
set AI_Ability_ID[8][4] = 'A066'
set AI_Ability_Learn_Skip[8][0] = 2
set AI_Ability_Learn_Skip[8][1] = 2
set AI_Ability_Learn_Skip[8][2] = 2
set AI_Ability_Learn_Skip[8][3] = 2
set AI_Ability_Learn_Skip[8][4] = 7
set AI_Ability_Level_Required[8][0] = 0
set AI_Ability_Level_Required[8][1] = 0
set AI_Ability_Level_Required[8][2] = 0
set AI_Ability_Level_Required[8][3] = 0
set AI_Ability_Level_Required[8][4] = 6
set AI_Ability_Order[8][0] = "web"
set AI_Ability_Order[8][1] = "windwalk"
set AI_Ability_Order[8][2] = ""
set AI_Ability_Order[8][3] = "weboff"
set AI_Ability_Order[8][4] = "whirlwind"
set AI_Ability_Order_Next[8][0] = ""
set AI_Ability_Order_Next[8][1] = ""
set AI_Ability_Order_Next[8][2] = ""
set AI_Ability_Order_Next[8][3] = ""
set AI_Ability_Order_Next[8][4] = ""
set AI_Ability_Buff[8][0] = 0
set AI_Ability_Buff[8][1] = 0
set AI_Ability_Buff[8][2] = 0
set AI_Ability_Buff[8][3] = 0
set AI_Ability_Buff[8][4] = 0
endif
//Necro Draw
if(true) then
set AI_DL_Ability_Cooldown[0][0] = 26
set AI_DL_Ability_Cooldown[0][1] = 22
set AI_DL_Ability_Cooldown[0][2] = 17
set AI_DL_Ability_Cooldown[0][3] = 12
set AI_DL_Ability_Mana[0][0] = 0
set AI_DL_Ability_Mana[0][1] = 0
set AI_DL_Ability_Mana[0][2] = 0
set AI_DL_Ability_Mana[0][3] = 0
set AI_DL_Ability_Range[0][0] = 1500.0
set AI_DL_Ability_Range[0][1] = 1500.0
set AI_DL_Ability_Range[0][2] = 1500.0
set AI_DL_Ability_Range[0][3] = 1500.0
set AI_DL_Ability_Detect_Area[0][0] = 1500.0
set AI_DL_Ability_Detect_Area[0][1] = 1500.0
set AI_DL_Ability_Detect_Area[0][2] = 1500.0
set AI_DL_Ability_Detect_Area[0][3] = 1500.0
set AI_DL_Ability_Area[0][0] = 200.0
set AI_DL_Ability_Area[0][1] = 250.0
set AI_DL_Ability_Area[0][2] = 300.0
set AI_DL_Ability_Area[0][3] = 400.0
set AI_DL_Ability_Mode[0][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DL_Ability_Mode[0][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DL_Ability_Mode[0][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DL_Ability_Mode[0][3] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DL_Ability_Perceive[0][0] = 5
set AI_DL_Ability_Perceive[0][1] = 5
set AI_DL_Ability_Perceive[0][2] = 5
set AI_DL_Ability_Perceive[0][3] = 5
endif
//Death Path
if(true) then
set AI_DL_Ability_Cooldown[1][0] = 32
set AI_DL_Ability_Cooldown[1][1] = 26
set AI_DL_Ability_Cooldown[1][2] = 20
set AI_DL_Ability_Cooldown[1][3] = 0
set AI_DL_Ability_Mana[1][0] = 40
set AI_DL_Ability_Mana[1][1] = 40
set AI_DL_Ability_Mana[1][2] = 40
set AI_DL_Ability_Mana[1][3] = 0
set AI_DL_Ability_Range[1][0] = 0.0
set AI_DL_Ability_Range[1][1] = 0.0
set AI_DL_Ability_Range[1][2] = 0.0
set AI_DL_Ability_Range[1][3] = 0.0
set AI_DL_Ability_Detect_Area[1][0] = 200.0
set AI_DL_Ability_Detect_Area[1][1] = 200.0
set AI_DL_Ability_Detect_Area[1][2] = 200.0
set AI_DL_Ability_Detect_Area[1][3] = 0.0
set AI_DL_Ability_Area[1][0] = 200.0
set AI_DL_Ability_Area[1][1] = 200.0
set AI_DL_Ability_Area[1][2] = 200.0
set AI_DL_Ability_Area[1][3] = 0.0
set AI_DL_Ability_Mode[1][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_DL_Ability_Mode[1][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_DL_Ability_Mode[1][2] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_DL_Ability_Mode[1][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DL_Ability_Perceive[1][0] = 5
set AI_DL_Ability_Perceive[1][1] = 5
set AI_DL_Ability_Perceive[1][2] = 5
set AI_DL_Ability_Perceive[1][3] = 0
endif
//Sword of Abyss
if(true) then
set AI_DL_Ability_Cooldown[2][0] = 0
set AI_DL_Ability_Cooldown[2][1] = 0
set AI_DL_Ability_Cooldown[2][2] = 0
set AI_DL_Ability_Cooldown[2][3] = 0
set AI_DL_Ability_Mana[2][0] = 0
set AI_DL_Ability_Mana[2][1] = 0
set AI_DL_Ability_Mana[2][2] = 0
set AI_DL_Ability_Mana[2][3] = 0
set AI_DL_Ability_Range[2][0] = 0.0
set AI_DL_Ability_Range[2][1] = 0.0
set AI_DL_Ability_Range[2][2] = 0.0
set AI_DL_Ability_Range[2][3] = 0.0
set AI_DL_Ability_Detect_Area[2][0] = 0.0
set AI_DL_Ability_Detect_Area[2][1] = 0.0
set AI_DL_Ability_Detect_Area[2][2] = 0.0
set AI_DL_Ability_Detect_Area[2][3] = 0.0
set AI_DL_Ability_Area[2][0] = 0.0
set AI_DL_Ability_Area[2][1] = 0.0
set AI_DL_Ability_Area[2][2] = 0.0
set AI_DL_Ability_Area[2][3] = 0.0
set AI_DL_Ability_Mode[2][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DL_Ability_Mode[2][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DL_Ability_Mode[2][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DL_Ability_Mode[2][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DL_Ability_Perceive[2][0] = 0
set AI_DL_Ability_Perceive[2][1] = 0
set AI_DL_Ability_Perceive[2][2] = 0
set AI_DL_Ability_Perceive[2][3] = 0
endif
//Rising Dead
if(true) then
set AI_DL_Ability_Cooldown[3][0] = 40
set AI_DL_Ability_Cooldown[3][1] = 32
set AI_DL_Ability_Cooldown[3][2] = 20
set AI_DL_Ability_Cooldown[3][3] = 0
set AI_DL_Ability_Mana[3][0] = 80
set AI_DL_Ability_Mana[3][1] = 80
set AI_DL_Ability_Mana[3][2] = 80
set AI_DL_Ability_Mana[3][3] = 0
set AI_DL_Ability_Range[3][0] = 900.0
set AI_DL_Ability_Range[3][1] = 900.0
set AI_DL_Ability_Range[3][2] = 900.0
set AI_DL_Ability_Range[3][3] = 0.0
set AI_DL_Ability_Detect_Area[3][0] = 600.0
set AI_DL_Ability_Detect_Area[3][1] = 600.0
set AI_DL_Ability_Detect_Area[3][2] = 600.0
set AI_DL_Ability_Detect_Area[3][3] = 0.0
set AI_DL_Ability_Area[3][0] = 0.0
set AI_DL_Ability_Area[3][1] = 0.0
set AI_DL_Ability_Area[3][2] = 0.0
set AI_DL_Ability_Area[3][3] = 0.0
set AI_DL_Ability_Mode[3][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DL_Ability_Mode[3][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DL_Ability_Mode[3][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DL_Ability_Mode[3][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DL_Ability_Perceive[3][0] = 5
set AI_DL_Ability_Perceive[3][1] = 5
set AI_DL_Ability_Perceive[3][2] = 5
set AI_DL_Ability_Perceive[3][3] = 0
endif
//Evil Pact
if(true) then
set AI_DL_Ability_Cooldown[4][0] = 120
set AI_DL_Ability_Cooldown[4][1] = 90
set AI_DL_Ability_Cooldown[4][2] = 0
set AI_DL_Ability_Cooldown[4][3] = 0
set AI_DL_Ability_Mana[4][0] = 150
set AI_DL_Ability_Mana[4][1] = 200
set AI_DL_Ability_Mana[4][2] = 0
set AI_DL_Ability_Mana[4][3] = 0
set AI_DL_Ability_Range[4][0] = 800.0
set AI_DL_Ability_Range[4][1] = 800.0
set AI_DL_Ability_Range[4][2] = 0.0
set AI_DL_Ability_Range[4][3] = 0.0
set AI_DL_Ability_Detect_Area[4][0] = 700.0
set AI_DL_Ability_Detect_Area[4][1] = 700.0
set AI_DL_Ability_Detect_Area[4][2] = 0.0
set AI_DL_Ability_Detect_Area[4][3] = 0.0
set AI_DL_Ability_Area[4][0] = 600.0
set AI_DL_Ability_Area[4][1] = 600.0
set AI_DL_Ability_Area[4][2] = 0.0
set AI_DL_Ability_Area[4][3] = 0.0
set AI_DL_Ability_Mode[4][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DL_Ability_Mode[4][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DL_Ability_Mode[4][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DL_Ability_Mode[4][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DL_Ability_Perceive[4][0] = 15
set AI_DL_Ability_Perceive[4][1] = 15
set AI_DL_Ability_Perceive[4][2] = 0
set AI_DL_Ability_Perceive[4][3] = 0
endif
endif
endfunction
endscope
//TESH.scrollpos=113
//TESH.alwaysfold=0
scope AIKnowledgeSW initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Skeleton Witch
if(true) then
set AI_Life_Zone[9][0] = 50
set AI_Life_Zone[9][1] = 70
set AI_Life_Zone[9][2] = 100
set AI_Mana_Zone[9][0] = 20
set AI_Mana_Zone[9][1] = 50
set AI_Mana_Zone[9][2] = 100
set AI_Attack_Range_Zone[9][0] = 200
set AI_Attack_Range_Zone[9][1] = 400
//Offense attitude
set AI_SW_Item_Total_Plan[0] = 16
if(true) then
//Orb of Descent
set AI_SW_Item_Plan[0][0] = 'prvt'
set AI_SW_Item_Plan[0][1] = 'prvt'
set AI_SW_Item_Plan[0][2] = 'shea'
set AI_SW_Item_Point[0][0] = 3
set AI_SW_Item_Point[0][1] = 3
set AI_SW_Item_Point[0][2] = 3
//Havocrave Dissever
set AI_SW_Item_Plan[0][3] = 'stel'
set AI_SW_Item_Plan[0][4] = 'stel'
set AI_SW_Item_Plan[0][5] = 'stel'
set AI_SW_Item_Plan[0][6] = 'stel'
set AI_SW_Item_Plan[0][7] = 'rej6'
set AI_SW_Item_Plan[0][8] = 'rej6'
set AI_SW_Item_Point[0][3] = 2
set AI_SW_Item_Point[0][4] = 2
set AI_SW_Item_Point[0][5] = 2
set AI_SW_Item_Point[0][6] = 2
set AI_SW_Item_Point[0][7] = 4
set AI_SW_Item_Point[0][8] = 10
//Brutalic
set AI_SW_Item_Plan[0][9] = 'I00G'
set AI_SW_Item_Plan[0][10] = 'modt'
set AI_SW_Item_Plan[0][11] = 'I01B'
set AI_SW_Item_Point[0][9] = 5
set AI_SW_Item_Point[0][10] = 5
set AI_SW_Item_Point[0][11] = 5
//Sneaker of Exzel
set AI_SW_Item_Plan[0][12] = 'bspd'
set AI_SW_Item_Plan[0][13] = 'rst1'
set AI_SW_Item_Point[0][12] = 10
set AI_SW_Item_Point[0][13] = 5
//Power Fragment
set AI_SW_Item_Plan[0][14] = 'I01V'
set AI_SW_Item_Point[0][14] = 20
//Chronos the Forbidden
set AI_SW_Item_Plan[0][15] = 'gvsm'
set AI_SW_Item_Point[0][15] = 20
endif
//Defense attitude
set AI_SW_Item_Total_Plan[1] = 16
if(true) then
//Orb of Descent
set AI_SW_Item_Plan[1][0] = 'prvt'
set AI_SW_Item_Plan[1][1] = 'prvt'
set AI_SW_Item_Plan[1][2] = 'shea'
set AI_SW_Item_Point[1][0] = 2
set AI_SW_Item_Point[1][1] = 2
set AI_SW_Item_Point[1][2] = 2
//Power Fragment
set AI_SW_Item_Plan[1][3] = 'penr'
set AI_SW_Item_Plan[1][4] = 'penr'
set AI_SW_Item_Plan[1][5] = 'sman'
set AI_SW_Item_Point[1][3] = 1
set AI_SW_Item_Point[1][4] = 1
set AI_SW_Item_Point[1][5] = 5
//Sneaker of Exzel
set AI_SW_Item_Plan[1][6] = 'I00K'
set AI_SW_Item_Plan[1][7] = 'I00K'
set AI_SW_Item_Plan[1][8] = 'gcel'
set AI_SW_Item_Plan[1][9] = 'sres'
set AI_SW_Item_Point[1][6] = 5
set AI_SW_Item_Point[1][7] = 5
set AI_SW_Item_Point[1][8] = 5
set AI_SW_Item_Point[1][9] = 5
//Brutalic
set AI_SW_Item_Plan[1][10] = 'modt'
set AI_SW_Item_Plan[1][11] = 'I01B'
set AI_SW_Item_Plan[1][12] = 'I00G'
set AI_SW_Item_Point[1][10] = 5
set AI_SW_Item_Point[1][11] = 5
set AI_SW_Item_Point[1][12] = 5
//Mindseer of Ultimate
set AI_SW_Item_Plan[1][13] = 'I00M'
set AI_SW_Item_Plan[1][14] = 'I00I'
set AI_SW_Item_Point[1][13] = 12
set AI_SW_Item_Point[1][14] = 12
//Heaven Rapier
set AI_SW_Item_Plan[1][15] = 'frgd'
set AI_SW_Item_Point[1][15] = 30
endif
//General ability
if(true) then
set AI_Ability_Type[9][0] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[9][1] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[9][2] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[9][3] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[9][4] = ABILITY_TYPE_ULTIMATE
set AI_Ability_Order_Type[9][0] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[9][1] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Order_Type[9][2] = ACTION_ORDER_TYPE_UNKNOWN
set AI_Ability_Order_Type[9][3] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Order_Type[9][4] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Level[9][0] = 4
set AI_Ability_Level[9][1] = 3
set AI_Ability_Level[9][2] = 3
set AI_Ability_Level[9][3] = 3
set AI_Ability_Level[9][4] = 2
set AI_Ability_Type_Score[9][0] = 10
set AI_Ability_Type_Score[9][1] = 4
set AI_Ability_Type_Score[9][2] = 4
set AI_Ability_Type_Score[9][3] = 8
set AI_Ability_Type_Score[9][4] = 10
set AI_Ability_ID[9][0] = 'A06A'
set AI_Ability_ID[9][1] = 'A06B'
set AI_Ability_ID[9][2] = 'AHad'
set AI_Ability_ID[9][3] = 'A06D'
set AI_Ability_ID[9][4] = 'A06C'
set AI_Ability_Learn_Skip[9][0] = 2
set AI_Ability_Learn_Skip[9][1] = 2
set AI_Ability_Learn_Skip[9][2] = 2
set AI_Ability_Learn_Skip[9][3] = 2
set AI_Ability_Learn_Skip[9][4] = 7
set AI_Ability_Level_Required[9][0] = 0
set AI_Ability_Level_Required[9][1] = 0
set AI_Ability_Level_Required[9][2] = 0
set AI_Ability_Level_Required[9][3] = 0
set AI_Ability_Level_Required[9][4] = 6
set AI_Ability_Order[9][0] = "immolation"
set AI_Ability_Order[9][1] = "web"
set AI_Ability_Order[9][2] = ""
set AI_Ability_Order[9][3] = "windwalk"
set AI_Ability_Order[9][4] = "whirlwind"
set AI_Ability_Order_Next[9][0] = ""
set AI_Ability_Order_Next[9][1] = ""
set AI_Ability_Order_Next[9][2] = ""
set AI_Ability_Order_Next[9][3] = ""
set AI_Ability_Order_Next[9][4] = ""
set AI_Ability_Buff[9][0] = 0
set AI_Ability_Buff[9][1] = 0
set AI_Ability_Buff[9][2] = 0
set AI_Ability_Buff[9][3] = 0
set AI_Ability_Buff[9][4] = 0
endif
//Frost Shatters
if(true) then
set AI_SW_Ability_Cooldown[0][0] = 1
set AI_SW_Ability_Cooldown[0][1] = 1
set AI_SW_Ability_Cooldown[0][2] = 1
set AI_SW_Ability_Cooldown[0][3] = 1
set AI_SW_Ability_Mana[0][0] = 10
set AI_SW_Ability_Mana[0][1] = 10
set AI_SW_Ability_Mana[0][2] = 10
set AI_SW_Ability_Mana[0][3] = 10
set AI_SW_Ability_Range[0][0] = 300.0
set AI_SW_Ability_Range[0][1] = 300.0
set AI_SW_Ability_Range[0][2] = 300.0
set AI_SW_Ability_Range[0][3] = 300.0
set AI_SW_Ability_Detect_Area[0][0] = 200.0
set AI_SW_Ability_Detect_Area[0][1] = 200.0
set AI_SW_Ability_Detect_Area[0][2] = 200.0
set AI_SW_Ability_Detect_Area[0][3] = 200.0
set AI_SW_Ability_Area[0][0] = 300.0
set AI_SW_Ability_Area[0][1] = 300.0
set AI_SW_Ability_Area[0][2] = 300.0
set AI_SW_Ability_Area[0][3] = 300.0
set AI_SW_Ability_Mode[0][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SW_Ability_Mode[0][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SW_Ability_Mode[0][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SW_Ability_Mode[0][3] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SW_Ability_Perceive[0][0] = 5
set AI_SW_Ability_Perceive[0][1] = 5
set AI_SW_Ability_Perceive[0][2] = 5
set AI_SW_Ability_Perceive[0][3] = 5
endif
//Essence Drain
if(true) then
set AI_SW_Ability_Cooldown[1][0] = 29
set AI_SW_Ability_Cooldown[1][1] = 24
set AI_SW_Ability_Cooldown[1][2] = 17
set AI_SW_Ability_Cooldown[1][3] = 0
set AI_SW_Ability_Mana[1][0] = 150
set AI_SW_Ability_Mana[1][1] = 180
set AI_SW_Ability_Mana[1][2] = 210
set AI_SW_Ability_Mana[1][3] = 0
set AI_SW_Ability_Range[1][0] = 1200.0
set AI_SW_Ability_Range[1][1] = 1200.0
set AI_SW_Ability_Range[1][2] = 1200.0
set AI_SW_Ability_Range[1][3] = 0.0
set AI_SW_Ability_Detect_Area[1][0] = 1000.0
set AI_SW_Ability_Detect_Area[1][1] = 1000.0
set AI_SW_Ability_Detect_Area[1][2] = 1000.0
set AI_SW_Ability_Detect_Area[1][3] = 0.0
set AI_SW_Ability_Area[1][0] = 0.0
set AI_SW_Ability_Area[1][1] = 0.0
set AI_SW_Ability_Area[1][2] = 0.0
set AI_SW_Ability_Area[1][3] = 0.0
set AI_SW_Ability_Mode[1][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SW_Ability_Mode[1][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SW_Ability_Mode[1][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SW_Ability_Mode[1][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SW_Ability_Perceive[1][0] = 25
set AI_SW_Ability_Perceive[1][1] = 25
set AI_SW_Ability_Perceive[1][2] = 25
set AI_SW_Ability_Perceive[1][3] = 0
endif
//Wicked Presence
if(true) then
set AI_SW_Ability_Cooldown[2][0] = 0
set AI_SW_Ability_Cooldown[2][1] = 0
set AI_SW_Ability_Cooldown[2][2] = 0
set AI_SW_Ability_Cooldown[2][3] = 0
set AI_SW_Ability_Mana[2][0] = 0
set AI_SW_Ability_Mana[2][1] = 0
set AI_SW_Ability_Mana[2][2] = 0
set AI_SW_Ability_Mana[2][3] = 0
set AI_SW_Ability_Range[2][0] = 0.0
set AI_SW_Ability_Range[2][1] = 0.0
set AI_SW_Ability_Range[2][2] = 0.0
set AI_SW_Ability_Range[2][3] = 0.0
set AI_SW_Ability_Detect_Area[2][0] = 0.0
set AI_SW_Ability_Detect_Area[2][1] = 0.0
set AI_SW_Ability_Detect_Area[2][2] = 0.0
set AI_SW_Ability_Detect_Area[2][3] = 0.0
set AI_SW_Ability_Area[2][0] = 0.0
set AI_SW_Ability_Area[2][1] = 0.0
set AI_SW_Ability_Area[2][2] = 0.0
set AI_SW_Ability_Area[2][3] = 0.0
set AI_SW_Ability_Mode[2][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SW_Ability_Mode[2][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SW_Ability_Mode[2][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SW_Ability_Mode[2][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SW_Ability_Perceive[2][0] = 0
set AI_SW_Ability_Perceive[2][1] = 0
set AI_SW_Ability_Perceive[2][2] = 0
set AI_SW_Ability_Perceive[2][3] = 0
endif
//Dark Veil
if(true) then
set AI_SW_Ability_Cooldown[3][0] = 23
set AI_SW_Ability_Cooldown[3][1] = 18
set AI_SW_Ability_Cooldown[3][2] = 11
set AI_SW_Ability_Cooldown[3][3] = 0
set AI_SW_Ability_Mana[3][0] = 130
set AI_SW_Ability_Mana[3][1] = 130
set AI_SW_Ability_Mana[3][2] = 130
set AI_SW_Ability_Mana[3][3] = 0
set AI_SW_Ability_Range[3][0] = 900.0
set AI_SW_Ability_Range[3][1] = 900.0
set AI_SW_Ability_Range[3][2] = 900.0
set AI_SW_Ability_Range[3][3] = 0.0
set AI_SW_Ability_Detect_Area[3][0] = 900.0
set AI_SW_Ability_Detect_Area[3][1] = 900.0
set AI_SW_Ability_Detect_Area[3][2] = 900.0
set AI_SW_Ability_Detect_Area[3][3] = 0.0
set AI_SW_Ability_Area[3][0] = 0.0
set AI_SW_Ability_Area[3][1] = 0.0
set AI_SW_Ability_Area[3][2] = 0.0
set AI_SW_Ability_Area[3][3] = 0.0
set AI_SW_Ability_Mode[3][0] = KNOWLEDGE_ABILITY_MODE_ALLY
set AI_SW_Ability_Mode[3][1] = KNOWLEDGE_ABILITY_MODE_ALLY
set AI_SW_Ability_Mode[3][2] = KNOWLEDGE_ABILITY_MODE_ALLY
set AI_SW_Ability_Mode[3][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SW_Ability_Perceive[3][0] = 5
set AI_SW_Ability_Perceive[3][1] = 5
set AI_SW_Ability_Perceive[3][2] = 5
set AI_SW_Ability_Perceive[3][3] = 0
endif
//Atropy Ritual
if(true) then
set AI_SW_Ability_Cooldown[4][0] = 100
set AI_SW_Ability_Cooldown[4][1] = 60
set AI_SW_Ability_Cooldown[4][2] = 0
set AI_SW_Ability_Cooldown[4][3] = 0
set AI_SW_Ability_Mana[4][0] = 300
set AI_SW_Ability_Mana[4][1] = 500
set AI_SW_Ability_Mana[4][2] = 0
set AI_SW_Ability_Mana[4][3] = 0
set AI_SW_Ability_Range[4][0] = 0.0
set AI_SW_Ability_Range[4][1] = 0.0
set AI_SW_Ability_Range[4][2] = 0.0
set AI_SW_Ability_Range[4][3] = 0.0
set AI_SW_Ability_Detect_Area[4][0] = 9000.0
set AI_SW_Ability_Detect_Area[4][1] = 9000.0
set AI_SW_Ability_Detect_Area[4][2] = 0.0
set AI_SW_Ability_Detect_Area[4][3] = 0.0
set AI_SW_Ability_Area[4][0] = 0.0
set AI_SW_Ability_Area[4][1] = 0.0
set AI_SW_Ability_Area[4][2] = 0.0
set AI_SW_Ability_Area[4][3] = 0.0
set AI_SW_Ability_Mode[4][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SW_Ability_Mode[4][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SW_Ability_Mode[4][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SW_Ability_Mode[4][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SW_Ability_Perceive[4][0] = 5
set AI_SW_Ability_Perceive[4][1] = 5
set AI_SW_Ability_Perceive[4][2] = 0
set AI_SW_Ability_Perceive[4][3] = 0
endif
endif
endfunction
endscope
//TESH.scrollpos=195
//TESH.alwaysfold=0
scope AIKnowledgeMP initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Mortal Predator
if(true) then
set AI_Life_Zone[10][0] = 50
set AI_Life_Zone[10][1] = 70
set AI_Life_Zone[10][2] = 100
set AI_Mana_Zone[10][0] = 20
set AI_Mana_Zone[10][1] = 50
set AI_Mana_Zone[10][2] = 100
set AI_Attack_Range_Zone[10][0] = 200
set AI_Attack_Range_Zone[10][1] = 200
//Offense attitude
set AI_MP_Item_Total_Plan[0] = 24
if(true) then
//Throne of Emperor
set AI_MP_Item_Plan[0][0] = 'bgst'
set AI_MP_Item_Plan[0][1] = 'bgst'
set AI_MP_Item_Plan[0][2] = 'bgst'
set AI_MP_Item_Plan[0][3] = 'bgst'
set AI_MP_Item_Plan[0][4] = 'rlif'
set AI_MP_Item_Plan[0][5] = 'rlif'
set AI_MP_Item_Plan[0][6] = 'rag1'
set AI_MP_Item_Plan[0][7] = 'shas'
set AI_MP_Item_Plan[0][8] = 'rag1'
set AI_MP_Item_Plan[0][9] = 'shas'
set AI_MP_Item_Point[0][0] = 2
set AI_MP_Item_Point[0][1] = 2
set AI_MP_Item_Point[0][2] = 2
set AI_MP_Item_Point[0][3] = 2
set AI_MP_Item_Point[0][4] = 2
set AI_MP_Item_Point[0][5] = 2
set AI_MP_Item_Point[0][6] = 2
set AI_MP_Item_Point[0][7] = 2
set AI_MP_Item_Point[0][8] = 2
set AI_MP_Item_Point[0][9] = 2
//Sneaker of Exzel
set AI_MP_Item_Plan[0][10] = 'rag1'
set AI_MP_Item_Plan[0][11] = 'shas'
set AI_MP_Item_Plan[0][12] = 'rag1'
set AI_MP_Item_Plan[0][13] = 'shas'
set AI_MP_Item_Plan[0][14] = 'gcel'
set AI_MP_Item_Plan[0][15] = 'sres'
set AI_MP_Item_Point[0][10] = 2
set AI_MP_Item_Point[0][11] = 2
set AI_MP_Item_Point[0][12] = 2
set AI_MP_Item_Point[0][13] = 2
set AI_MP_Item_Point[0][14] = 3
set AI_MP_Item_Point[0][15] = 3
//Power Fragment
set AI_MP_Item_Plan[0][16] = 'penr'
set AI_MP_Item_Plan[0][17] = 'penr'
set AI_MP_Item_Plan[0][18] = 'sman'
set AI_MP_Item_Point[0][16] = 1
set AI_MP_Item_Point[0][17] = 1
set AI_MP_Item_Point[0][18] = 5
//Havocrave Dissever
set AI_MP_Item_Plan[0][19] = 'I00T'
set AI_MP_Item_Plan[0][20] = 'I00T'
set AI_MP_Item_Point[0][19] = 10
set AI_MP_Item_Point[0][20] = 10
//Stormanifer
set AI_MP_Item_Plan[0][21] = 'I01J'
set AI_MP_Item_Plan[0][22] = 'I01J'
set AI_MP_Item_Point[0][21] = 12
set AI_MP_Item_Point[0][22] = 12
//Brutalic
set AI_MP_Item_Plan[0][23] = 'anfg'
set AI_MP_Item_Point[0][23] = 25
endif
//Defense attitude
set AI_MP_Item_Total_Plan[1] = 21
if(true) then
//Throne of Emperor
set AI_MP_Item_Plan[0][0] = 'bgst'
set AI_MP_Item_Plan[0][1] = 'bgst'
set AI_MP_Item_Plan[0][2] = 'bgst'
set AI_MP_Item_Plan[0][3] = 'bgst'
set AI_MP_Item_Plan[0][4] = 'rlif'
set AI_MP_Item_Plan[0][5] = 'rlif'
set AI_MP_Item_Plan[0][6] = 'rag1'
set AI_MP_Item_Plan[0][7] = 'shas'
set AI_MP_Item_Plan[0][8] = 'rag1'
set AI_MP_Item_Plan[0][9] = 'shas'
set AI_MP_Item_Point[0][0] = 2
set AI_MP_Item_Point[0][1] = 2
set AI_MP_Item_Point[0][2] = 2
set AI_MP_Item_Point[0][3] = 2
set AI_MP_Item_Point[0][4] = 2
set AI_MP_Item_Point[0][5] = 2
set AI_MP_Item_Point[0][6] = 2
set AI_MP_Item_Point[0][7] = 2
set AI_MP_Item_Point[0][8] = 2
set AI_MP_Item_Point[0][9] = 2
//Power Fragment
set AI_MP_Item_Plan[1][10] = 'penr'
set AI_MP_Item_Plan[1][11] = 'penr'
set AI_MP_Item_Plan[1][12] = 'sman'
set AI_MP_Item_Point[1][10] = 1
set AI_MP_Item_Point[1][11] = 1
set AI_MP_Item_Point[1][12] = 5
//Brutalic
set AI_MP_Item_Plan[1][13] = 'I00G'
set AI_MP_Item_Plan[1][14] = 'modt'
set AI_MP_Item_Plan[1][15] = 'I01B'
set AI_MP_Item_Point[1][13] = 5
set AI_MP_Item_Point[1][14] = 5
set AI_MP_Item_Point[1][15] = 5
//Wrist of Hercules
set AI_MP_Item_Plan[1][16] = 'brac'
set AI_MP_Item_Plan[1][17] = 'brac'
set AI_MP_Item_Point[1][16] = 10
set AI_MP_Item_Point[1][17] = 10
//Throne of Emperor
set AI_MP_Item_Plan[1][18] = 'I01F'
set AI_MP_Item_Plan[1][19] = 'bspd'
set AI_MP_Item_Point[1][18] = 20
set AI_MP_Item_Point[1][19] = 20
//Skull Crusher
set AI_MP_Item_Plan[1][20] = 'I00U'
set AI_MP_Item_Point[1][20] = 28
endif
//General ability
if(true) then
set AI_Ability_Type[10][0] = ABILITY_TYPE_MOBILE_OFFENSE
set AI_Ability_Type[10][1] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[10][2] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[10][3] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[10][4] = ABILITY_TYPE_ULTIMATE
set AI_Ability_Order_Type[10][0] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Order_Type[10][1] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Order_Type[10][2] = ACTION_ORDER_TYPE_UNKNOWN
set AI_Ability_Order_Type[10][3] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[10][4] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Level[10][0] = 4
set AI_Ability_Level[10][1] = 3
set AI_Ability_Level[10][2] = 3
set AI_Ability_Level[10][3] = 3
set AI_Ability_Level[10][4] = 2
set AI_Ability_Type_Score[10][0] = 7
set AI_Ability_Type_Score[10][1] = 7
set AI_Ability_Type_Score[10][2] = 10
set AI_Ability_Type_Score[10][3] = 4
set AI_Ability_Type_Score[10][4] = 5
set AI_Ability_ID[10][0] = 'A06F'
set AI_Ability_ID[10][1] = 'AUsl'
set AI_Ability_ID[10][2] = 'A06K'
set AI_Ability_ID[10][3] = 'A06H'
set AI_Ability_ID[10][4] = 'Aroa'
set AI_Ability_Learn_Skip[10][0] = 2
set AI_Ability_Learn_Skip[10][1] = 2
set AI_Ability_Learn_Skip[10][2] = 2
set AI_Ability_Learn_Skip[10][3] = 2
set AI_Ability_Learn_Skip[10][4] = 7
set AI_Ability_Level_Required[10][0] = 0
set AI_Ability_Level_Required[10][1] = 0
set AI_Ability_Level_Required[10][2] = 0
set AI_Ability_Level_Required[10][3] = 0
set AI_Ability_Level_Required[10][4] = 6
set AI_Ability_Order[10][0] = "web"
set AI_Ability_Order[10][1] = "sleep"
set AI_Ability_Order[10][2] = ""
set AI_Ability_Order[10][3] = "weboff"
set AI_Ability_Order[10][4] = "roar"
set AI_Ability_Order_Next[10][0] = ""
set AI_Ability_Order_Next[10][1] = ""
set AI_Ability_Order_Next[10][2] = ""
set AI_Ability_Order_Next[10][3] = ""
set AI_Ability_Order_Next[10][4] = ""
set AI_Ability_Buff[10][0] = 0
set AI_Ability_Buff[10][1] = 0
set AI_Ability_Buff[10][2] = 0
set AI_Ability_Buff[10][3] = 0
set AI_Ability_Buff[10][4] = 0
endif
//Claw Assault
if(true) then
set AI_MP_Ability_Cooldown[0][0] = 19
set AI_MP_Ability_Cooldown[0][1] = 18
set AI_MP_Ability_Cooldown[0][2] = 15
set AI_MP_Ability_Cooldown[0][3] = 10
set AI_MP_Ability_Mana[0][0] = 70
set AI_MP_Ability_Mana[0][1] = 70
set AI_MP_Ability_Mana[0][2] = 70
set AI_MP_Ability_Mana[0][3] = 70
set AI_MP_Ability_Range[0][0] = 900.0
set AI_MP_Ability_Range[0][1] = 1000.0
set AI_MP_Ability_Range[0][2] = 1300.0
set AI_MP_Ability_Range[0][3] = 1500.0
set AI_MP_Ability_Detect_Area[0][0] = 800.0
set AI_MP_Ability_Detect_Area[0][1] = 900.0
set AI_MP_Ability_Detect_Area[0][2] = 1200.0
set AI_MP_Ability_Detect_Area[0][3] = 1400.0
set AI_MP_Ability_Area[0][0] = 300.0
set AI_MP_Ability_Area[0][1] = 300.0
set AI_MP_Ability_Area[0][2] = 300.0
set AI_MP_Ability_Area[0][3] = 300.0
set AI_MP_Ability_Mode[0][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_MP_Ability_Mode[0][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_MP_Ability_Mode[0][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_MP_Ability_Mode[0][3] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_MP_Ability_Perceive[0][0] = 5
set AI_MP_Ability_Perceive[0][1] = 5
set AI_MP_Ability_Perceive[0][2] = 5
set AI_MP_Ability_Perceive[0][3] = 5
endif
//Isolation
if(true) then
set AI_MP_Ability_Cooldown[1][0] = 25
set AI_MP_Ability_Cooldown[1][1] = 22
set AI_MP_Ability_Cooldown[1][2] = 18
set AI_MP_Ability_Cooldown[1][3] = 0
set AI_MP_Ability_Mana[1][0] = 75
set AI_MP_Ability_Mana[1][1] = 75
set AI_MP_Ability_Mana[1][2] = 75
set AI_MP_Ability_Mana[1][3] = 0
set AI_MP_Ability_Range[1][0] = 800.0
set AI_MP_Ability_Range[1][1] = 800.0
set AI_MP_Ability_Range[1][2] = 800.0
set AI_MP_Ability_Range[1][3] = 0.0
set AI_MP_Ability_Detect_Area[1][0] = 700.0
set AI_MP_Ability_Detect_Area[1][1] = 700.0
set AI_MP_Ability_Detect_Area[1][2] = 700.0
set AI_MP_Ability_Detect_Area[1][3] = 0.0
set AI_MP_Ability_Area[1][0] = 0.0
set AI_MP_Ability_Area[1][1] = 0.0
set AI_MP_Ability_Area[1][2] = 0.0
set AI_MP_Ability_Area[1][3] = 0.0
set AI_MP_Ability_Mode[1][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_MP_Ability_Mode[1][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_MP_Ability_Mode[1][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_MP_Ability_Mode[1][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_MP_Ability_Perceive[1][0] = 5
set AI_MP_Ability_Perceive[1][1] = 5
set AI_MP_Ability_Perceive[1][2] = 5
set AI_MP_Ability_Perceive[1][3] = 0
endif
//Immortal
if(true) then
set AI_MP_Ability_Cooldown[2][0] = 0
set AI_MP_Ability_Cooldown[2][1] = 0
set AI_MP_Ability_Cooldown[2][2] = 0
set AI_MP_Ability_Cooldown[2][3] = 0
set AI_MP_Ability_Mana[2][0] = 0
set AI_MP_Ability_Mana[2][1] = 0
set AI_MP_Ability_Mana[2][2] = 0
set AI_MP_Ability_Mana[2][3] = 0
set AI_MP_Ability_Range[2][0] = 0.0
set AI_MP_Ability_Range[2][1] = 0.0
set AI_MP_Ability_Range[2][2] = 0.0
set AI_MP_Ability_Range[2][3] = 0.0
set AI_MP_Ability_Detect_Area[2][0] = 0.0
set AI_MP_Ability_Detect_Area[2][1] = 0.0
set AI_MP_Ability_Detect_Area[2][2] = 0.0
set AI_MP_Ability_Detect_Area[2][3] = 0.0
set AI_MP_Ability_Area[2][0] = 0.0
set AI_MP_Ability_Area[2][1] = 0.0
set AI_MP_Ability_Area[2][2] = 0.0
set AI_MP_Ability_Area[2][3] = 0.0
set AI_MP_Ability_Mode[2][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_MP_Ability_Mode[2][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_MP_Ability_Mode[2][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_MP_Ability_Mode[2][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_MP_Ability_Perceive[2][0] = 0
set AI_MP_Ability_Perceive[2][1] = 0
set AI_MP_Ability_Perceive[2][2] = 0
set AI_MP_Ability_Perceive[2][3] = 0
endif
//Dark Veil
if(true) then
set AI_MP_Ability_Cooldown[3][0] = 16
set AI_MP_Ability_Cooldown[3][1] = 12
set AI_MP_Ability_Cooldown[3][2] = 6
set AI_MP_Ability_Cooldown[3][3] = 0
set AI_MP_Ability_Mana[3][0] = 25
set AI_MP_Ability_Mana[3][1] = 25
set AI_MP_Ability_Mana[3][2] = 25
set AI_MP_Ability_Mana[3][3] = 0
set AI_MP_Ability_Range[3][0] = 700.0
set AI_MP_Ability_Range[3][1] = 700.0
set AI_MP_Ability_Range[3][2] = 700.0
set AI_MP_Ability_Range[3][3] = 0.0
set AI_MP_Ability_Detect_Area[3][0] = 300.0
set AI_MP_Ability_Detect_Area[3][1] = 300.0
set AI_MP_Ability_Detect_Area[3][2] = 300.0
set AI_MP_Ability_Detect_Area[3][3] = 0.0
set AI_MP_Ability_Area[3][0] = 300.0
set AI_MP_Ability_Area[3][1] = 300.0
set AI_MP_Ability_Area[3][2] = 300.0
set AI_MP_Ability_Area[3][3] = 0.0
set AI_MP_Ability_Mode[3][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_MP_Ability_Mode[3][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_MP_Ability_Mode[3][2] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_MP_Ability_Mode[3][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_MP_Ability_Perceive[3][0] = 5
set AI_MP_Ability_Perceive[3][1] = 5
set AI_MP_Ability_Perceive[3][2] = 5
set AI_MP_Ability_Perceive[3][3] = 0
endif
//Finger of Dread
if(true) then
set AI_MP_Ability_Cooldown[4][0] = 5
set AI_MP_Ability_Cooldown[4][1] = 5
set AI_MP_Ability_Cooldown[4][2] = 0
set AI_MP_Ability_Cooldown[4][3] = 0
set AI_MP_Ability_Mana[4][0] = 30
set AI_MP_Ability_Mana[4][1] = 30
set AI_MP_Ability_Mana[4][2] = 0
set AI_MP_Ability_Mana[4][3] = 0
set AI_MP_Ability_Range[4][0] = 0.0
set AI_MP_Ability_Range[4][1] = 0.0
set AI_MP_Ability_Range[4][2] = 0.0
set AI_MP_Ability_Range[4][3] = 0.0
set AI_MP_Ability_Detect_Area[4][0] = 1500.0
set AI_MP_Ability_Detect_Area[4][1] = 1500.0
set AI_MP_Ability_Detect_Area[4][2] = 0.0
set AI_MP_Ability_Detect_Area[4][3] = 0.0
set AI_MP_Ability_Area[4][0] = 0.0
set AI_MP_Ability_Area[4][1] = 0.0
set AI_MP_Ability_Area[4][2] = 0.0
set AI_MP_Ability_Area[4][3] = 0.0
set AI_MP_Ability_Mode[4][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_MP_Ability_Mode[4][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_MP_Ability_Mode[4][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_MP_Ability_Mode[4][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_MP_Ability_Perceive[4][0] = 10
set AI_MP_Ability_Perceive[4][1] = 10
set AI_MP_Ability_Perceive[4][2] = 0
set AI_MP_Ability_Perceive[4][3] = 0
endif
endif
endfunction
endscope
//TESH.scrollpos=154
//TESH.alwaysfold=0
scope AIKnowledgeST initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Swarm Titan
if(true) then
set AI_Life_Zone[11][0] = 50
set AI_Life_Zone[11][1] = 70
set AI_Life_Zone[11][2] = 100
set AI_Mana_Zone[11][0] = 20
set AI_Mana_Zone[11][1] = 50
set AI_Mana_Zone[11][2] = 100
set AI_Attack_Range_Zone[11][0] = 200
set AI_Attack_Range_Zone[11][1] = 200
//Offense attitude
set AI_ST_Item_Total_Plan[0] = 24
if(true) then
//Throne of Emperor
set AI_ST_Item_Plan[0][0] = 'bgst'
set AI_ST_Item_Plan[0][1] = 'bgst'
set AI_ST_Item_Plan[0][2] = 'bgst'
set AI_ST_Item_Plan[0][3] = 'bgst'
set AI_ST_Item_Plan[0][4] = 'rlif'
set AI_ST_Item_Plan[0][5] = 'rlif'
set AI_ST_Item_Plan[0][6] = 'rag1'
set AI_ST_Item_Plan[0][7] = 'shas'
set AI_ST_Item_Plan[0][8] = 'rag1'
set AI_ST_Item_Plan[0][9] = 'shas'
set AI_ST_Item_Point[0][0] = 2
set AI_ST_Item_Point[0][1] = 2
set AI_ST_Item_Point[0][2] = 2
set AI_ST_Item_Point[0][3] = 2
set AI_ST_Item_Point[0][4] = 2
set AI_ST_Item_Point[0][5] = 2
set AI_ST_Item_Point[0][6] = 2
set AI_ST_Item_Point[0][7] = 2
set AI_ST_Item_Point[0][8] = 2
set AI_ST_Item_Point[0][9] = 2
//Sneaker of Exzel
set AI_ST_Item_Plan[0][10] = 'rag1'
set AI_ST_Item_Plan[0][11] = 'shas'
set AI_ST_Item_Plan[0][12] = 'rag1'
set AI_ST_Item_Plan[0][13] = 'shas'
set AI_ST_Item_Plan[0][14] = 'gcel'
set AI_ST_Item_Plan[0][15] = 'sres'
set AI_ST_Item_Point[0][10] = 2
set AI_ST_Item_Point[0][11] = 2
set AI_ST_Item_Point[0][12] = 2
set AI_ST_Item_Point[0][13] = 2
set AI_ST_Item_Point[0][14] = 3
set AI_ST_Item_Point[0][15] = 3
//Power Fragment
set AI_ST_Item_Plan[0][16] = 'penr'
set AI_ST_Item_Plan[0][17] = 'penr'
set AI_ST_Item_Plan[0][18] = 'sman'
set AI_ST_Item_Point[0][16] = 1
set AI_ST_Item_Point[0][17] = 1
set AI_ST_Item_Point[0][18] = 5
//Havocrave Dissever
set AI_ST_Item_Plan[0][19] = 'I00T'
set AI_ST_Item_Plan[0][20] = 'I00T'
set AI_ST_Item_Point[0][19] = 10
set AI_ST_Item_Point[0][20] = 10
//Stormanifer
set AI_ST_Item_Plan[0][21] = 'I01J'
set AI_ST_Item_Plan[0][22] = 'I01J'
set AI_ST_Item_Point[0][21] = 12
set AI_ST_Item_Point[0][22] = 12
//Brutalic
set AI_ST_Item_Plan[0][23] = 'anfg'
set AI_ST_Item_Point[0][23] = 25
endif
//Defense attitude
set AI_ST_Item_Total_Plan[1] = 21
if(true) then
//Throne of Emperor
set AI_ST_Item_Plan[0][0] = 'bgst'
set AI_ST_Item_Plan[0][1] = 'bgst'
set AI_ST_Item_Plan[0][2] = 'bgst'
set AI_ST_Item_Plan[0][3] = 'bgst'
set AI_ST_Item_Plan[0][4] = 'rlif'
set AI_ST_Item_Plan[0][5] = 'rlif'
set AI_ST_Item_Plan[0][6] = 'rag1'
set AI_ST_Item_Plan[0][7] = 'shas'
set AI_ST_Item_Plan[0][8] = 'rag1'
set AI_ST_Item_Plan[0][9] = 'shas'
set AI_ST_Item_Point[0][0] = 2
set AI_ST_Item_Point[0][1] = 2
set AI_ST_Item_Point[0][2] = 2
set AI_ST_Item_Point[0][3] = 2
set AI_ST_Item_Point[0][4] = 2
set AI_ST_Item_Point[0][5] = 2
set AI_ST_Item_Point[0][6] = 2
set AI_ST_Item_Point[0][7] = 2
set AI_ST_Item_Point[0][8] = 2
set AI_ST_Item_Point[0][9] = 2
//Power Fragment
set AI_ST_Item_Plan[1][10] = 'penr'
set AI_ST_Item_Plan[1][11] = 'penr'
set AI_ST_Item_Plan[1][12] = 'sman'
set AI_ST_Item_Point[1][10] = 1
set AI_ST_Item_Point[1][11] = 1
set AI_ST_Item_Point[1][12] = 5
//Brutalic
set AI_ST_Item_Plan[1][13] = 'I00G'
set AI_ST_Item_Plan[1][14] = 'modt'
set AI_ST_Item_Plan[1][15] = 'I01B'
set AI_ST_Item_Point[1][13] = 5
set AI_ST_Item_Point[1][14] = 5
set AI_ST_Item_Point[1][15] = 5
//Wrist of Hercules
set AI_ST_Item_Plan[1][16] = 'brac'
set AI_ST_Item_Plan[1][17] = 'brac'
set AI_ST_Item_Point[1][16] = 10
set AI_ST_Item_Point[1][17] = 10
//Throne of Emperor
set AI_ST_Item_Plan[1][18] = 'I01F'
set AI_ST_Item_Plan[1][19] = 'bspd'
set AI_ST_Item_Point[1][18] = 20
set AI_ST_Item_Point[1][19] = 20
//Skull Crusher
set AI_ST_Item_Plan[1][20] = 'I00U'
set AI_ST_Item_Point[1][20] = 28
endif
//General ability
if(true) then
set AI_Ability_Type[11][0] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[11][1] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[11][2] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[11][3] = ABILITY_TYPE_MOBILE_OFFENSE
set AI_Ability_Type[11][4] = ABILITY_TYPE_ULTIMATE
set AI_Ability_Order_Type[11][0] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[11][1] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[11][2] = ACTION_ORDER_TYPE_UNKNOWN
set AI_Ability_Order_Type[11][3] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[11][4] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Level[11][0] = 4
set AI_Ability_Level[11][1] = 3
set AI_Ability_Level[11][2] = 3
set AI_Ability_Level[11][3] = 3
set AI_Ability_Level[11][4] = 2
set AI_Ability_Type_Score[11][0] = 5
set AI_Ability_Type_Score[11][1] = 2
set AI_Ability_Type_Score[11][2] = 8
set AI_Ability_Type_Score[11][3] = 8
set AI_Ability_Type_Score[11][4] = 10
set AI_Ability_ID[11][0] = 'A06L'
set AI_Ability_ID[11][1] = 'A06N'
set AI_Ability_ID[11][2] = 'A06R'
set AI_Ability_ID[11][3] = 'A06Q'
set AI_Ability_ID[11][4] = 'A06O'
set AI_Ability_Learn_Skip[11][0] = 2
set AI_Ability_Learn_Skip[11][1] = 2
set AI_Ability_Learn_Skip[11][2] = 2
set AI_Ability_Learn_Skip[11][3] = 2
set AI_Ability_Learn_Skip[11][4] = 7
set AI_Ability_Level_Required[11][0] = 0
set AI_Ability_Level_Required[11][1] = 0
set AI_Ability_Level_Required[11][2] = 0
set AI_Ability_Level_Required[11][3] = 0
set AI_Ability_Level_Required[11][4] = 6
set AI_Ability_Order[11][0] = "web"
set AI_Ability_Order[11][1] = "weboff"
set AI_Ability_Order[11][2] = ""
set AI_Ability_Order[11][3] = "windwalk"
set AI_Ability_Order[11][4] = "whirlwind"
set AI_Ability_Order_Next[11][0] = ""
set AI_Ability_Order_Next[11][1] = ""
set AI_Ability_Order_Next[11][2] = ""
set AI_Ability_Order_Next[11][3] = ""
set AI_Ability_Order_Next[11][4] = ""
set AI_Ability_Buff[11][0] = 0
set AI_Ability_Buff[11][1] = 0
set AI_Ability_Buff[11][2] = 0
set AI_Ability_Buff[11][3] = 0
set AI_Ability_Buff[11][4] = 0
endif
//Mass Impale
if(true) then
set AI_ST_Ability_Cooldown[0][0] = 25
set AI_ST_Ability_Cooldown[0][1] = 23
set AI_ST_Ability_Cooldown[0][2] = 19
set AI_ST_Ability_Cooldown[0][3] = 13
set AI_ST_Ability_Mana[0][0] = 80
set AI_ST_Ability_Mana[0][1] = 80
set AI_ST_Ability_Mana[0][2] = 80
set AI_ST_Ability_Mana[0][3] = 80
set AI_ST_Ability_Range[0][0] = 1200.0
set AI_ST_Ability_Range[0][1] = 1200.0
set AI_ST_Ability_Range[0][2] = 1200.0
set AI_ST_Ability_Range[0][3] = 1200.0
set AI_ST_Ability_Detect_Area[0][0] = 1200.0
set AI_ST_Ability_Detect_Area[0][1] = 1200.0
set AI_ST_Ability_Detect_Area[0][2] = 1200.0
set AI_ST_Ability_Detect_Area[0][3] = 1200.0
set AI_ST_Ability_Area[0][0] = 400.0
set AI_ST_Ability_Area[0][1] = 400.0
set AI_ST_Ability_Area[0][2] = 400.0
set AI_ST_Ability_Area[0][3] = 400.0
set AI_ST_Ability_Mode[0][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_ST_Ability_Mode[0][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_ST_Ability_Mode[0][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_ST_Ability_Mode[0][3] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_ST_Ability_Perceive[0][0] = 5
set AI_ST_Ability_Perceive[0][1] = 5
set AI_ST_Ability_Perceive[0][2] = 5
set AI_ST_Ability_Perceive[0][3] = 5
endif
//Spiking Carapace
if(true) then
set AI_ST_Ability_Cooldown[1][0] = 17
set AI_ST_Ability_Cooldown[1][1] = 15
set AI_ST_Ability_Cooldown[1][2] = 12
set AI_ST_Ability_Cooldown[1][3] = 0
set AI_ST_Ability_Mana[1][0] = 50
set AI_ST_Ability_Mana[1][1] = 50
set AI_ST_Ability_Mana[1][2] = 50
set AI_ST_Ability_Mana[1][3] = 0
set AI_ST_Ability_Range[1][0] = 0.0
set AI_ST_Ability_Range[1][1] = 0.0
set AI_ST_Ability_Range[1][2] = 0.0
set AI_ST_Ability_Range[1][3] = 0.0
set AI_ST_Ability_Detect_Area[1][0] = 200.0
set AI_ST_Ability_Detect_Area[1][1] = 200.0
set AI_ST_Ability_Detect_Area[1][2] = 200.0
set AI_ST_Ability_Detect_Area[1][3] = 0.0
set AI_ST_Ability_Area[1][0] = 0.0
set AI_ST_Ability_Area[1][1] = 0.0
set AI_ST_Ability_Area[1][2] = 0.0
set AI_ST_Ability_Area[1][3] = 0.0
set AI_ST_Ability_Mode[1][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_ST_Ability_Mode[1][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_ST_Ability_Mode[1][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_ST_Ability_Mode[1][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_ST_Ability_Perceive[1][0] = 5
set AI_ST_Ability_Perceive[1][1] = 5
set AI_ST_Ability_Perceive[1][2] = 5
set AI_ST_Ability_Perceive[1][3] = 0
endif
//Spawn of Deceased
if(true) then
set AI_ST_Ability_Cooldown[2][0] = 0
set AI_ST_Ability_Cooldown[2][1] = 0
set AI_ST_Ability_Cooldown[2][2] = 0
set AI_ST_Ability_Cooldown[2][3] = 0
set AI_ST_Ability_Mana[2][0] = 0
set AI_ST_Ability_Mana[2][1] = 0
set AI_ST_Ability_Mana[2][2] = 0
set AI_ST_Ability_Mana[2][3] = 0
set AI_ST_Ability_Range[2][0] = 0.0
set AI_ST_Ability_Range[2][1] = 0.0
set AI_ST_Ability_Range[2][2] = 0.0
set AI_ST_Ability_Range[2][3] = 0.0
set AI_ST_Ability_Detect_Area[2][0] = 0.0
set AI_ST_Ability_Detect_Area[2][1] = 0.0
set AI_ST_Ability_Detect_Area[2][2] = 0.0
set AI_ST_Ability_Detect_Area[2][3] = 0.0
set AI_ST_Ability_Area[2][0] = 0.0
set AI_ST_Ability_Area[2][1] = 0.0
set AI_ST_Ability_Area[2][2] = 0.0
set AI_ST_Ability_Area[2][3] = 0.0
set AI_ST_Ability_Mode[2][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_ST_Ability_Mode[2][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_ST_Ability_Mode[2][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_ST_Ability_Mode[2][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_ST_Ability_Perceive[2][0] = 0
set AI_ST_Ability_Perceive[2][1] = 0
set AI_ST_Ability_Perceive[2][2] = 0
set AI_ST_Ability_Perceive[2][3] = 0
endif
//Locusts Attack
if(true) then
set AI_ST_Ability_Cooldown[3][0] = 22
set AI_ST_Ability_Cooldown[3][1] = 20
set AI_ST_Ability_Cooldown[3][2] = 16
set AI_ST_Ability_Cooldown[3][3] = 0
set AI_ST_Ability_Mana[3][0] = 200
set AI_ST_Ability_Mana[3][1] = 180
set AI_ST_Ability_Mana[3][2] = 120
set AI_ST_Ability_Mana[3][3] = 0
set AI_ST_Ability_Range[3][0] = 900.0
set AI_ST_Ability_Range[3][1] = 900.0
set AI_ST_Ability_Range[3][2] = 900.0
set AI_ST_Ability_Range[3][3] = 0.0
set AI_ST_Ability_Detect_Area[3][0] = 800.0
set AI_ST_Ability_Detect_Area[3][1] = 800.0
set AI_ST_Ability_Detect_Area[3][2] = 800.0
set AI_ST_Ability_Detect_Area[3][3] = 0.0
set AI_ST_Ability_Area[3][0] = 500.0
set AI_ST_Ability_Area[3][1] = 500.0
set AI_ST_Ability_Area[3][2] = 500.0
set AI_ST_Ability_Area[3][3] = 0.0
set AI_ST_Ability_Mode[3][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_ST_Ability_Mode[3][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_ST_Ability_Mode[3][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_ST_Ability_Mode[3][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_ST_Ability_Perceive[3][0] = 5
set AI_ST_Ability_Perceive[3][1] = 5
set AI_ST_Ability_Perceive[3][2] = 5
set AI_ST_Ability_Perceive[3][3] = 0
endif
//Ground Breaker
if(true) then
set AI_ST_Ability_Cooldown[4][0] = 90
set AI_ST_Ability_Cooldown[4][1] = 40
set AI_ST_Ability_Cooldown[4][2] = 0
set AI_ST_Ability_Cooldown[4][3] = 0
set AI_ST_Ability_Mana[4][0] = 100
set AI_ST_Ability_Mana[4][1] = 160
set AI_ST_Ability_Mana[4][2] = 0
set AI_ST_Ability_Mana[4][3] = 0
set AI_ST_Ability_Range[4][0] = 2000.0
set AI_ST_Ability_Range[4][1] = 2000.0
set AI_ST_Ability_Range[4][2] = 0.0
set AI_ST_Ability_Range[4][3] = 0.0
set AI_ST_Ability_Detect_Area[4][0] = 1900.0
set AI_ST_Ability_Detect_Area[4][1] = 1900.0
set AI_ST_Ability_Detect_Area[4][2] = 0.0
set AI_ST_Ability_Detect_Area[4][3] = 0.0
set AI_ST_Ability_Area[4][0] = 0.0
set AI_ST_Ability_Area[4][1] = 0.0
set AI_ST_Ability_Area[4][2] = 0.0
set AI_ST_Ability_Area[4][3] = 0.0
set AI_ST_Ability_Mode[4][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_ST_Ability_Mode[4][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_ST_Ability_Mode[4][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_ST_Ability_Mode[4][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_ST_Ability_Perceive[4][0] = 5
set AI_ST_Ability_Perceive[4][1] = 5
set AI_ST_Ability_Perceive[4][2] = 0
set AI_ST_Ability_Perceive[4][3] = 0
endif
endif
endfunction
endscope
//TESH.scrollpos=226
//TESH.alwaysfold=0
scope AIKnowledgeGN initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Guardian of the Nature
if(true) then
set AI_Life_Zone[12][0] = 50
set AI_Life_Zone[12][1] = 70
set AI_Life_Zone[12][2] = 100
set AI_Mana_Zone[12][0] = 20
set AI_Mana_Zone[12][1] = 50
set AI_Mana_Zone[12][2] = 100
set AI_Attack_Range_Zone[12][0] = 200
set AI_Attack_Range_Zone[12][1] = 500
//Offense attitude
set AI_GN_Item_Total_Plan[0] = 17
if(true) then
//Orb of Descent
set AI_GN_Item_Plan[0][0] = 'prvt'
set AI_GN_Item_Plan[0][1] = 'prvt'
set AI_GN_Item_Plan[0][2] = 'shea'
set AI_GN_Item_Point[0][0] = 3
set AI_GN_Item_Point[0][1] = 3
set AI_GN_Item_Point[0][2] = 3
//Bloodeye Lynch
set AI_GN_Item_Plan[0][3] = 'stel'
set AI_GN_Item_Plan[0][4] = 'stel'
set AI_GN_Item_Plan[0][5] = 'stel'
set AI_GN_Item_Plan[0][6] = 'stel'
set AI_GN_Item_Plan[0][7] = 'rej6'
set AI_GN_Item_Point[0][3] = 2
set AI_GN_Item_Point[0][4] = 2
set AI_GN_Item_Point[0][5] = 2
set AI_GN_Item_Point[0][6] = 2
set AI_GN_Item_Point[0][7] = 4
//Jungle Runner
set AI_GN_Item_Plan[0][8] = 'I00K'
set AI_GN_Item_Plan[0][9] = 'I00K'
set AI_GN_Item_Plan[0][10] = 'bspd'
set AI_GN_Item_Point[0][8] = 5
set AI_GN_Item_Point[0][9] = 5
set AI_GN_Item_Point[0][10] = 5
//Havocrave Dissever
set AI_GN_Item_Plan[0][11] = 'rej6'
set AI_GN_Item_Point[0][11] = 10
//Mindseer of Ultimate
set AI_GN_Item_Plan[0][12] = 'I00M'
set AI_GN_Item_Plan[0][13] = 'I00I'
set AI_GN_Item_Point[0][12] = 10
set AI_GN_Item_Point[0][13] = 5
//Sunstalker
set AI_GN_Item_Plan[0][14] = 'I01N'
set AI_GN_Item_Plan[0][15] = 'I01Z'
set AI_GN_Item_Point[0][14] = 20
set AI_GN_Item_Point[0][15] = 15
//Prime Lucent
set AI_GN_Item_Plan[0][16] = 'I009'
set AI_GN_Item_Point[0][16] = 20
endif
//Defense attitude
set AI_GN_Item_Total_Plan[1] = 14
if(true) then
//Orb of Descent
set AI_GN_Item_Plan[1][0] = 'prvt'
set AI_GN_Item_Plan[1][1] = 'prvt'
set AI_GN_Item_Plan[1][2] = 'shea'
set AI_GN_Item_Point[1][0] = 2
set AI_GN_Item_Point[1][1] = 2
set AI_GN_Item_Point[1][2] = 2
//Power Fragment
set AI_GN_Item_Plan[1][3] = 'penr'
set AI_GN_Item_Plan[1][4] = 'penr'
set AI_GN_Item_Plan[1][5] = 'sman'
set AI_GN_Item_Point[1][3] = 1
set AI_GN_Item_Point[1][4] = 1
set AI_GN_Item_Point[1][5] = 5
//Orenda Spectrum
set AI_GN_Item_Plan[1][6] = 'I005'
set AI_GN_Item_Plan[1][7] = 'rde2'
set AI_GN_Item_Plan[1][8] = 'scul'
set AI_GN_Item_Point[1][6] = 5
set AI_GN_Item_Point[1][7] = 2
set AI_GN_Item_Point[1][8] = 5
//Encease Siege
set AI_GN_Item_Plan[1][9] = 'rde2'
set AI_GN_Item_Plan[1][10] = 'rde3'
set AI_GN_Item_Point[1][9] = 10
set AI_GN_Item_Point[1][10] = 10
//Mindseer of Ultimate
set AI_GN_Item_Plan[1][11] = 'I00M'
set AI_GN_Item_Plan[1][12] = 'I00I'
set AI_GN_Item_Point[1][11] = 12
set AI_GN_Item_Point[1][12] = 12
//Prime Lucent
set AI_GN_Item_Plan[1][13] = 'I009'
set AI_GN_Item_Point[1][13] = 30
endif
//General ability
if(true) then
set AI_Ability_Type[12][0] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[12][1] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[12][2] = ABILITY_TYPE_MOBILE
set AI_Ability_Type[12][3] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[12][4] = ABILITY_TYPE_ULTIMATE
set AI_Ability_Order_Type[12][0] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[12][1] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Order_Type[12][2] = ACTION_ORDER_TYPE_UNKNOWN
set AI_Ability_Order_Type[12][3] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[12][4] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Level[12][0] = 4
set AI_Ability_Level[12][1] = 3
set AI_Ability_Level[12][2] = 3
set AI_Ability_Level[12][3] = 3
set AI_Ability_Level[12][4] = 2
set AI_Ability_Type_Score[12][0] = 9
set AI_Ability_Type_Score[12][1] = 8
set AI_Ability_Type_Score[12][2] = 6
set AI_Ability_Type_Score[12][3] = 7
set AI_Ability_Type_Score[12][4] = 5
set AI_Ability_ID[12][0] = 'A06S'
set AI_Ability_ID[12][1] = 'A06T'
set AI_Ability_ID[12][2] = 'A06V'
set AI_Ability_ID[12][3] = 'A06U'
set AI_Ability_ID[12][4] = 'A06W'
set AI_Ability_Learn_Skip[12][0] = 2
set AI_Ability_Learn_Skip[12][1] = 2
set AI_Ability_Learn_Skip[12][2] = 2
set AI_Ability_Learn_Skip[12][3] = 2
set AI_Ability_Learn_Skip[12][4] = 7
set AI_Ability_Level_Required[12][0] = 0
set AI_Ability_Level_Required[12][1] = 0
set AI_Ability_Level_Required[12][2] = 0
set AI_Ability_Level_Required[12][3] = 0
set AI_Ability_Level_Required[12][4] = 6
set AI_Ability_Order[12][0] = "web"
set AI_Ability_Order[12][1] = "wispharvest"
set AI_Ability_Order[12][2] = ""
set AI_Ability_Order[12][3] = "weboff"
set AI_Ability_Order[12][4] = "whirlwind"
set AI_Ability_Order_Next[12][0] = ""
set AI_Ability_Order_Next[12][1] = ""
set AI_Ability_Order_Next[12][2] = ""
set AI_Ability_Order_Next[12][3] = ""
set AI_Ability_Order_Next[12][4] = ""
set AI_Ability_Buff[12][0] = 0
set AI_Ability_Buff[12][1] = 0
set AI_Ability_Buff[12][2] = 0
set AI_Ability_Buff[12][3] = 0
set AI_Ability_Buff[12][4] = 0
endif
//Vines of Root
if(true) then
set AI_GN_Ability_Cooldown[0][0] = 30
set AI_GN_Ability_Cooldown[0][1] = 28
set AI_GN_Ability_Cooldown[0][2] = 24
set AI_GN_Ability_Cooldown[0][3] = 18
set AI_GN_Ability_Mana[0][0] = 120
set AI_GN_Ability_Mana[0][1] = 120
set AI_GN_Ability_Mana[0][2] = 120
set AI_GN_Ability_Mana[0][3] = 120
set AI_GN_Ability_Range[0][0] = 1600.0
set AI_GN_Ability_Range[0][1] = 1600.0
set AI_GN_Ability_Range[0][2] = 1600.0
set AI_GN_Ability_Range[0][3] = 1600.0
set AI_GN_Ability_Detect_Area[0][0] = 1200.0
set AI_GN_Ability_Detect_Area[0][1] = 1200.0
set AI_GN_Ability_Detect_Area[0][2] = 1200.0
set AI_GN_Ability_Detect_Area[0][3] = 1200.0
set AI_GN_Ability_Area[0][0] = 300.0
set AI_GN_Ability_Area[0][1] = 300.0
set AI_GN_Ability_Area[0][2] = 300.0
set AI_GN_Ability_Area[0][3] = 300.0
set AI_GN_Ability_Mode[0][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_GN_Ability_Mode[0][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_GN_Ability_Mode[0][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_GN_Ability_Mode[0][3] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_GN_Ability_Perceive[0][0] = 5
set AI_GN_Ability_Perceive[0][1] = 5
set AI_GN_Ability_Perceive[0][2] = 5
set AI_GN_Ability_Perceive[0][3] = 5
endif
//Pollen Disperse
if(true) then
set AI_GN_Ability_Cooldown[1][0] = 17
set AI_GN_Ability_Cooldown[1][1] = 15
set AI_GN_Ability_Cooldown[1][2] = 12
set AI_GN_Ability_Cooldown[1][3] = 0
set AI_GN_Ability_Mana[1][0] = 50
set AI_GN_Ability_Mana[1][1] = 50
set AI_GN_Ability_Mana[1][2] = 50
set AI_GN_Ability_Mana[1][3] = 0
set AI_GN_Ability_Range[1][0] = 1000.0
set AI_GN_Ability_Range[1][1] = 1000.0
set AI_GN_Ability_Range[1][2] = 1000.0
set AI_GN_Ability_Range[1][3] = 0.0
set AI_GN_Ability_Detect_Area[1][0] = 300.0
set AI_GN_Ability_Detect_Area[1][1] = 300.0
set AI_GN_Ability_Detect_Area[1][2] = 300.0
set AI_GN_Ability_Detect_Area[1][3] = 0.0
set AI_GN_Ability_Area[1][0] = 400.0
set AI_GN_Ability_Area[1][1] = 400.0
set AI_GN_Ability_Area[1][2] = 400.0
set AI_GN_Ability_Area[1][3] = 0.0
set AI_GN_Ability_Mode[1][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_GN_Ability_Mode[1][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_GN_Ability_Mode[1][2] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_GN_Ability_Mode[1][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_GN_Ability_Perceive[1][0] = 5
set AI_GN_Ability_Perceive[1][1] = 5
set AI_GN_Ability_Perceive[1][2] = 5
set AI_GN_Ability_Perceive[1][3] = 0
endif
//Blend in Nature
if(true) then
set AI_GN_Ability_Cooldown[2][0] = 0
set AI_GN_Ability_Cooldown[2][1] = 0
set AI_GN_Ability_Cooldown[2][2] = 0
set AI_GN_Ability_Cooldown[2][3] = 0
set AI_GN_Ability_Mana[2][0] = 0
set AI_GN_Ability_Mana[2][1] = 0
set AI_GN_Ability_Mana[2][2] = 0
set AI_GN_Ability_Mana[2][3] = 0
set AI_GN_Ability_Range[2][0] = 0.0
set AI_GN_Ability_Range[2][1] = 0.0
set AI_GN_Ability_Range[2][2] = 0.0
set AI_GN_Ability_Range[2][3] = 0.0
set AI_GN_Ability_Detect_Area[2][0] = 0.0
set AI_GN_Ability_Detect_Area[2][1] = 0.0
set AI_GN_Ability_Detect_Area[2][2] = 0.0
set AI_GN_Ability_Detect_Area[2][3] = 0.0
set AI_GN_Ability_Area[2][0] = 0.0
set AI_GN_Ability_Area[2][1] = 0.0
set AI_GN_Ability_Area[2][2] = 0.0
set AI_GN_Ability_Area[2][3] = 0.0
set AI_GN_Ability_Mode[2][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_GN_Ability_Mode[2][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_GN_Ability_Mode[2][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_GN_Ability_Mode[2][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_GN_Ability_Perceive[2][0] = 0
set AI_GN_Ability_Perceive[2][1] = 0
set AI_GN_Ability_Perceive[2][2] = 0
set AI_GN_Ability_Perceive[2][3] = 0
endif
//Razor Leaves
if(true) then
set AI_GN_Ability_Cooldown[3][0] = 24
set AI_GN_Ability_Cooldown[3][1] = 20
set AI_GN_Ability_Cooldown[3][2] = 16
set AI_GN_Ability_Cooldown[3][3] = 0
set AI_GN_Ability_Mana[3][0] = 180
set AI_GN_Ability_Mana[3][1] = 180
set AI_GN_Ability_Mana[3][2] = 180
set AI_GN_Ability_Mana[3][3] = 0
set AI_GN_Ability_Range[3][0] = 0.0
set AI_GN_Ability_Range[3][1] = 0.0
set AI_GN_Ability_Range[3][2] = 0.0
set AI_GN_Ability_Range[3][3] = 0.0
set AI_GN_Ability_Detect_Area[3][0] = 500.0
set AI_GN_Ability_Detect_Area[3][1] = 500.0
set AI_GN_Ability_Detect_Area[3][2] = 500.0
set AI_GN_Ability_Detect_Area[3][3] = 0.0
set AI_GN_Ability_Area[3][0] = 600.0
set AI_GN_Ability_Area[3][1] = 600.0
set AI_GN_Ability_Area[3][2] = 600.0
set AI_GN_Ability_Area[3][3] = 0.0
set AI_GN_Ability_Mode[3][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_GN_Ability_Mode[3][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_GN_Ability_Mode[3][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_GN_Ability_Mode[3][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_GN_Ability_Perceive[3][0] = 5
set AI_GN_Ability_Perceive[3][1] = 5
set AI_GN_Ability_Perceive[3][2] = 5
set AI_GN_Ability_Perceive[3][3] = 0
endif
//Forest Arisen
if(true) then
set AI_GN_Ability_Cooldown[4][0] = 110
set AI_GN_Ability_Cooldown[4][1] = 70
set AI_GN_Ability_Cooldown[4][2] = 0
set AI_GN_Ability_Cooldown[4][3] = 0
set AI_GN_Ability_Mana[4][0] = 300
set AI_GN_Ability_Mana[4][1] = 500
set AI_GN_Ability_Mana[4][2] = 0
set AI_GN_Ability_Mana[4][3] = 0
set AI_GN_Ability_Range[4][0] = 9000.0
set AI_GN_Ability_Range[4][1] = 9000.0
set AI_GN_Ability_Range[4][2] = 0.0
set AI_GN_Ability_Range[4][3] = 0.0
set AI_GN_Ability_Detect_Area[4][0] = 1000.0
set AI_GN_Ability_Detect_Area[4][1] = 1000.0
set AI_GN_Ability_Detect_Area[4][2] = 0.0
set AI_GN_Ability_Detect_Area[4][3] = 0.0
set AI_GN_Ability_Area[4][0] = 0.0
set AI_GN_Ability_Area[4][1] = 0.0
set AI_GN_Ability_Area[4][2] = 0.0
set AI_GN_Ability_Area[4][3] = 0.0
set AI_GN_Ability_Mode[4][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_GN_Ability_Mode[4][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_GN_Ability_Mode[4][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_GN_Ability_Mode[4][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_GN_Ability_Perceive[4][0] = 5
set AI_GN_Ability_Perceive[4][1] = 5
set AI_GN_Ability_Perceive[4][2] = 0
set AI_GN_Ability_Perceive[4][3] = 0
endif
endif
endfunction
endscope
//TESH.scrollpos=230
//TESH.alwaysfold=0
scope AIKnowledgeCP initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Celestial Princess
if(true) then
set AI_Life_Zone[13][0] = 50
set AI_Life_Zone[13][1] = 70
set AI_Life_Zone[13][2] = 100
set AI_Mana_Zone[13][0] = 20
set AI_Mana_Zone[13][1] = 50
set AI_Mana_Zone[13][2] = 100
set AI_Attack_Range_Zone[13][0] = 200
set AI_Attack_Range_Zone[13][1] = 500
//Offense attitude
set AI_CP_Item_Total_Plan[0] = 17
if(true) then
//Orb of Descent
set AI_CP_Item_Plan[0][0] = 'prvt'
set AI_CP_Item_Plan[0][1] = 'prvt'
set AI_CP_Item_Plan[0][2] = 'shea'
set AI_CP_Item_Point[0][0] = 3
set AI_CP_Item_Point[0][1] = 3
set AI_CP_Item_Point[0][2] = 3
//Bloodeye Lynch
set AI_CP_Item_Plan[0][3] = 'stel'
set AI_CP_Item_Plan[0][4] = 'stel'
set AI_CP_Item_Plan[0][5] = 'stel'
set AI_CP_Item_Plan[0][6] = 'stel'
set AI_CP_Item_Plan[0][7] = 'rej6'
set AI_CP_Item_Point[0][3] = 2
set AI_CP_Item_Point[0][4] = 2
set AI_CP_Item_Point[0][5] = 2
set AI_CP_Item_Point[0][6] = 2
set AI_CP_Item_Point[0][7] = 4
//Jungle Runner
set AI_CP_Item_Plan[0][8] = 'I00K'
set AI_CP_Item_Plan[0][9] = 'I00K'
set AI_CP_Item_Plan[0][10] = 'bspd'
set AI_CP_Item_Point[0][8] = 5
set AI_CP_Item_Point[0][9] = 5
set AI_CP_Item_Point[0][10] = 5
//Havocrave Dissever
set AI_CP_Item_Plan[0][11] = 'rej6'
set AI_CP_Item_Point[0][11] = 10
//Mindseer of Ultimate
set AI_CP_Item_Plan[0][12] = 'I00M'
set AI_CP_Item_Plan[0][13] = 'I00I'
set AI_CP_Item_Point[0][12] = 10
set AI_CP_Item_Point[0][13] = 5
//Sunstalker
set AI_CP_Item_Plan[0][14] = 'I01N'
set AI_CP_Item_Plan[0][15] = 'I01Z'
set AI_CP_Item_Point[0][14] = 20
set AI_CP_Item_Point[0][15] = 15
//Prime Lucent
set AI_CP_Item_Plan[0][16] = 'I009'
set AI_CP_Item_Point[0][16] = 20
endif
//Defense attitude
set AI_CP_Item_Total_Plan[1] = 14
if(true) then
//Orb of Descent
set AI_CP_Item_Plan[1][0] = 'prvt'
set AI_CP_Item_Plan[1][1] = 'prvt'
set AI_CP_Item_Plan[1][2] = 'shea'
set AI_CP_Item_Point[1][0] = 2
set AI_CP_Item_Point[1][1] = 2
set AI_CP_Item_Point[1][2] = 2
//Power Fragment
set AI_CP_Item_Plan[1][3] = 'penr'
set AI_CP_Item_Plan[1][4] = 'penr'
set AI_CP_Item_Plan[1][5] = 'sman'
set AI_CP_Item_Point[1][3] = 1
set AI_CP_Item_Point[1][4] = 1
set AI_CP_Item_Point[1][5] = 5
//Orenda Spectrum
set AI_CP_Item_Plan[1][6] = 'I005'
set AI_CP_Item_Plan[1][7] = 'rde2'
set AI_CP_Item_Plan[1][8] = 'scul'
set AI_CP_Item_Point[1][6] = 5
set AI_CP_Item_Point[1][7] = 2
set AI_CP_Item_Point[1][8] = 5
//Encease Siege
set AI_CP_Item_Plan[1][9] = 'rde2'
set AI_CP_Item_Plan[1][10] = 'rde3'
set AI_CP_Item_Point[1][9] = 10
set AI_CP_Item_Point[1][10] = 10
//Mindseer of Ultimate
set AI_CP_Item_Plan[1][11] = 'I00M'
set AI_CP_Item_Plan[1][12] = 'I00I'
set AI_CP_Item_Point[1][11] = 12
set AI_CP_Item_Point[1][12] = 12
//Prime Lucent
set AI_CP_Item_Plan[1][13] = 'I009'
set AI_CP_Item_Point[1][13] = 30
endif
//General ability
if(true) then
set AI_Ability_Type[13][0] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[13][1] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[13][2] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[13][3] = ABILITY_TYPE_MOBILE
set AI_Ability_Type[13][4] = ABILITY_TYPE_ULTIMATE
set AI_Ability_Order_Type[13][0] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[13][1] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Order_Type[13][2] = ACTION_ORDER_TYPE_UNKNOWN
set AI_Ability_Order_Type[13][3] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[13][4] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Level[13][0] = 4
set AI_Ability_Level[13][1] = 3
set AI_Ability_Level[13][2] = 3
set AI_Ability_Level[13][3] = 3
set AI_Ability_Level[13][4] = 2
set AI_Ability_Type_Score[13][0] = 10
set AI_Ability_Type_Score[13][1] = 6
set AI_Ability_Type_Score[13][2] = 5
set AI_Ability_Type_Score[13][3] = 6
set AI_Ability_Type_Score[13][4] = 8
set AI_Ability_ID[13][0] = 'A06X'
set AI_Ability_ID[13][1] = 'A06Y'
set AI_Ability_ID[13][2] = 'A072'
set AI_Ability_ID[13][3] = 'A09O'
set AI_Ability_ID[13][4] = 'A071'
set AI_Ability_Learn_Skip[13][0] = 2
set AI_Ability_Learn_Skip[13][1] = 2
set AI_Ability_Learn_Skip[13][2] = 2
set AI_Ability_Learn_Skip[13][3] = 2
set AI_Ability_Learn_Skip[13][4] = 7
set AI_Ability_Level_Required[13][0] = 0
set AI_Ability_Level_Required[13][1] = 0
set AI_Ability_Level_Required[13][2] = 0
set AI_Ability_Level_Required[13][3] = 0
set AI_Ability_Level_Required[13][4] = 6
set AI_Ability_Order[13][0] = "web"
set AI_Ability_Order[13][1] = "wispharvest"
set AI_Ability_Order[13][2] = ""
set AI_Ability_Order[13][3] = "berserk"
set AI_Ability_Order[13][4] = "whirlwind"
set AI_Ability_Order_Next[13][0] = ""
set AI_Ability_Order_Next[13][1] = ""
set AI_Ability_Order_Next[13][2] = ""
set AI_Ability_Order_Next[13][3] = ""
set AI_Ability_Order_Next[13][4] = ""
set AI_Ability_Buff[13][0] = 0
set AI_Ability_Buff[13][1] = 0
set AI_Ability_Buff[13][2] = 0
set AI_Ability_Buff[13][3] = 0
set AI_Ability_Buff[13][4] = 0
endif
//Multishots
if(true) then
set AI_CP_Ability_Cooldown[0][0] = 9
set AI_CP_Ability_Cooldown[0][1] = 9
set AI_CP_Ability_Cooldown[0][2] = 9
set AI_CP_Ability_Cooldown[0][3] = 9
set AI_CP_Ability_Mana[0][0] = 125
set AI_CP_Ability_Mana[0][1] = 150
set AI_CP_Ability_Mana[0][2] = 175
set AI_CP_Ability_Mana[0][3] = 200
set AI_CP_Ability_Range[0][0] = 2000.0
set AI_CP_Ability_Range[0][1] = 2000.0
set AI_CP_Ability_Range[0][2] = 2000.0
set AI_CP_Ability_Range[0][3] = 2000.0
set AI_CP_Ability_Detect_Area[0][0] = 1000.0
set AI_CP_Ability_Detect_Area[0][1] = 1000.0
set AI_CP_Ability_Detect_Area[0][2] = 1000.0
set AI_CP_Ability_Detect_Area[0][3] = 1000.0
set AI_CP_Ability_Area[0][0] = 200.0
set AI_CP_Ability_Area[0][1] = 200.0
set AI_CP_Ability_Area[0][2] = 200.0
set AI_CP_Ability_Area[0][3] = 200.0
set AI_CP_Ability_Mode[0][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_CP_Ability_Mode[0][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_CP_Ability_Mode[0][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_CP_Ability_Mode[0][3] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_CP_Ability_Perceive[0][0] = 5
set AI_CP_Ability_Perceive[0][1] = 5
set AI_CP_Ability_Perceive[0][2] = 5
set AI_CP_Ability_Perceive[0][3] = 5
endif
//Watcher
if(true) then
set AI_CP_Ability_Cooldown[1][0] = 14
set AI_CP_Ability_Cooldown[1][1] = 13
set AI_CP_Ability_Cooldown[1][2] = 11
set AI_CP_Ability_Cooldown[1][3] = 0
set AI_CP_Ability_Mana[1][0] = 80
set AI_CP_Ability_Mana[1][1] = 80
set AI_CP_Ability_Mana[1][2] = 80
set AI_CP_Ability_Mana[1][3] = 0
set AI_CP_Ability_Range[1][0] = 0.0
set AI_CP_Ability_Range[1][1] = 0.0
set AI_CP_Ability_Range[1][2] = 0.0
set AI_CP_Ability_Range[1][3] = 0.0
set AI_CP_Ability_Detect_Area[1][0] = 9000.0
set AI_CP_Ability_Detect_Area[1][1] = 9000.0
set AI_CP_Ability_Detect_Area[1][2] = 9000.0
set AI_CP_Ability_Detect_Area[1][3] = 0.0
set AI_CP_Ability_Area[1][0] = 1500.0
set AI_CP_Ability_Area[1][1] = 1500.0
set AI_CP_Ability_Area[1][2] = 1500.0
set AI_CP_Ability_Area[1][3] = 0.0
set AI_CP_Ability_Mode[1][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_CP_Ability_Mode[1][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_CP_Ability_Mode[1][2] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_CP_Ability_Mode[1][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_CP_Ability_Perceive[1][0] = 5
set AI_CP_Ability_Perceive[1][1] = 5
set AI_CP_Ability_Perceive[1][2] = 5
set AI_CP_Ability_Perceive[1][3] = 0
endif
//Lucent Arrow
if(true) then
set AI_CP_Ability_Cooldown[2][0] = 0
set AI_CP_Ability_Cooldown[2][1] = 0
set AI_CP_Ability_Cooldown[2][2] = 0
set AI_CP_Ability_Cooldown[2][3] = 0
set AI_CP_Ability_Mana[2][0] = 0
set AI_CP_Ability_Mana[2][1] = 0
set AI_CP_Ability_Mana[2][2] = 0
set AI_CP_Ability_Mana[2][3] = 0
set AI_CP_Ability_Range[2][0] = 0.0
set AI_CP_Ability_Range[2][1] = 0.0
set AI_CP_Ability_Range[2][2] = 0.0
set AI_CP_Ability_Range[2][3] = 0.0
set AI_CP_Ability_Detect_Area[2][0] = 0.0
set AI_CP_Ability_Detect_Area[2][1] = 0.0
set AI_CP_Ability_Detect_Area[2][2] = 0.0
set AI_CP_Ability_Detect_Area[2][3] = 0.0
set AI_CP_Ability_Area[2][0] = 0.0
set AI_CP_Ability_Area[2][1] = 0.0
set AI_CP_Ability_Area[2][2] = 0.0
set AI_CP_Ability_Area[2][3] = 0.0
set AI_CP_Ability_Mode[2][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_CP_Ability_Mode[2][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_CP_Ability_Mode[2][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_CP_Ability_Mode[2][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_CP_Ability_Perceive[2][0] = 0
set AI_CP_Ability_Perceive[2][1] = 0
set AI_CP_Ability_Perceive[2][2] = 0
set AI_CP_Ability_Perceive[2][3] = 0
endif
//Tiger Leap
if(true) then
set AI_CP_Ability_Cooldown[3][0] = 20
set AI_CP_Ability_Cooldown[3][1] = 16
set AI_CP_Ability_Cooldown[3][2] = 10
set AI_CP_Ability_Cooldown[3][3] = 0
set AI_CP_Ability_Mana[3][0] = 65
set AI_CP_Ability_Mana[3][1] = 65
set AI_CP_Ability_Mana[3][2] = 65
set AI_CP_Ability_Mana[3][3] = 0
set AI_CP_Ability_Range[3][0] = 0.0
set AI_CP_Ability_Range[3][1] = 0.0
set AI_CP_Ability_Range[3][2] = 0.0
set AI_CP_Ability_Range[3][3] = 0.0
set AI_CP_Ability_Detect_Area[3][0] = 0.0
set AI_CP_Ability_Detect_Area[3][1] = 0.0
set AI_CP_Ability_Detect_Area[3][2] = 0.0
set AI_CP_Ability_Detect_Area[3][3] = 0.0
set AI_CP_Ability_Area[3][0] = 0.0
set AI_CP_Ability_Area[3][1] = 0.0
set AI_CP_Ability_Area[3][2] = 0.0
set AI_CP_Ability_Area[3][3] = 0.0
set AI_CP_Ability_Mode[3][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_CP_Ability_Mode[3][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_CP_Ability_Mode[3][2] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_CP_Ability_Mode[3][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_CP_Ability_Perceive[3][0] = 5
set AI_CP_Ability_Perceive[3][1] = 5
set AI_CP_Ability_Perceive[3][2] = 5
set AI_CP_Ability_Perceive[3][3] = 0
endif
//Heaven's Twilight
if(true) then
set AI_CP_Ability_Cooldown[4][0] = 80
set AI_CP_Ability_Cooldown[4][1] = 50
set AI_CP_Ability_Cooldown[4][2] = 0
set AI_CP_Ability_Cooldown[4][3] = 0
set AI_CP_Ability_Mana[4][0] = 200
set AI_CP_Ability_Mana[4][1] = 300
set AI_CP_Ability_Mana[4][2] = 0
set AI_CP_Ability_Mana[4][3] = 0
set AI_CP_Ability_Range[4][0] = 0.0
set AI_CP_Ability_Range[4][1] = 0.0
set AI_CP_Ability_Range[4][2] = 0.0
set AI_CP_Ability_Range[4][3] = 0.0
set AI_CP_Ability_Detect_Area[4][0] = 500.0
set AI_CP_Ability_Detect_Area[4][1] = 500.0
set AI_CP_Ability_Detect_Area[4][2] = 0.0
set AI_CP_Ability_Detect_Area[4][3] = 0.0
set AI_CP_Ability_Area[4][0] = 1000.0
set AI_CP_Ability_Area[4][1] = 1000.0
set AI_CP_Ability_Area[4][2] = 0.0
set AI_CP_Ability_Area[4][3] = 0.0
set AI_CP_Ability_Mode[4][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_CP_Ability_Mode[4][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_CP_Ability_Mode[4][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_CP_Ability_Mode[4][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_CP_Ability_Perceive[4][0] = 5
set AI_CP_Ability_Perceive[4][1] = 5
set AI_CP_Ability_Perceive[4][2] = 0
set AI_CP_Ability_Perceive[4][3] = 0
endif
endif
endfunction
endscope
//TESH.scrollpos=283
//TESH.alwaysfold=0
scope AIKnowledgeDH initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Demon-half
if(true) then
set AI_Life_Zone[14][0] = 50
set AI_Life_Zone[14][1] = 70
set AI_Life_Zone[14][2] = 100
set AI_Mana_Zone[14][0] = 20
set AI_Mana_Zone[14][1] = 50
set AI_Mana_Zone[14][2] = 100
set AI_Attack_Range_Zone[14][0] = 200
set AI_Attack_Range_Zone[14][1] = 200
//Offense attitude
set AI_DH_Item_Total_Plan[0] = 20
if(true) then
//Arcanite Reaver
set AI_DH_Item_Plan[0][0] = 'rat6'
set AI_DH_Item_Plan[0][1] = 'stwp'
set AI_DH_Item_Plan[0][2] = 'prvt'
set AI_DH_Item_Plan[0][3] = 'rat6'
set AI_DH_Item_Plan[0][4] = 'stwp'
set AI_DH_Item_Plan[0][5] = 'prvt'
set AI_DH_Item_Point[0][0] = 1
set AI_DH_Item_Point[0][1] = 1
set AI_DH_Item_Point[0][2] = 1
set AI_DH_Item_Point[0][3] = 3
set AI_DH_Item_Point[0][4] = 3
set AI_DH_Item_Point[0][5] = 3
//Scourge Visor
set AI_DH_Item_Plan[0][6] = 'bgst'
set AI_DH_Item_Plan[0][7] = 'srrc'
set AI_DH_Item_Point[0][6] = 3
set AI_DH_Item_Point[0][7] = 3
//Fist of Firebringer
set AI_DH_Item_Plan[0][8] = 'gcel'
set AI_DH_Item_Plan[0][9] = 'rlif'
set AI_DH_Item_Plan[0][10] = 'gcel'
set AI_DH_Item_Plan[0][11] = 'rlif'
set AI_DH_Item_Point[0][8] = 2
set AI_DH_Item_Point[0][9] = 2
set AI_DH_Item_Point[0][10] = 3
set AI_DH_Item_Point[0][11] = 3
//Power Fragment
set AI_DH_Item_Plan[0][12] = 'pmna'
set AI_DH_Item_Plan[0][13] = 'sman'
set AI_DH_Item_Point[0][12] = 20
set AI_DH_Item_Point[0][13] = 20
//Amazon Meld
set AI_DH_Item_Plan[0][14] = 'I00R'
set AI_DH_Item_Plan[0][15] = 'I00R'
set AI_DH_Item_Plan[0][16] = 'I00P'
set AI_DH_Item_Point[0][14] = 5
set AI_DH_Item_Point[0][15] = 5
set AI_DH_Item_Point[0][16] = 8
//Brutalic
set AI_DH_Item_Plan[0][17] = 'I00G'
set AI_DH_Item_Plan[0][18] = 'I01B'
set AI_DH_Item_Point[0][17] = 16
set AI_DH_Item_Point[0][18] = 5
//Sneaker of Exzel
set AI_DH_Item_Plan[0][19] = 'I01T'
set AI_DH_Item_Point[0][19] = 20
endif
//Defense attitude (need to change)
set AI_DH_Item_Total_Plan[1] = 16
if(true) then
//Orb of Descent
set AI_DH_Item_Plan[1][0] = 'prvt'
set AI_DH_Item_Plan[1][1] = 'prvt'
set AI_DH_Item_Plan[1][2] = 'shea'
set AI_DH_Item_Point[1][0] = 2
set AI_DH_Item_Point[1][1] = 2
set AI_DH_Item_Point[1][2] = 2
//Power Fragment
set AI_DH_Item_Plan[1][3] = 'penr'
set AI_DH_Item_Plan[1][4] = 'penr'
set AI_DH_Item_Plan[1][5] = 'sman'
set AI_DH_Item_Point[1][3] = 1
set AI_DH_Item_Point[1][4] = 1
set AI_DH_Item_Point[1][5] = 5
//Sneaker of Exzel
set AI_DH_Item_Plan[1][6] = 'I00K'
set AI_DH_Item_Plan[1][7] = 'I00K'
set AI_DH_Item_Plan[1][8] = 'gcel'
set AI_DH_Item_Plan[1][9] = 'sres'
set AI_DH_Item_Point[1][6] = 5
set AI_DH_Item_Point[1][7] = 5
set AI_DH_Item_Point[1][8] = 5
set AI_DH_Item_Point[1][9] = 5
//Brutalic
set AI_DH_Item_Plan[1][10] = 'modt'
set AI_DH_Item_Plan[1][11] = 'I01B'
set AI_DH_Item_Plan[1][12] = 'I00G'
set AI_DH_Item_Point[1][10] = 5
set AI_DH_Item_Point[1][11] = 5
set AI_DH_Item_Point[1][12] = 5
//Mindseer of Ultimate
set AI_DH_Item_Plan[1][13] = 'I00M'
set AI_DH_Item_Plan[1][14] = 'I00I'
set AI_DH_Item_Point[1][13] = 12
set AI_DH_Item_Point[1][14] = 12
//Amazon Meld
set AI_DH_Item_Plan[1][15] = 'I002'
set AI_DH_Item_Point[1][15] = 30
endif
//General ability
if(true) then
set AI_Ability_Type[14][0] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[14][1] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[14][2] = ABILITY_TYPE_MOBILE_OFFENSE
set AI_Ability_Type[14][3] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[14][4] = ABILITY_TYPE_ULTIMATE
set AI_Ability_Order_Type[14][0] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[14][1] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[14][2] = ACTION_ORDER_TYPE_UNKNOWN
set AI_Ability_Order_Type[14][3] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[14][4] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Level[14][0] = 4
set AI_Ability_Level[14][1] = 3
set AI_Ability_Level[14][2] = 3
set AI_Ability_Level[14][3] = 3
set AI_Ability_Level[14][4] = 2
set AI_Ability_Type_Score[14][0] = 4
set AI_Ability_Type_Score[14][1] = 4
set AI_Ability_Type_Score[14][2] = 10
set AI_Ability_Type_Score[14][3] = 9
set AI_Ability_Type_Score[14][4] = 8
set AI_Ability_ID[14][0] = 'A075'
set AI_Ability_ID[14][1] = 'A076'
set AI_Ability_ID[14][2] = 'A077'
set AI_Ability_ID[14][3] = 'A078'
set AI_Ability_ID[14][4] = 'A079'
set AI_Ability_Learn_Skip[14][0] = 2
set AI_Ability_Learn_Skip[14][1] = 2
set AI_Ability_Learn_Skip[14][2] = 2
set AI_Ability_Learn_Skip[14][3] = 2
set AI_Ability_Learn_Skip[14][4] = 7
set AI_Ability_Level_Required[14][0] = 0
set AI_Ability_Level_Required[14][1] = 0
set AI_Ability_Level_Required[14][2] = 0
set AI_Ability_Level_Required[14][3] = 0
set AI_Ability_Level_Required[14][4] = 6
set AI_Ability_Order[14][0] = "web"
set AI_Ability_Order[14][1] = "wispharvest"
set AI_Ability_Order[14][2] = "move"
set AI_Ability_Order[14][3] = "weboff"
set AI_Ability_Order[14][4] = "whirlwind"
set AI_Ability_Order_Next[14][0] = ""
set AI_Ability_Order_Next[14][1] = ""
set AI_Ability_Order_Next[14][2] = ""
set AI_Ability_Order_Next[14][3] = ""
set AI_Ability_Order_Next[14][4] = ""
set AI_Ability_Buff[14][0] = 0
set AI_Ability_Buff[14][1] = 0
set AI_Ability_Buff[14][2] = 0
set AI_Ability_Buff[14][3] = 0
set AI_Ability_Buff[14][4] = 0
endif
//Vorpal Slash
if(true) then
set AI_DH_Ability_Cooldown[0][0] = 20
set AI_DH_Ability_Cooldown[0][1] = 17
set AI_DH_Ability_Cooldown[0][2] = 14
set AI_DH_Ability_Cooldown[0][3] = 11
set AI_DH_Ability_Mana[0][0] = 125
set AI_DH_Ability_Mana[0][1] = 125
set AI_DH_Ability_Mana[0][2] = 125
set AI_DH_Ability_Mana[0][3] = 125
set AI_DH_Ability_Range[0][0] = 1000.0
set AI_DH_Ability_Range[0][1] = 1500.0
set AI_DH_Ability_Range[0][2] = 2000.0
set AI_DH_Ability_Range[0][3] = 2500.0
set AI_DH_Ability_Detect_Area[0][0] = 1000.0
set AI_DH_Ability_Detect_Area[0][1] = 1500.0
set AI_DH_Ability_Detect_Area[0][2] = 2000.0
set AI_DH_Ability_Detect_Area[0][3] = 2500.0
set AI_DH_Ability_Area[0][0] = 0.0
set AI_DH_Ability_Area[0][1] = 0.0
set AI_DH_Ability_Area[0][2] = 0.0
set AI_DH_Ability_Area[0][3] = 0.0
set AI_DH_Ability_Mode[0][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DH_Ability_Mode[0][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DH_Ability_Mode[0][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DH_Ability_Mode[0][3] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DH_Ability_Perceive[0][0] = 15
set AI_DH_Ability_Perceive[0][1] = 15
set AI_DH_Ability_Perceive[0][2] = 15
set AI_DH_Ability_Perceive[0][3] = 15
endif
//Swift Blade
if(true) then
set AI_DH_Ability_Cooldown[1][0] = 6
set AI_DH_Ability_Cooldown[1][1] = 5
set AI_DH_Ability_Cooldown[1][2] = 3
set AI_DH_Ability_Cooldown[1][3] = 0
set AI_DH_Ability_Mana[1][0] = 30
set AI_DH_Ability_Mana[1][1] = 30
set AI_DH_Ability_Mana[1][2] = 30
set AI_DH_Ability_Mana[1][3] = 0
set AI_DH_Ability_Range[1][0] = 0.0
set AI_DH_Ability_Range[1][1] = 0.0
set AI_DH_Ability_Range[1][2] = 0.0
set AI_DH_Ability_Range[1][3] = 0.0
set AI_DH_Ability_Detect_Area[1][0] = 300.0
set AI_DH_Ability_Detect_Area[1][1] = 300.0
set AI_DH_Ability_Detect_Area[1][2] = 300.0
set AI_DH_Ability_Detect_Area[1][3] = 0.0
set AI_DH_Ability_Area[1][0] = 0.0
set AI_DH_Ability_Area[1][1] = 0.0
set AI_DH_Ability_Area[1][2] = 0.0
set AI_DH_Ability_Area[1][3] = 0.0
set AI_DH_Ability_Mode[1][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DH_Ability_Mode[1][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DH_Ability_Mode[1][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DH_Ability_Mode[1][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DH_Ability_Perceive[1][0] = 5
set AI_DH_Ability_Perceive[1][1] = 5
set AI_DH_Ability_Perceive[1][2] = 5
set AI_DH_Ability_Perceive[1][3] = 0
endif
//Infinite Cross
if(true) then
set AI_DH_Ability_Cooldown[2][0] = 10
set AI_DH_Ability_Cooldown[2][1] = 10
set AI_DH_Ability_Cooldown[2][2] = 10
set AI_DH_Ability_Cooldown[2][3] = 10
set AI_DH_Ability_Mana[2][0] = 0
set AI_DH_Ability_Mana[2][1] = 0
set AI_DH_Ability_Mana[2][2] = 0
set AI_DH_Ability_Mana[2][3] = 0
set AI_DH_Ability_Range[2][0] = 0.0
set AI_DH_Ability_Range[2][1] = 0.0
set AI_DH_Ability_Range[2][2] = 0.0
set AI_DH_Ability_Range[2][3] = 0.0
set AI_DH_Ability_Detect_Area[2][0] = 2000.0
set AI_DH_Ability_Detect_Area[2][1] = 2000.0
set AI_DH_Ability_Detect_Area[2][2] = 2000.0
set AI_DH_Ability_Detect_Area[2][3] = 2000.0
set AI_DH_Ability_Area[2][0] = 0.0
set AI_DH_Ability_Area[2][1] = 0.0
set AI_DH_Ability_Area[2][2] = 0.0
set AI_DH_Ability_Area[2][3] = 0.0
set AI_DH_Ability_Mode[2][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DH_Ability_Mode[2][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DH_Ability_Mode[2][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DH_Ability_Mode[2][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DH_Ability_Perceive[2][0] = 5
set AI_DH_Ability_Perceive[2][1] = 5
set AI_DH_Ability_Perceive[2][2] = 0
set AI_DH_Ability_Perceive[2][3] = 0
endif
//Void Impulse
if(true) then
set AI_DH_Ability_Cooldown[3][0] = 30
set AI_DH_Ability_Cooldown[3][1] = 26
set AI_DH_Ability_Cooldown[3][2] = 20
set AI_DH_Ability_Cooldown[3][3] = 0
set AI_DH_Ability_Mana[3][0] = 100
set AI_DH_Ability_Mana[3][1] = 100
set AI_DH_Ability_Mana[3][2] = 100
set AI_DH_Ability_Mana[3][3] = 0
set AI_DH_Ability_Range[3][0] = 0.0
set AI_DH_Ability_Range[3][1] = 0.0
set AI_DH_Ability_Range[3][2] = 0.0
set AI_DH_Ability_Range[3][3] = 0.0
set AI_DH_Ability_Detect_Area[3][0] = 200.0
set AI_DH_Ability_Detect_Area[3][1] = 300.0
set AI_DH_Ability_Detect_Area[3][2] = 400.0
set AI_DH_Ability_Detect_Area[3][3] = 0.0
set AI_DH_Ability_Area[3][0] = 300.0
set AI_DH_Ability_Area[3][1] = 400.0
set AI_DH_Ability_Area[3][2] = 500.0
set AI_DH_Ability_Area[3][3] = 0.0
set AI_DH_Ability_Mode[3][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DH_Ability_Mode[3][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DH_Ability_Mode[3][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DH_Ability_Mode[3][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DH_Ability_Perceive[3][0] = 5
set AI_DH_Ability_Perceive[3][1] = 5
set AI_DH_Ability_Perceive[3][2] = 5
set AI_DH_Ability_Perceive[3][3] = 0
endif
//Vengeance
if(true) then
set AI_DH_Ability_Cooldown[4][0] = 70
set AI_DH_Ability_Cooldown[4][1] = 50
set AI_DH_Ability_Cooldown[4][2] = 0
set AI_DH_Ability_Cooldown[4][3] = 0
set AI_DH_Ability_Mana[4][0] = 200
set AI_DH_Ability_Mana[4][1] = 200
set AI_DH_Ability_Mana[4][2] = 0
set AI_DH_Ability_Mana[4][3] = 0
set AI_DH_Ability_Range[4][0] = 0.0
set AI_DH_Ability_Range[4][1] = 0.0
set AI_DH_Ability_Range[4][2] = 0.0
set AI_DH_Ability_Range[4][3] = 0.0
set AI_DH_Ability_Detect_Area[4][0] = 1000.0
set AI_DH_Ability_Detect_Area[4][1] = 1000.0
set AI_DH_Ability_Detect_Area[4][2] = 0.0
set AI_DH_Ability_Detect_Area[4][3] = 0.0
set AI_DH_Ability_Area[4][0] = 1000.0
set AI_DH_Ability_Area[4][1] = 1000.0
set AI_DH_Ability_Area[4][2] = 0.0
set AI_DH_Ability_Area[4][3] = 0.0
set AI_DH_Ability_Mode[4][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DH_Ability_Mode[4][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DH_Ability_Mode[4][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DH_Ability_Mode[4][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DH_Ability_Perceive[4][0] = 15
set AI_DH_Ability_Perceive[4][1] = 15
set AI_DH_Ability_Perceive[4][2] = 0
set AI_DH_Ability_Perceive[4][3] = 0
endif
endif
endfunction
endscope
//TESH.scrollpos=309
//TESH.alwaysfold=0
scope AIKnowledgeSA initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Shadow Assassin
if(true) then
set AI_Life_Zone[15][0] = 50
set AI_Life_Zone[15][1] = 70
set AI_Life_Zone[15][2] = 100
set AI_Mana_Zone[15][0] = 20
set AI_Mana_Zone[15][1] = 50
set AI_Mana_Zone[15][2] = 100
set AI_Attack_Range_Zone[15][0] = 200
set AI_Attack_Range_Zone[15][1] = 200
//Offense attitude
set AI_SA_Item_Total_Plan[0] = 20
if(true) then
//Arcanite Reaver
set AI_SA_Item_Plan[0][0] = 'rat6'
set AI_SA_Item_Plan[0][1] = 'stwp'
set AI_SA_Item_Plan[0][2] = 'prvt'
set AI_SA_Item_Plan[0][3] = 'rat6'
set AI_SA_Item_Plan[0][4] = 'stwp'
set AI_SA_Item_Plan[0][5] = 'prvt'
set AI_SA_Item_Point[0][0] = 1
set AI_SA_Item_Point[0][1] = 1
set AI_SA_Item_Point[0][2] = 1
set AI_SA_Item_Point[0][3] = 3
set AI_SA_Item_Point[0][4] = 3
set AI_SA_Item_Point[0][5] = 3
//Scourge Visor
set AI_SA_Item_Plan[0][6] = 'bgst'
set AI_SA_Item_Plan[0][7] = 'srrc'
set AI_SA_Item_Point[0][6] = 3
set AI_SA_Item_Point[0][7] = 3
//Fist of Firebringer
set AI_SA_Item_Plan[0][8] = 'gcel'
set AI_SA_Item_Plan[0][9] = 'rlif'
set AI_SA_Item_Plan[0][10] = 'gcel'
set AI_SA_Item_Plan[0][11] = 'rlif'
set AI_SA_Item_Point[0][8] = 2
set AI_SA_Item_Point[0][9] = 2
set AI_SA_Item_Point[0][10] = 3
set AI_SA_Item_Point[0][11] = 3
//Power Fragment
set AI_SA_Item_Plan[0][12] = 'pmna'
set AI_SA_Item_Plan[0][13] = 'sman'
set AI_SA_Item_Point[0][12] = 20
set AI_SA_Item_Point[0][13] = 20
//Amazon Meld
set AI_SA_Item_Plan[0][14] = 'I00R'
set AI_SA_Item_Plan[0][15] = 'I00R'
set AI_SA_Item_Plan[0][16] = 'I00P'
set AI_SA_Item_Point[0][14] = 5
set AI_SA_Item_Point[0][15] = 5
set AI_SA_Item_Point[0][16] = 8
//Brutalic
set AI_SA_Item_Plan[0][17] = 'I00G'
set AI_SA_Item_Plan[0][18] = 'I01B'
set AI_SA_Item_Point[0][17] = 16
set AI_SA_Item_Point[0][18] = 5
//Sneaker of Exzel
set AI_SA_Item_Plan[0][19] = 'I01T'
set AI_SA_Item_Point[0][19] = 20
endif
//Defense attitude (need to change)
set AI_SA_Item_Total_Plan[1] = 16
if(true) then
//Orb of Descent
set AI_SA_Item_Plan[1][0] = 'prvt'
set AI_SA_Item_Plan[1][1] = 'prvt'
set AI_SA_Item_Plan[1][2] = 'shea'
set AI_SA_Item_Point[1][0] = 2
set AI_SA_Item_Point[1][1] = 2
set AI_SA_Item_Point[1][2] = 2
//Power Fragment
set AI_SA_Item_Plan[1][3] = 'penr'
set AI_SA_Item_Plan[1][4] = 'penr'
set AI_SA_Item_Plan[1][5] = 'sman'
set AI_SA_Item_Point[1][3] = 1
set AI_SA_Item_Point[1][4] = 1
set AI_SA_Item_Point[1][5] = 5
//Sneaker of Exzel
set AI_SA_Item_Plan[1][6] = 'I00K'
set AI_SA_Item_Plan[1][7] = 'I00K'
set AI_SA_Item_Plan[1][8] = 'gcel'
set AI_SA_Item_Plan[1][9] = 'sres'
set AI_SA_Item_Point[1][6] = 5
set AI_SA_Item_Point[1][7] = 5
set AI_SA_Item_Point[1][8] = 5
set AI_SA_Item_Point[1][9] = 5
//Brutalic
set AI_SA_Item_Plan[1][10] = 'modt'
set AI_SA_Item_Plan[1][11] = 'I01B'
set AI_SA_Item_Plan[1][12] = 'I00G'
set AI_SA_Item_Point[1][10] = 5
set AI_SA_Item_Point[1][11] = 5
set AI_SA_Item_Point[1][12] = 5
//Mindseer of Ultimate
set AI_SA_Item_Plan[1][13] = 'I00M'
set AI_SA_Item_Plan[1][14] = 'I00I'
set AI_SA_Item_Point[1][13] = 12
set AI_SA_Item_Point[1][14] = 12
//Amazon Meld
set AI_SA_Item_Plan[1][15] = 'I002'
set AI_SA_Item_Point[1][15] = 30
endif
//General ability
if(true) then
set AI_Ability_Type[15][0] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[15][1] = ABILITY_TYPE_MOBILE
set AI_Ability_Type[15][2] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[15][3] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[15][4] = ABILITY_TYPE_ULTIMATE
set AI_Ability_Order_Type[15][0] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[15][1] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[15][2] = ACTION_ORDER_TYPE_UNKNOWN
set AI_Ability_Order_Type[15][3] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[15][4] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Level[15][0] = 4
set AI_Ability_Level[15][1] = 3
set AI_Ability_Level[15][2] = 3
set AI_Ability_Level[15][3] = 3
set AI_Ability_Level[15][4] = 2
set AI_Ability_Type_Score[15][0] = 8
set AI_Ability_Type_Score[15][1] = 9
set AI_Ability_Type_Score[15][2] = 6
set AI_Ability_Type_Score[15][3] = 3
set AI_Ability_Type_Score[15][4] = 8
set AI_Ability_ID[15][0] = 'A07D'
set AI_Ability_ID[15][1] = 'AEbl'
set AI_Ability_ID[15][2] = 'A07H'
set AI_Ability_ID[15][3] = 'A07F'
set AI_Ability_ID[15][4] = 'A07I'
set AI_Ability_Learn_Skip[15][0] = 2
set AI_Ability_Learn_Skip[15][1] = 2
set AI_Ability_Learn_Skip[15][2] = 2
set AI_Ability_Learn_Skip[15][3] = 2
set AI_Ability_Learn_Skip[15][4] = 7
set AI_Ability_Level_Required[15][0] = 0
set AI_Ability_Level_Required[15][1] = 0
set AI_Ability_Level_Required[15][2] = 0
set AI_Ability_Level_Required[15][3] = 0
set AI_Ability_Level_Required[15][4] = 6
set AI_Ability_Order[15][0] = "web"
set AI_Ability_Order[15][1] = "blink"
set AI_Ability_Order[15][2] = ""
set AI_Ability_Order[15][3] = "wispharvest"
set AI_Ability_Order[15][4] = "whirlwind"
set AI_Ability_Order_Next[15][0] = ""
set AI_Ability_Order_Next[15][1] = ""
set AI_Ability_Order_Next[15][2] = ""
set AI_Ability_Order_Next[15][3] = ""
set AI_Ability_Order_Next[15][4] = ""
set AI_Ability_Buff[15][0] = 0
set AI_Ability_Buff[15][1] = 0
set AI_Ability_Buff[15][2] = 0
set AI_Ability_Buff[15][3] = 0
set AI_Ability_Buff[15][4] = 0
endif
//Phantom Knives
if(true) then
set AI_SA_Ability_Cooldown[0][0] = 22
set AI_SA_Ability_Cooldown[0][1] = 20
set AI_SA_Ability_Cooldown[0][2] = 18
set AI_SA_Ability_Cooldown[0][3] = 16
set AI_SA_Ability_Mana[0][0] = 80
set AI_SA_Ability_Mana[0][1] = 80
set AI_SA_Ability_Mana[0][2] = 80
set AI_SA_Ability_Mana[0][3] = 80
set AI_SA_Ability_Range[0][0] = 1000.0
set AI_SA_Ability_Range[0][1] = 1000.0
set AI_SA_Ability_Range[0][2] = 1000.0
set AI_SA_Ability_Range[0][3] = 1000.0
set AI_SA_Ability_Detect_Area[0][0] = 600.0
set AI_SA_Ability_Detect_Area[0][1] = 500.0
set AI_SA_Ability_Detect_Area[0][2] = 400.0
set AI_SA_Ability_Detect_Area[0][3] = 300.0
set AI_SA_Ability_Area[0][0] = 0.0
set AI_SA_Ability_Area[0][1] = 0.0
set AI_SA_Ability_Area[0][2] = 0.0
set AI_SA_Ability_Area[0][3] = 0.0
set AI_SA_Ability_Mode[0][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SA_Ability_Mode[0][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SA_Ability_Mode[0][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SA_Ability_Mode[0][3] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SA_Ability_Perceive[0][0] = 10
set AI_SA_Ability_Perceive[0][1] = 10
set AI_SA_Ability_Perceive[0][2] = 10
set AI_SA_Ability_Perceive[0][3] = 10
endif
//Blink Return
if(true) then
set AI_SA_Ability_Cooldown[1][0] = 10
set AI_SA_Ability_Cooldown[1][1] = 8
set AI_SA_Ability_Cooldown[1][2] = 5
set AI_SA_Ability_Cooldown[1][3] = 0
set AI_SA_Ability_Mana[1][0] = 50
set AI_SA_Ability_Mana[1][1] = 40
set AI_SA_Ability_Mana[1][2] = 30
set AI_SA_Ability_Mana[1][3] = 0
set AI_SA_Ability_Range[1][0] = 800.0
set AI_SA_Ability_Range[1][1] = 1000.0
set AI_SA_Ability_Range[1][2] = 1400.0
set AI_SA_Ability_Range[1][3] = 0.0
set AI_SA_Ability_Detect_Area[1][0] = 800.0
set AI_SA_Ability_Detect_Area[1][1] = 1000.0
set AI_SA_Ability_Detect_Area[1][2] = 1400.0
set AI_SA_Ability_Detect_Area[1][3] = 0.0
set AI_SA_Ability_Area[1][0] = 0.0
set AI_SA_Ability_Area[1][1] = 0.0
set AI_SA_Ability_Area[1][2] = 0.0
set AI_SA_Ability_Area[1][3] = 0.0
set AI_SA_Ability_Mode[1][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_SA_Ability_Mode[1][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_SA_Ability_Mode[1][2] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_SA_Ability_Mode[1][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SA_Ability_Perceive[1][0] = 5
set AI_SA_Ability_Perceive[1][1] = 5
set AI_SA_Ability_Perceive[1][2] = 5
set AI_SA_Ability_Perceive[1][3] = 0
endif
//Shadow Stab
if(true) then
set AI_SA_Ability_Cooldown[2][0] = 0
set AI_SA_Ability_Cooldown[2][1] = 0
set AI_SA_Ability_Cooldown[2][2] = 0
set AI_SA_Ability_Cooldown[2][3] = 0
set AI_SA_Ability_Mana[2][0] = 0
set AI_SA_Ability_Mana[2][1] = 0
set AI_SA_Ability_Mana[2][2] = 0
set AI_SA_Ability_Mana[2][3] = 0
set AI_SA_Ability_Range[2][0] = 0.0
set AI_SA_Ability_Range[2][1] = 0.0
set AI_SA_Ability_Range[2][2] = 0.0
set AI_SA_Ability_Range[2][3] = 0.0
set AI_SA_Ability_Detect_Area[2][0] = 0.0
set AI_SA_Ability_Detect_Area[2][1] = 0.0
set AI_SA_Ability_Detect_Area[2][2] = 0.0
set AI_SA_Ability_Detect_Area[2][3] = 0.0
set AI_SA_Ability_Area[2][0] = 0.0
set AI_SA_Ability_Area[2][1] = 0.0
set AI_SA_Ability_Area[2][2] = 0.0
set AI_SA_Ability_Area[2][3] = 0.0
set AI_SA_Ability_Mode[2][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SA_Ability_Mode[2][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SA_Ability_Mode[2][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SA_Ability_Mode[2][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SA_Ability_Perceive[2][0] = 0
set AI_SA_Ability_Perceive[2][1] = 0
set AI_SA_Ability_Perceive[2][2] = 0
set AI_SA_Ability_Perceive[2][3] = 0
endif
//Poison Glaive
if(true) then
set AI_SA_Ability_Cooldown[3][0] = 11
set AI_SA_Ability_Cooldown[3][1] = 9
set AI_SA_Ability_Cooldown[3][2] = 6
set AI_SA_Ability_Cooldown[3][3] = 0
set AI_SA_Ability_Mana[3][0] = 60
set AI_SA_Ability_Mana[3][1] = 60
set AI_SA_Ability_Mana[3][2] = 60
set AI_SA_Ability_Mana[3][3] = 0
set AI_SA_Ability_Range[3][0] = 0.0
set AI_SA_Ability_Range[3][1] = 0.0
set AI_SA_Ability_Range[3][2] = 0.0
set AI_SA_Ability_Range[3][3] = 0.0
set AI_SA_Ability_Detect_Area[3][0] = 2000.0
set AI_SA_Ability_Detect_Area[3][1] = 2000.0
set AI_SA_Ability_Detect_Area[3][2] = 2000.0
set AI_SA_Ability_Detect_Area[3][3] = 0.0
set AI_SA_Ability_Area[3][0] = 0.0
set AI_SA_Ability_Area[3][1] = 0.0
set AI_SA_Ability_Area[3][2] = 0.0
set AI_SA_Ability_Area[3][3] = 0.0
set AI_SA_Ability_Mode[3][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SA_Ability_Mode[3][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SA_Ability_Mode[3][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SA_Ability_Mode[3][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SA_Ability_Perceive[3][0] = 5
set AI_SA_Ability_Perceive[3][1] = 5
set AI_SA_Ability_Perceive[3][2] = 5
set AI_SA_Ability_Perceive[3][3] = 0
endif
//Shade Shift
if(true) then
set AI_SA_Ability_Cooldown[4][0] = 40
set AI_SA_Ability_Cooldown[4][1] = 25
set AI_SA_Ability_Cooldown[4][2] = 0
set AI_SA_Ability_Cooldown[4][3] = 0
set AI_SA_Ability_Mana[4][0] = 100
set AI_SA_Ability_Mana[4][1] = 100
set AI_SA_Ability_Mana[4][2] = 0
set AI_SA_Ability_Mana[4][3] = 0
set AI_SA_Ability_Range[4][0] = 0.0
set AI_SA_Ability_Range[4][1] = 0.0
set AI_SA_Ability_Range[4][2] = 0.0
set AI_SA_Ability_Range[4][3] = 0.0
set AI_SA_Ability_Detect_Area[4][0] = 500.0
set AI_SA_Ability_Detect_Area[4][1] = 500.0
set AI_SA_Ability_Detect_Area[4][2] = 0.0
set AI_SA_Ability_Detect_Area[4][3] = 0.0
set AI_SA_Ability_Area[4][0] = 0.0
set AI_SA_Ability_Area[4][1] = 0.0
set AI_SA_Ability_Area[4][2] = 0.0
set AI_SA_Ability_Area[4][3] = 0.0
set AI_SA_Ability_Mode[4][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SA_Ability_Mode[4][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SA_Ability_Mode[4][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SA_Ability_Mode[4][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SA_Ability_Perceive[4][0] = 10
set AI_SA_Ability_Perceive[4][1] = 10
set AI_SA_Ability_Perceive[4][2] = 0
set AI_SA_Ability_Perceive[4][3] = 0
endif
endif
endfunction
endscope
//TESH.scrollpos=213
//TESH.alwaysfold=0
scope AIKnowledgeDA initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Damned Amok
if(true) then
set AI_Life_Zone[16][0] = 50
set AI_Life_Zone[16][1] = 70
set AI_Life_Zone[16][2] = 100
set AI_Mana_Zone[16][0] = 20
set AI_Mana_Zone[16][1] = 50
set AI_Mana_Zone[16][2] = 100
set AI_Attack_Range_Zone[16][0] = 200
set AI_Attack_Range_Zone[16][1] = 200
//Offense attitude
set AI_DA_Item_Total_Plan[0] = 24
if(true) then
//Throne of Emperor
set AI_DA_Item_Plan[0][0] = 'bgst'
set AI_DA_Item_Plan[0][1] = 'bgst'
set AI_DA_Item_Plan[0][2] = 'bgst'
set AI_DA_Item_Plan[0][3] = 'bgst'
set AI_DA_Item_Plan[0][4] = 'rlif'
set AI_DA_Item_Plan[0][5] = 'rlif'
set AI_DA_Item_Plan[0][6] = 'rag1'
set AI_DA_Item_Plan[0][7] = 'shas'
set AI_DA_Item_Plan[0][8] = 'rag1'
set AI_DA_Item_Plan[0][9] = 'shas'
set AI_DA_Item_Point[0][0] = 2
set AI_DA_Item_Point[0][1] = 2
set AI_DA_Item_Point[0][2] = 2
set AI_DA_Item_Point[0][3] = 2
set AI_DA_Item_Point[0][4] = 2
set AI_DA_Item_Point[0][5] = 2
set AI_DA_Item_Point[0][6] = 2
set AI_DA_Item_Point[0][7] = 2
set AI_DA_Item_Point[0][8] = 2
set AI_DA_Item_Point[0][9] = 2
//Sneaker of Exzel
set AI_DA_Item_Plan[0][10] = 'rag1'
set AI_DA_Item_Plan[0][11] = 'shas'
set AI_DA_Item_Plan[0][12] = 'rag1'
set AI_DA_Item_Plan[0][13] = 'shas'
set AI_DA_Item_Plan[0][14] = 'gcel'
set AI_DA_Item_Plan[0][15] = 'sres'
set AI_DA_Item_Point[0][10] = 2
set AI_DA_Item_Point[0][11] = 2
set AI_DA_Item_Point[0][12] = 2
set AI_DA_Item_Point[0][13] = 2
set AI_DA_Item_Point[0][14] = 3
set AI_DA_Item_Point[0][15] = 3
//Power Fragment
set AI_DA_Item_Plan[0][16] = 'penr'
set AI_DA_Item_Plan[0][17] = 'penr'
set AI_DA_Item_Plan[0][18] = 'sman'
set AI_DA_Item_Point[0][16] = 1
set AI_DA_Item_Point[0][17] = 1
set AI_DA_Item_Point[0][18] = 5
//Havocrave Dissever
set AI_DA_Item_Plan[0][19] = 'I00T'
set AI_DA_Item_Plan[0][20] = 'I00T'
set AI_DA_Item_Point[0][19] = 10
set AI_DA_Item_Point[0][20] = 10
//Stormanifer
set AI_DA_Item_Plan[0][21] = 'I01J'
set AI_DA_Item_Plan[0][22] = 'I01J'
set AI_DA_Item_Point[0][21] = 12
set AI_DA_Item_Point[0][22] = 12
//Brutalic
set AI_DA_Item_Plan[0][23] = 'anfg'
set AI_DA_Item_Point[0][23] = 25
endif
//Defense attitude
set AI_DA_Item_Total_Plan[1] = 21
if(true) then
//Throne of Emperor
set AI_DA_Item_Plan[0][0] = 'bgst'
set AI_DA_Item_Plan[0][1] = 'bgst'
set AI_DA_Item_Plan[0][2] = 'bgst'
set AI_DA_Item_Plan[0][3] = 'bgst'
set AI_DA_Item_Plan[0][4] = 'rlif'
set AI_DA_Item_Plan[0][5] = 'rlif'
set AI_DA_Item_Plan[0][6] = 'rag1'
set AI_DA_Item_Plan[0][7] = 'shas'
set AI_DA_Item_Plan[0][8] = 'rag1'
set AI_DA_Item_Plan[0][9] = 'shas'
set AI_DA_Item_Point[0][0] = 2
set AI_DA_Item_Point[0][1] = 2
set AI_DA_Item_Point[0][2] = 2
set AI_DA_Item_Point[0][3] = 2
set AI_DA_Item_Point[0][4] = 2
set AI_DA_Item_Point[0][5] = 2
set AI_DA_Item_Point[0][6] = 2
set AI_DA_Item_Point[0][7] = 2
set AI_DA_Item_Point[0][8] = 2
set AI_DA_Item_Point[0][9] = 2
//Power Fragment
set AI_DA_Item_Plan[1][10] = 'penr'
set AI_DA_Item_Plan[1][11] = 'penr'
set AI_DA_Item_Plan[1][12] = 'sman'
set AI_DA_Item_Point[1][10] = 1
set AI_DA_Item_Point[1][11] = 1
set AI_DA_Item_Point[1][12] = 5
//Brutalic
set AI_DA_Item_Plan[1][13] = 'I00G'
set AI_DA_Item_Plan[1][14] = 'modt'
set AI_DA_Item_Plan[1][15] = 'I01B'
set AI_DA_Item_Point[1][13] = 5
set AI_DA_Item_Point[1][14] = 5
set AI_DA_Item_Point[1][15] = 5
//Wrist of Hercules
set AI_DA_Item_Plan[1][16] = 'brac'
set AI_DA_Item_Plan[1][17] = 'brac'
set AI_DA_Item_Point[1][16] = 10
set AI_DA_Item_Point[1][17] = 10
//Throne of Emperor
set AI_DA_Item_Plan[1][18] = 'I01F'
set AI_DA_Item_Plan[1][19] = 'bspd'
set AI_DA_Item_Point[1][18] = 20
set AI_DA_Item_Point[1][19] = 20
//Skull Crusher
set AI_DA_Item_Plan[1][20] = 'I00U'
set AI_DA_Item_Point[1][20] = 28
endif
//General ability
if(true) then
set AI_Ability_Type[16][0] = ABILITY_TYPE_MOBILE_OFFENSE
set AI_Ability_Type[16][1] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[16][2] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[16][3] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[16][4] = ABILITY_TYPE_ULTIMATE
set AI_Ability_Order_Type[16][0] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[16][1] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[16][2] = ACTION_ORDER_TYPE_UNKNOWN
set AI_Ability_Order_Type[16][3] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[16][4] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Level[16][0] = 4
set AI_Ability_Level[16][1] = 3
set AI_Ability_Level[16][2] = 3
set AI_Ability_Level[16][3] = 3
set AI_Ability_Level[16][4] = 2
set AI_Ability_Type_Score[16][0] = 9
set AI_Ability_Type_Score[16][1] = 8
set AI_Ability_Type_Score[16][2] = 7
set AI_Ability_Type_Score[16][3] = 7
set AI_Ability_Type_Score[16][4] = 8
set AI_Ability_ID[16][0] = 'A0A0'
set AI_Ability_ID[16][1] = 'A085'
set AI_Ability_ID[16][2] = 'A082'
set AI_Ability_ID[16][3] = 'AEme'
set AI_Ability_ID[16][4] = 'A083'
set AI_Ability_Learn_Skip[16][0] = 2
set AI_Ability_Learn_Skip[16][1] = 2
set AI_Ability_Learn_Skip[16][2] = 2
set AI_Ability_Learn_Skip[16][3] = 2
set AI_Ability_Learn_Skip[16][4] = 7
set AI_Ability_Level_Required[16][0] = 0
set AI_Ability_Level_Required[16][1] = 0
set AI_Ability_Level_Required[16][2] = 0
set AI_Ability_Level_Required[16][3] = 0
set AI_Ability_Level_Required[16][4] = 6
set AI_Ability_Order[16][0] = "web"
set AI_Ability_Order[16][1] = "weboff"
set AI_Ability_Order[16][2] = ""
set AI_Ability_Order[16][3] = ""
set AI_Ability_Order[16][4] = "whirlwind"
set AI_Ability_Order_Next[16][0] = ""
set AI_Ability_Order_Next[16][1] = ""
set AI_Ability_Order_Next[16][2] = ""
set AI_Ability_Order_Next[16][3] = ""
set AI_Ability_Order_Next[16][4] = ""
set AI_Ability_Buff[16][0] = 0
set AI_Ability_Buff[16][1] = 0
set AI_Ability_Buff[16][2] = 0
set AI_Ability_Buff[16][3] = 0
set AI_Ability_Buff[16][4] = 0
endif
//Berserk
if(true) then
set AI_DA_Ability_Cooldown[0][0] = 1
set AI_DA_Ability_Cooldown[0][1] = 1
set AI_DA_Ability_Cooldown[0][2] = 1
set AI_DA_Ability_Cooldown[0][3] = 1
set AI_DA_Ability_Mana[0][0] = 50
set AI_DA_Ability_Mana[0][1] = 60
set AI_DA_Ability_Mana[0][2] = 70
set AI_DA_Ability_Mana[0][3] = 80
set AI_DA_Ability_Range[0][0] = 600.0
set AI_DA_Ability_Range[0][1] = 600.0
set AI_DA_Ability_Range[0][2] = 600.0
set AI_DA_Ability_Range[0][3] = 600.0
set AI_DA_Ability_Detect_Area[0][0] = 600.0
set AI_DA_Ability_Detect_Area[0][1] = 600.0
set AI_DA_Ability_Detect_Area[0][2] = 600.0
set AI_DA_Ability_Detect_Area[0][3] = 600.0
set AI_DA_Ability_Area[0][0] = 300.0
set AI_DA_Ability_Area[0][1] = 300.0
set AI_DA_Ability_Area[0][2] = 300.0
set AI_DA_Ability_Area[0][3] = 300.0
set AI_DA_Ability_Mode[0][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DA_Ability_Mode[0][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DA_Ability_Mode[0][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DA_Ability_Mode[0][3] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DA_Ability_Perceive[0][0] = 5
set AI_DA_Ability_Perceive[0][1] = 5
set AI_DA_Ability_Perceive[0][2] = 5
set AI_DA_Ability_Perceive[0][3] = 5
endif
//Madness
if(true) then
set AI_DA_Ability_Cooldown[1][0] = 28
set AI_DA_Ability_Cooldown[1][1] = 25
set AI_DA_Ability_Cooldown[1][2] = 20
set AI_DA_Ability_Cooldown[1][3] = 0
set AI_DA_Ability_Mana[1][0] = 50
set AI_DA_Ability_Mana[1][1] = 50
set AI_DA_Ability_Mana[1][2] = 50
set AI_DA_Ability_Mana[1][3] = 0
set AI_DA_Ability_Range[1][0] = 600.0
set AI_DA_Ability_Range[1][1] = 600.0
set AI_DA_Ability_Range[1][2] = 600.0
set AI_DA_Ability_Range[1][3] = 0.0
set AI_DA_Ability_Detect_Area[1][0] = 300.0
set AI_DA_Ability_Detect_Area[1][1] = 300.0
set AI_DA_Ability_Detect_Area[1][2] = 300.0
set AI_DA_Ability_Detect_Area[1][3] = 0.0
set AI_DA_Ability_Area[1][0] = 0.0
set AI_DA_Ability_Area[1][1] = 0.0
set AI_DA_Ability_Area[1][2] = 0.0
set AI_DA_Ability_Area[1][3] = 0.0
set AI_DA_Ability_Mode[1][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_DA_Ability_Mode[1][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_DA_Ability_Mode[1][2] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_DA_Ability_Mode[1][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DA_Ability_Perceive[1][0] = 5
set AI_DA_Ability_Perceive[1][1] = 5
set AI_DA_Ability_Perceive[1][2] = 5
set AI_DA_Ability_Perceive[1][3] = 0
endif
//Enrage
if(true) then
set AI_DA_Ability_Cooldown[2][0] = 0
set AI_DA_Ability_Cooldown[2][1] = 0
set AI_DA_Ability_Cooldown[2][2] = 0
set AI_DA_Ability_Cooldown[2][3] = 0
set AI_DA_Ability_Mana[2][0] = 0
set AI_DA_Ability_Mana[2][1] = 0
set AI_DA_Ability_Mana[2][2] = 0
set AI_DA_Ability_Mana[2][3] = 0
set AI_DA_Ability_Range[2][0] = 0.0
set AI_DA_Ability_Range[2][1] = 0.0
set AI_DA_Ability_Range[2][2] = 0.0
set AI_DA_Ability_Range[2][3] = 0.0
set AI_DA_Ability_Detect_Area[2][0] = 0.0
set AI_DA_Ability_Detect_Area[2][1] = 0.0
set AI_DA_Ability_Detect_Area[2][2] = 0.0
set AI_DA_Ability_Detect_Area[2][3] = 0.0
set AI_DA_Ability_Area[2][0] = 0.0
set AI_DA_Ability_Area[2][1] = 0.0
set AI_DA_Ability_Area[2][2] = 0.0
set AI_DA_Ability_Area[2][3] = 0.0
set AI_DA_Ability_Mode[2][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DA_Ability_Mode[2][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DA_Ability_Mode[2][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DA_Ability_Mode[2][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DA_Ability_Perceive[2][0] = 0
set AI_DA_Ability_Perceive[2][1] = 0
set AI_DA_Ability_Perceive[2][2] = 0
set AI_DA_Ability_Perceive[2][3] = 0
endif
//Infernal
if(true) then
set AI_DA_Ability_Cooldown[3][0] = 0
set AI_DA_Ability_Cooldown[3][1] = 0
set AI_DA_Ability_Cooldown[3][2] = 0
set AI_DA_Ability_Cooldown[3][3] = 0
set AI_DA_Ability_Mana[3][0] = 0
set AI_DA_Ability_Mana[3][1] = 0
set AI_DA_Ability_Mana[3][2] = 0
set AI_DA_Ability_Mana[3][3] = 0
set AI_DA_Ability_Range[3][0] = 0.0
set AI_DA_Ability_Range[3][1] = 0.0
set AI_DA_Ability_Range[3][2] = 0.0
set AI_DA_Ability_Range[3][3] = 0.0
set AI_DA_Ability_Detect_Area[3][0] = 0.0
set AI_DA_Ability_Detect_Area[3][1] = 0.0
set AI_DA_Ability_Detect_Area[3][2] = 0.0
set AI_DA_Ability_Detect_Area[3][3] = 0.0
set AI_DA_Ability_Area[3][0] = 0.0
set AI_DA_Ability_Area[3][1] = 0.0
set AI_DA_Ability_Area[3][2] = 0.0
set AI_DA_Ability_Area[3][3] = 0.0
set AI_DA_Ability_Mode[3][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DA_Ability_Mode[3][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DA_Ability_Mode[3][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DA_Ability_Mode[3][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DA_Ability_Perceive[3][0] = 0
set AI_DA_Ability_Perceive[3][1] = 0
set AI_DA_Ability_Perceive[3][2] = 0
set AI_DA_Ability_Perceive[3][3] = 0
endif
//Overkill
if(true) then
set AI_DA_Ability_Cooldown[4][0] = 40
set AI_DA_Ability_Cooldown[4][1] = 20
set AI_DA_Ability_Cooldown[4][2] = 0
set AI_DA_Ability_Cooldown[4][3] = 0
set AI_DA_Ability_Mana[4][0] = 200
set AI_DA_Ability_Mana[4][1] = 200
set AI_DA_Ability_Mana[4][2] = 0
set AI_DA_Ability_Mana[4][3] = 0
set AI_DA_Ability_Range[4][0] = 800.0
set AI_DA_Ability_Range[4][1] = 800.0
set AI_DA_Ability_Range[4][2] = 0.0
set AI_DA_Ability_Range[4][3] = 0.0
set AI_DA_Ability_Detect_Area[4][0] = 1000.0
set AI_DA_Ability_Detect_Area[4][1] = 1000.0
set AI_DA_Ability_Detect_Area[4][2] = 0.0
set AI_DA_Ability_Detect_Area[4][3] = 0.0
set AI_DA_Ability_Area[4][0] = 400.0
set AI_DA_Ability_Area[4][1] = 600.0
set AI_DA_Ability_Area[4][2] = 0.0
set AI_DA_Ability_Area[4][3] = 0.0
set AI_DA_Ability_Mode[4][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DA_Ability_Mode[4][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_DA_Ability_Mode[4][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DA_Ability_Mode[4][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_DA_Ability_Perceive[4][0] = 10
set AI_DA_Ability_Perceive[4][1] = 10
set AI_DA_Ability_Perceive[4][2] = 0
set AI_DA_Ability_Perceive[4][3] = 0
endif
endif
endfunction
endscope
//TESH.scrollpos=167
//TESH.alwaysfold=0
scope AIKnowledgeLR initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Lone Ranger
if(true) then
set AI_Life_Zone[17][0] = 50
set AI_Life_Zone[17][1] = 70
set AI_Life_Zone[17][2] = 100
set AI_Mana_Zone[17][0] = 20
set AI_Mana_Zone[17][1] = 50
set AI_Mana_Zone[17][2] = 100
set AI_Attack_Range_Zone[17][0] = 200
set AI_Attack_Range_Zone[17][1] = 400
//Offense attitude
set AI_LR_Item_Total_Plan[0] = 20
if(true) then
//Arcanite Reaver
set AI_LR_Item_Plan[0][0] = 'rat6'
set AI_LR_Item_Plan[0][1] = 'stwp'
set AI_LR_Item_Plan[0][2] = 'prvt'
set AI_LR_Item_Plan[0][3] = 'rat6'
set AI_LR_Item_Plan[0][4] = 'stwp'
set AI_LR_Item_Plan[0][5] = 'prvt'
set AI_LR_Item_Point[0][0] = 1
set AI_LR_Item_Point[0][1] = 1
set AI_LR_Item_Point[0][2] = 1
set AI_LR_Item_Point[0][3] = 3
set AI_LR_Item_Point[0][4] = 3
set AI_LR_Item_Point[0][5] = 3
//Scourge Visor
set AI_LR_Item_Plan[0][6] = 'bgst'
set AI_LR_Item_Plan[0][7] = 'srrc'
set AI_LR_Item_Point[0][6] = 3
set AI_LR_Item_Point[0][7] = 3
//Fist of Firebringer
set AI_LR_Item_Plan[0][8] = 'gcel'
set AI_LR_Item_Plan[0][9] = 'rlif'
set AI_LR_Item_Plan[0][10] = 'gcel'
set AI_LR_Item_Plan[0][11] = 'rlif'
set AI_LR_Item_Point[0][8] = 2
set AI_LR_Item_Point[0][9] = 2
set AI_LR_Item_Point[0][10] = 3
set AI_LR_Item_Point[0][11] = 3
//Power Fragment
set AI_LR_Item_Plan[0][12] = 'pmna'
set AI_LR_Item_Plan[0][13] = 'sman'
set AI_LR_Item_Point[0][12] = 20
set AI_LR_Item_Point[0][13] = 20
//Amazon Meld
set AI_LR_Item_Plan[0][14] = 'I00R'
set AI_LR_Item_Plan[0][15] = 'I00R'
set AI_LR_Item_Plan[0][16] = 'I00P'
set AI_LR_Item_Point[0][14] = 5
set AI_LR_Item_Point[0][15] = 5
set AI_LR_Item_Point[0][16] = 8
//Brutalic
set AI_LR_Item_Plan[0][17] = 'I00G'
set AI_LR_Item_Plan[0][18] = 'I01B'
set AI_LR_Item_Point[0][17] = 16
set AI_LR_Item_Point[0][18] = 5
//Sneaker of Exzel
set AI_LR_Item_Plan[0][19] = 'I01T'
set AI_LR_Item_Point[0][19] = 20
endif
//Defense attitude (need to change)
set AI_LR_Item_Total_Plan[1] = 16
if(true) then
//Orb of Descent
set AI_LR_Item_Plan[1][0] = 'prvt'
set AI_LR_Item_Plan[1][1] = 'prvt'
set AI_LR_Item_Plan[1][2] = 'shea'
set AI_LR_Item_Point[1][0] = 2
set AI_LR_Item_Point[1][1] = 2
set AI_LR_Item_Point[1][2] = 2
//Power Fragment
set AI_LR_Item_Plan[1][3] = 'penr'
set AI_LR_Item_Plan[1][4] = 'penr'
set AI_LR_Item_Plan[1][5] = 'sman'
set AI_LR_Item_Point[1][3] = 1
set AI_LR_Item_Point[1][4] = 1
set AI_LR_Item_Point[1][5] = 5
//Sneaker of Exzel
set AI_LR_Item_Plan[1][6] = 'I00K'
set AI_LR_Item_Plan[1][7] = 'I00K'
set AI_LR_Item_Plan[1][8] = 'gcel'
set AI_LR_Item_Plan[1][9] = 'sres'
set AI_LR_Item_Point[1][6] = 5
set AI_LR_Item_Point[1][7] = 5
set AI_LR_Item_Point[1][8] = 5
set AI_LR_Item_Point[1][9] = 5
//Brutalic
set AI_LR_Item_Plan[1][10] = 'modt'
set AI_LR_Item_Plan[1][11] = 'I01B'
set AI_LR_Item_Plan[1][12] = 'I00G'
set AI_LR_Item_Point[1][10] = 5
set AI_LR_Item_Point[1][11] = 5
set AI_LR_Item_Point[1][12] = 5
//Mindseer of Ultimate
set AI_LR_Item_Plan[1][13] = 'I00M'
set AI_LR_Item_Plan[1][14] = 'I00I'
set AI_LR_Item_Point[1][13] = 12
set AI_LR_Item_Point[1][14] = 12
//Amazon Meld
set AI_LR_Item_Plan[1][15] = 'I002'
set AI_LR_Item_Point[1][15] = 30
endif
//General ability
if(true) then
set AI_Ability_Type[17][0] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[17][1] = ABILITY_TYPE_MOBILE
set AI_Ability_Type[17][2] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[17][3] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[17][4] = ABILITY_TYPE_ULTIMATE
set AI_Ability_Order_Type[17][0] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[17][1] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[17][2] = ACTION_ORDER_TYPE_UNKNOWN
set AI_Ability_Order_Type[17][3] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[17][4] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Level[17][0] = 4
set AI_Ability_Level[17][1] = 3
set AI_Ability_Level[17][2] = 3
set AI_Ability_Level[17][3] = 3
set AI_Ability_Level[17][4] = 2
set AI_Ability_Type_Score[17][0] = 10
set AI_Ability_Type_Score[17][1] = 8
set AI_Ability_Type_Score[17][2] = 5
set AI_Ability_Type_Score[17][3] = 3
set AI_Ability_Type_Score[17][4] = 5
set AI_Ability_ID[17][0] = 'A086'
set AI_Ability_ID[17][1] = 'A087'
set AI_Ability_ID[17][2] = 'A08A'
set AI_Ability_ID[17][3] = 'AUcs'
set AI_Ability_ID[17][4] = 'A088'
set AI_Ability_Learn_Skip[17][0] = 2
set AI_Ability_Learn_Skip[17][1] = 2
set AI_Ability_Learn_Skip[17][2] = 2
set AI_Ability_Learn_Skip[17][3] = 2
set AI_Ability_Learn_Skip[17][4] = 7
set AI_Ability_Level_Required[17][0] = 0
set AI_Ability_Level_Required[17][1] = 0
set AI_Ability_Level_Required[17][2] = 0
set AI_Ability_Level_Required[17][3] = 0
set AI_Ability_Level_Required[17][4] = 6
set AI_Ability_Order[17][0] = "web"
set AI_Ability_Order[17][1] = "windwalk"
set AI_Ability_Order[17][2] = ""
set AI_Ability_Order[17][3] = "carrionswarm"
set AI_Ability_Order[17][4] = "whirlwind"
set AI_Ability_Order_Next[17][0] = ""
set AI_Ability_Order_Next[17][1] = ""
set AI_Ability_Order_Next[17][2] = ""
set AI_Ability_Order_Next[17][3] = ""
set AI_Ability_Order_Next[17][4] = ""
set AI_Ability_Buff[17][0] = 0
set AI_Ability_Buff[17][1] = 0
set AI_Ability_Buff[17][2] = 0
set AI_Ability_Buff[17][3] = 0
set AI_Ability_Buff[17][4] = 0
endif
//Sky Volley
if(true) then
set AI_LR_Ability_Cooldown[0][0] = 17
set AI_LR_Ability_Cooldown[0][1] = 16
set AI_LR_Ability_Cooldown[0][2] = 14
set AI_LR_Ability_Cooldown[0][3] = 11
set AI_LR_Ability_Mana[0][0] = 120
set AI_LR_Ability_Mana[0][1] = 120
set AI_LR_Ability_Mana[0][2] = 120
set AI_LR_Ability_Mana[0][3] = 120
set AI_LR_Ability_Range[0][0] = 9000.0
set AI_LR_Ability_Range[0][1] = 9000.0
set AI_LR_Ability_Range[0][2] = 9000.0
set AI_LR_Ability_Range[0][3] = 9000.0
set AI_LR_Ability_Detect_Area[0][0] = 9000.0
set AI_LR_Ability_Detect_Area[0][1] = 9000.0
set AI_LR_Ability_Detect_Area[0][2] = 9000.0
set AI_LR_Ability_Detect_Area[0][3] = 9000.0
set AI_LR_Ability_Area[0][0] = 300.0
set AI_LR_Ability_Area[0][1] = 300.0
set AI_LR_Ability_Area[0][2] = 300.0
set AI_LR_Ability_Area[0][3] = 300.0
set AI_LR_Ability_Mode[0][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_LR_Ability_Mode[0][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_LR_Ability_Mode[0][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_LR_Ability_Mode[0][3] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_LR_Ability_Perceive[0][0] = 15
set AI_LR_Ability_Perceive[0][1] = 15
set AI_LR_Ability_Perceive[0][2] = 15
set AI_LR_Ability_Perceive[0][3] = 15
endif
//Stride
if(true) then
set AI_LR_Ability_Cooldown[1][0] = 10
set AI_LR_Ability_Cooldown[1][1] = 8
set AI_LR_Ability_Cooldown[1][2] = 5
set AI_LR_Ability_Cooldown[1][3] = 0
set AI_LR_Ability_Mana[1][0] = 40
set AI_LR_Ability_Mana[1][1] = 40
set AI_LR_Ability_Mana[1][2] = 40
set AI_LR_Ability_Mana[1][3] = 0
set AI_LR_Ability_Range[1][0] = 800.0
set AI_LR_Ability_Range[1][1] = 800.0
set AI_LR_Ability_Range[1][2] = 800.0
set AI_LR_Ability_Range[1][3] = 0.0
set AI_LR_Ability_Detect_Area[1][0] = 900.0
set AI_LR_Ability_Detect_Area[1][1] = 900.0
set AI_LR_Ability_Detect_Area[1][2] = 900.0
set AI_LR_Ability_Detect_Area[1][3] = 0.0
set AI_LR_Ability_Area[1][0] = 0.0
set AI_LR_Ability_Area[1][1] = 0.0
set AI_LR_Ability_Area[1][2] = 0.0
set AI_LR_Ability_Area[1][3] = 0.0
set AI_LR_Ability_Mode[1][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_LR_Ability_Mode[1][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_LR_Ability_Mode[1][2] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_LR_Ability_Mode[1][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_LR_Ability_Perceive[1][0] = 5
set AI_LR_Ability_Perceive[1][1] = 5
set AI_LR_Ability_Perceive[1][2] = 5
set AI_LR_Ability_Perceive[1][3] = 0
endif
//Marksmanship
if(true) then
set AI_LR_Ability_Cooldown[2][0] = 0
set AI_LR_Ability_Cooldown[2][1] = 0
set AI_LR_Ability_Cooldown[2][2] = 0
set AI_LR_Ability_Cooldown[2][3] = 0
set AI_LR_Ability_Mana[2][0] = 0
set AI_LR_Ability_Mana[2][1] = 0
set AI_LR_Ability_Mana[2][2] = 0
set AI_LR_Ability_Mana[2][3] = 0
set AI_LR_Ability_Range[2][0] = 0.0
set AI_LR_Ability_Range[2][1] = 0.0
set AI_LR_Ability_Range[2][2] = 0.0
set AI_LR_Ability_Range[2][3] = 0.0
set AI_LR_Ability_Detect_Area[2][0] = 0.0
set AI_LR_Ability_Detect_Area[2][1] = 0.0
set AI_LR_Ability_Detect_Area[2][2] = 0.0
set AI_LR_Ability_Detect_Area[2][3] = 0.0
set AI_LR_Ability_Area[2][0] = 0.0
set AI_LR_Ability_Area[2][1] = 0.0
set AI_LR_Ability_Area[2][2] = 0.0
set AI_LR_Ability_Area[2][3] = 0.0
set AI_LR_Ability_Mode[2][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_LR_Ability_Mode[2][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_LR_Ability_Mode[2][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_LR_Ability_Mode[2][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_LR_Ability_Perceive[2][0] = 0
set AI_LR_Ability_Perceive[2][1] = 0
set AI_LR_Ability_Perceive[2][2] = 0
set AI_LR_Ability_Perceive[2][3] = 0
endif
//Wingmate
if(true) then
set AI_LR_Ability_Cooldown[3][0] = 11
set AI_LR_Ability_Cooldown[3][1] = 9
set AI_LR_Ability_Cooldown[3][2] = 6
set AI_LR_Ability_Cooldown[3][3] = 0
set AI_LR_Ability_Mana[3][0] = 60
set AI_LR_Ability_Mana[3][1] = 60
set AI_LR_Ability_Mana[3][2] = 60
set AI_LR_Ability_Mana[3][3] = 0
set AI_LR_Ability_Range[3][0] = 1500.0
set AI_LR_Ability_Range[3][1] = 2000.0
set AI_LR_Ability_Range[3][2] = 2500.0
set AI_LR_Ability_Range[3][3] = 0.0
set AI_LR_Ability_Detect_Area[3][0] = 1500.0
set AI_LR_Ability_Detect_Area[3][1] = 2000.0
set AI_LR_Ability_Detect_Area[3][2] = 2500.0
set AI_LR_Ability_Detect_Area[3][3] = 0.0
set AI_LR_Ability_Area[3][0] = 0.0
set AI_LR_Ability_Area[3][1] = 0.0
set AI_LR_Ability_Area[3][2] = 0.0
set AI_LR_Ability_Area[3][3] = 0.0
set AI_LR_Ability_Mode[3][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_LR_Ability_Mode[3][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_LR_Ability_Mode[3][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_LR_Ability_Mode[3][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_LR_Ability_Perceive[3][0] = 5
set AI_LR_Ability_Perceive[3][1] = 5
set AI_LR_Ability_Perceive[3][2] = 5
set AI_LR_Ability_Perceive[3][3] = 0
endif
//Ultrabolt
if(true) then
set AI_LR_Ability_Cooldown[4][0] = 12
set AI_LR_Ability_Cooldown[4][1] = 8
set AI_LR_Ability_Cooldown[4][2] = 0
set AI_LR_Ability_Cooldown[4][3] = 0
set AI_LR_Ability_Mana[4][0] = 200
set AI_LR_Ability_Mana[4][1] = 200
set AI_LR_Ability_Mana[4][2] = 0
set AI_LR_Ability_Mana[4][3] = 0
set AI_LR_Ability_Range[4][0] = 6000.0
set AI_LR_Ability_Range[4][1] = 6000.0
set AI_LR_Ability_Range[4][2] = 0.0
set AI_LR_Ability_Range[4][3] = 0.0
set AI_LR_Ability_Detect_Area[4][0] = 6000.0
set AI_LR_Ability_Detect_Area[4][1] = 6000.0
set AI_LR_Ability_Detect_Area[4][2] = 0.0
set AI_LR_Ability_Detect_Area[4][3] = 0.0
set AI_LR_Ability_Area[4][0] = 0.0
set AI_LR_Ability_Area[4][1] = 0.0
set AI_LR_Ability_Area[4][2] = 0.0
set AI_LR_Ability_Area[4][3] = 0.0
set AI_LR_Ability_Mode[4][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_LR_Ability_Mode[4][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_LR_Ability_Mode[4][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_LR_Ability_Mode[4][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_LR_Ability_Perceive[4][0] = 5
set AI_LR_Ability_Perceive[4][1] = 5
set AI_LR_Ability_Perceive[4][2] = 0
set AI_LR_Ability_Perceive[4][3] = 0
endif
endif
endfunction
endscope
//TESH.scrollpos=237
//TESH.alwaysfold=0
scope AIKnowledgeBL initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Brutelord
if(true) then
set AI_Life_Zone[18][0] = 50
set AI_Life_Zone[18][1] = 70
set AI_Life_Zone[18][2] = 100
set AI_Mana_Zone[18][0] = 20
set AI_Mana_Zone[18][1] = 50
set AI_Mana_Zone[18][2] = 100
set AI_Attack_Range_Zone[18][0] = 200
set AI_Attack_Range_Zone[18][1] = 200
//Offense attitude
set AI_BL_Item_Total_Plan[0] = 20
if(true) then
//Arcanite Reaver
set AI_BL_Item_Plan[0][0] = 'rat6'
set AI_BL_Item_Plan[0][1] = 'stwp'
set AI_BL_Item_Plan[0][2] = 'prvt'
set AI_BL_Item_Plan[0][3] = 'rat6'
set AI_BL_Item_Plan[0][4] = 'stwp'
set AI_BL_Item_Plan[0][5] = 'prvt'
set AI_BL_Item_Point[0][0] = 1
set AI_BL_Item_Point[0][1] = 1
set AI_BL_Item_Point[0][2] = 1
set AI_BL_Item_Point[0][3] = 3
set AI_BL_Item_Point[0][4] = 3
set AI_BL_Item_Point[0][5] = 3
//Scourge Visor
set AI_BL_Item_Plan[0][6] = 'bgst'
set AI_BL_Item_Plan[0][7] = 'srrc'
set AI_BL_Item_Point[0][6] = 3
set AI_BL_Item_Point[0][7] = 3
//Fist of Firebringer
set AI_BL_Item_Plan[0][8] = 'gcel'
set AI_BL_Item_Plan[0][9] = 'rlif'
set AI_BL_Item_Plan[0][10] = 'gcel'
set AI_BL_Item_Plan[0][11] = 'rlif'
set AI_BL_Item_Point[0][8] = 2
set AI_BL_Item_Point[0][9] = 2
set AI_BL_Item_Point[0][10] = 3
set AI_BL_Item_Point[0][11] = 3
//Power Fragment
set AI_BL_Item_Plan[0][12] = 'pmna'
set AI_BL_Item_Plan[0][13] = 'sman'
set AI_BL_Item_Point[0][12] = 20
set AI_BL_Item_Point[0][13] = 20
//Amazon Meld
set AI_BL_Item_Plan[0][14] = 'I00R'
set AI_BL_Item_Plan[0][15] = 'I00R'
set AI_BL_Item_Plan[0][16] = 'I00P'
set AI_BL_Item_Point[0][14] = 5
set AI_BL_Item_Point[0][15] = 5
set AI_BL_Item_Point[0][16] = 8
//Brutalic
set AI_BL_Item_Plan[0][17] = 'I00G'
set AI_BL_Item_Plan[0][18] = 'I01B'
set AI_BL_Item_Point[0][17] = 16
set AI_BL_Item_Point[0][18] = 5
//Sneaker of Exzel
set AI_BL_Item_Plan[0][19] = 'I01T'
set AI_BL_Item_Point[0][19] = 20
endif
//Defense attitude (need to change)
set AI_BL_Item_Total_Plan[1] = 16
if(true) then
//Orb of Descent
set AI_BL_Item_Plan[1][0] = 'prvt'
set AI_BL_Item_Plan[1][1] = 'prvt'
set AI_BL_Item_Plan[1][2] = 'shea'
set AI_BL_Item_Point[1][0] = 2
set AI_BL_Item_Point[1][1] = 2
set AI_BL_Item_Point[1][2] = 2
//Power Fragment
set AI_BL_Item_Plan[1][3] = 'penr'
set AI_BL_Item_Plan[1][4] = 'penr'
set AI_BL_Item_Plan[1][5] = 'sman'
set AI_BL_Item_Point[1][3] = 1
set AI_BL_Item_Point[1][4] = 1
set AI_BL_Item_Point[1][5] = 5
//Sneaker of Exzel
set AI_BL_Item_Plan[1][6] = 'I00K'
set AI_BL_Item_Plan[1][7] = 'I00K'
set AI_BL_Item_Plan[1][8] = 'gcel'
set AI_BL_Item_Plan[1][9] = 'sres'
set AI_BL_Item_Point[1][6] = 5
set AI_BL_Item_Point[1][7] = 5
set AI_BL_Item_Point[1][8] = 5
set AI_BL_Item_Point[1][9] = 5
//Brutalic
set AI_BL_Item_Plan[1][10] = 'modt'
set AI_BL_Item_Plan[1][11] = 'I01B'
set AI_BL_Item_Plan[1][12] = 'I00G'
set AI_BL_Item_Point[1][10] = 5
set AI_BL_Item_Point[1][11] = 5
set AI_BL_Item_Point[1][12] = 5
//Mindseer of Ultimate
set AI_BL_Item_Plan[1][13] = 'I00M'
set AI_BL_Item_Plan[1][14] = 'I00I'
set AI_BL_Item_Point[1][13] = 12
set AI_BL_Item_Point[1][14] = 12
//Amazon Meld
set AI_BL_Item_Plan[1][15] = 'I002'
set AI_BL_Item_Point[1][15] = 30
endif
//General ability
if(true) then
set AI_Ability_Type[18][0] = ABILITY_TYPE_MOBILE_OFFENSE
set AI_Ability_Type[18][1] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[18][2] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[18][3] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[18][4] = ABILITY_TYPE_ULTIMATE
set AI_Ability_Order_Type[18][0] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Order_Type[18][1] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[18][2] = ACTION_ORDER_TYPE_UNKNOWN
set AI_Ability_Order_Type[18][3] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[18][4] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Level[18][0] = 4
set AI_Ability_Level[18][1] = 3
set AI_Ability_Level[18][2] = 3
set AI_Ability_Level[18][3] = 3
set AI_Ability_Level[18][4] = 2
set AI_Ability_Type_Score[18][0] = 7
set AI_Ability_Type_Score[18][1] = 10
set AI_Ability_Type_Score[18][2] = 8
set AI_Ability_Type_Score[18][3] = 4
set AI_Ability_Type_Score[18][4] = 6
set AI_Ability_ID[18][0] = 'A08T'
set AI_Ability_ID[18][1] = 'AOsf'
set AI_Ability_ID[18][2] = 'A08W'
set AI_Ability_ID[18][3] = 'A08X'
set AI_Ability_ID[18][4] = 'A08V'
set AI_Ability_Learn_Skip[18][0] = 2
set AI_Ability_Learn_Skip[18][1] = 2
set AI_Ability_Learn_Skip[18][2] = 2
set AI_Ability_Learn_Skip[18][3] = 2
set AI_Ability_Learn_Skip[18][4] = 7
set AI_Ability_Level_Required[18][0] = 0
set AI_Ability_Level_Required[18][1] = 0
set AI_Ability_Level_Required[18][2] = 0
set AI_Ability_Level_Required[18][3] = 0
set AI_Ability_Level_Required[18][4] = 6
set AI_Ability_Order[18][0] = "web"
set AI_Ability_Order[18][1] = "spiritwolf"
set AI_Ability_Order[18][2] = ""
set AI_Ability_Order[18][3] = "windwalk"
set AI_Ability_Order[18][4] = "whirlwind"
set AI_Ability_Order_Next[18][0] = ""
set AI_Ability_Order_Next[18][1] = ""
set AI_Ability_Order_Next[18][2] = ""
set AI_Ability_Order_Next[18][3] = ""
set AI_Ability_Order_Next[18][4] = ""
set AI_Ability_Buff[18][0] = 0
set AI_Ability_Buff[18][1] = 0
set AI_Ability_Buff[18][2] = 0
set AI_Ability_Buff[18][3] = 0
set AI_Ability_Buff[18][4] = 0
endif
//Cripple Graze
if(true) then
set AI_BL_Ability_Cooldown[0][0] = 23
set AI_BL_Ability_Cooldown[0][1] = 20
set AI_BL_Ability_Cooldown[0][2] = 16
set AI_BL_Ability_Cooldown[0][3] = 11
set AI_BL_Ability_Mana[0][0] = 40
set AI_BL_Ability_Mana[0][1] = 60
set AI_BL_Ability_Mana[0][2] = 80
set AI_BL_Ability_Mana[0][3] = 100
set AI_BL_Ability_Range[0][0] = 900.0
set AI_BL_Ability_Range[0][1] = 900.0
set AI_BL_Ability_Range[0][2] = 900.0
set AI_BL_Ability_Range[0][3] = 900.0
set AI_BL_Ability_Detect_Area[0][0] = 800.0
set AI_BL_Ability_Detect_Area[0][1] = 800.0
set AI_BL_Ability_Detect_Area[0][2] = 800.0
set AI_BL_Ability_Detect_Area[0][3] = 800.0
set AI_BL_Ability_Area[0][0] = 0.0
set AI_BL_Ability_Area[0][1] = 0.0
set AI_BL_Ability_Area[0][2] = 0.0
set AI_BL_Ability_Area[0][3] = 0.0
set AI_BL_Ability_Mode[0][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_BL_Ability_Mode[0][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_BL_Ability_Mode[0][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_BL_Ability_Mode[0][3] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_BL_Ability_Perceive[0][0] = 5
set AI_BL_Ability_Perceive[0][1] = 5
set AI_BL_Ability_Perceive[0][2] = 5
set AI_BL_Ability_Perceive[0][3] = 5
endif
//Feral Wolves
if(true) then
set AI_BL_Ability_Cooldown[1][0] = 15
set AI_BL_Ability_Cooldown[1][1] = 13
set AI_BL_Ability_Cooldown[1][2] = 10
set AI_BL_Ability_Cooldown[1][3] = 0
set AI_BL_Ability_Mana[1][0] = 75
set AI_BL_Ability_Mana[1][1] = 75
set AI_BL_Ability_Mana[1][2] = 75
set AI_BL_Ability_Mana[1][3] = 0
set AI_BL_Ability_Range[1][0] = 0.0
set AI_BL_Ability_Range[1][1] = 0.0
set AI_BL_Ability_Range[1][2] = 0.0
set AI_BL_Ability_Range[1][3] = 0.0
set AI_BL_Ability_Detect_Area[1][0] = 1000.0
set AI_BL_Ability_Detect_Area[1][1] = 1000.0
set AI_BL_Ability_Detect_Area[1][2] = 1000.0
set AI_BL_Ability_Detect_Area[1][3] = 0.0
set AI_BL_Ability_Area[1][0] = 0.0
set AI_BL_Ability_Area[1][1] = 0.0
set AI_BL_Ability_Area[1][2] = 0.0
set AI_BL_Ability_Area[1][3] = 0.0
set AI_BL_Ability_Mode[1][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_BL_Ability_Mode[1][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_BL_Ability_Mode[1][2] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_BL_Ability_Mode[1][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_BL_Ability_Perceive[1][0] = 5
set AI_BL_Ability_Perceive[1][1] = 5
set AI_BL_Ability_Perceive[1][2] = 5
set AI_BL_Ability_Perceive[1][3] = 0
endif
//Ferocious Maul
if(true) then
set AI_BL_Ability_Cooldown[2][0] = 0
set AI_BL_Ability_Cooldown[2][1] = 0
set AI_BL_Ability_Cooldown[2][2] = 0
set AI_BL_Ability_Cooldown[2][3] = 0
set AI_BL_Ability_Mana[2][0] = 0
set AI_BL_Ability_Mana[2][1] = 0
set AI_BL_Ability_Mana[2][2] = 0
set AI_BL_Ability_Mana[2][3] = 0
set AI_BL_Ability_Range[2][0] = 0.0
set AI_BL_Ability_Range[2][1] = 0.0
set AI_BL_Ability_Range[2][2] = 0.0
set AI_BL_Ability_Range[2][3] = 0.0
set AI_BL_Ability_Detect_Area[2][0] = 0.0
set AI_BL_Ability_Detect_Area[2][1] = 0.0
set AI_BL_Ability_Detect_Area[2][2] = 0.0
set AI_BL_Ability_Detect_Area[2][3] = 0.0
set AI_BL_Ability_Area[2][0] = 0.0
set AI_BL_Ability_Area[2][1] = 0.0
set AI_BL_Ability_Area[2][2] = 0.0
set AI_BL_Ability_Area[2][3] = 0.0
set AI_BL_Ability_Mode[2][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_BL_Ability_Mode[2][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_BL_Ability_Mode[2][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_BL_Ability_Mode[2][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_BL_Ability_Perceive[2][0] = 0
set AI_BL_Ability_Perceive[2][1] = 0
set AI_BL_Ability_Perceive[2][2] = 0
set AI_BL_Ability_Perceive[2][3] = 0
endif
//Howl
if(true) then
set AI_BL_Ability_Cooldown[3][0] = 14
set AI_BL_Ability_Cooldown[3][1] = 12
set AI_BL_Ability_Cooldown[3][2] = 8
set AI_BL_Ability_Cooldown[3][3] = 0
set AI_BL_Ability_Mana[3][0] = 80
set AI_BL_Ability_Mana[3][1] = 80
set AI_BL_Ability_Mana[3][2] = 80
set AI_BL_Ability_Mana[3][3] = 0
set AI_BL_Ability_Range[3][0] = 0.0
set AI_BL_Ability_Range[3][1] = 0.0
set AI_BL_Ability_Range[3][2] = 0.0
set AI_BL_Ability_Range[3][3] = 0.0
set AI_BL_Ability_Detect_Area[3][0] = 2000.0
set AI_BL_Ability_Detect_Area[3][1] = 2000.0
set AI_BL_Ability_Detect_Area[3][2] = 2000.0
set AI_BL_Ability_Detect_Area[3][3] = 0.0
set AI_BL_Ability_Area[3][0] = 0.0
set AI_BL_Ability_Area[3][1] = 0.0
set AI_BL_Ability_Area[3][2] = 0.0
set AI_BL_Ability_Area[3][3] = 0.0
set AI_BL_Ability_Mode[3][0] = KNOWLEDGE_ABILITY_MODE_ALLY
set AI_BL_Ability_Mode[3][1] = KNOWLEDGE_ABILITY_MODE_ALLY
set AI_BL_Ability_Mode[3][2] = KNOWLEDGE_ABILITY_MODE_ALLY
set AI_BL_Ability_Mode[3][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_BL_Ability_Perceive[3][0] = 5
set AI_BL_Ability_Perceive[3][1] = 5
set AI_BL_Ability_Perceive[3][2] = 5
set AI_BL_Ability_Perceive[3][3] = 0
endif
//Frenzy
if(true) then
set AI_BL_Ability_Cooldown[4][0] = 50
set AI_BL_Ability_Cooldown[4][1] = 40
set AI_BL_Ability_Cooldown[4][2] = 0
set AI_BL_Ability_Cooldown[4][3] = 0
set AI_BL_Ability_Mana[4][0] = 100
set AI_BL_Ability_Mana[4][1] = 200
set AI_BL_Ability_Mana[4][2] = 0
set AI_BL_Ability_Mana[4][3] = 0
set AI_BL_Ability_Range[4][0] = 0.0
set AI_BL_Ability_Range[4][1] = 0.0
set AI_BL_Ability_Range[4][2] = 0.0
set AI_BL_Ability_Range[4][3] = 0.0
set AI_BL_Ability_Detect_Area[4][0] = 500.0
set AI_BL_Ability_Detect_Area[4][1] = 500.0
set AI_BL_Ability_Detect_Area[4][2] = 0.0
set AI_BL_Ability_Detect_Area[4][3] = 0.0
set AI_BL_Ability_Area[4][0] = 0.0
set AI_BL_Ability_Area[4][1] = 0.0
set AI_BL_Ability_Area[4][2] = 0.0
set AI_BL_Ability_Area[4][3] = 0.0
set AI_BL_Ability_Mode[4][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_BL_Ability_Mode[4][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_BL_Ability_Mode[4][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_BL_Ability_Mode[4][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_BL_Ability_Perceive[4][0] = 5
set AI_BL_Ability_Perceive[4][1] = 5
set AI_BL_Ability_Perceive[4][2] = 0
set AI_BL_Ability_Perceive[4][3] = 0
endif
endif
endfunction
endscope
//TESH.scrollpos=342
//TESH.alwaysfold=0
scope AIKnowledgeAQ initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Aquasorceress
if(true) then
set AI_Life_Zone[19][0] = 50
set AI_Life_Zone[19][1] = 70
set AI_Life_Zone[19][2] = 100
set AI_Mana_Zone[19][0] = 20
set AI_Mana_Zone[19][1] = 50
set AI_Mana_Zone[19][2] = 100
set AI_Attack_Range_Zone[19][0] = 200
set AI_Attack_Range_Zone[19][1] = 500
//Offense attitude
set AI_AQ_Item_Total_Plan[0] = 20
if(true) then
//Arcanite Reaver
set AI_AQ_Item_Plan[0][0] = 'rat6'
set AI_AQ_Item_Plan[0][1] = 'stwp'
set AI_AQ_Item_Plan[0][2] = 'prvt'
set AI_AQ_Item_Plan[0][3] = 'rat6'
set AI_AQ_Item_Plan[0][4] = 'stwp'
set AI_AQ_Item_Plan[0][5] = 'prvt'
set AI_AQ_Item_Point[0][0] = 1
set AI_AQ_Item_Point[0][1] = 1
set AI_AQ_Item_Point[0][2] = 1
set AI_AQ_Item_Point[0][3] = 3
set AI_AQ_Item_Point[0][4] = 3
set AI_AQ_Item_Point[0][5] = 3
//Scourge Visor
set AI_AQ_Item_Plan[0][6] = 'bgst'
set AI_AQ_Item_Plan[0][7] = 'srrc'
set AI_AQ_Item_Point[0][6] = 3
set AI_AQ_Item_Point[0][7] = 3
//Fist of Firebringer
set AI_AQ_Item_Plan[0][8] = 'gcel'
set AI_AQ_Item_Plan[0][9] = 'rlif'
set AI_AQ_Item_Plan[0][10] = 'gcel'
set AI_AQ_Item_Plan[0][11] = 'rlif'
set AI_AQ_Item_Point[0][8] = 2
set AI_AQ_Item_Point[0][9] = 2
set AI_AQ_Item_Point[0][10] = 3
set AI_AQ_Item_Point[0][11] = 3
//Power Fragment
set AI_AQ_Item_Plan[0][12] = 'pmna'
set AI_AQ_Item_Plan[0][13] = 'sman'
set AI_AQ_Item_Point[0][12] = 20
set AI_AQ_Item_Point[0][13] = 20
//Amazon Meld
set AI_AQ_Item_Plan[0][14] = 'I00R'
set AI_AQ_Item_Plan[0][15] = 'I00R'
set AI_AQ_Item_Plan[0][16] = 'I00P'
set AI_AQ_Item_Point[0][14] = 5
set AI_AQ_Item_Point[0][15] = 5
set AI_AQ_Item_Point[0][16] = 8
//Brutalic
set AI_AQ_Item_Plan[0][17] = 'I00G'
set AI_AQ_Item_Plan[0][18] = 'I01B'
set AI_AQ_Item_Point[0][17] = 16
set AI_AQ_Item_Point[0][18] = 5
//Sneaker of Exzel
set AI_AQ_Item_Plan[0][19] = 'I01T'
set AI_AQ_Item_Point[0][19] = 20
endif
//Defense attitude (need to change)
set AI_AQ_Item_Total_Plan[1] = 16
if(true) then
//Orb of Descent
set AI_AQ_Item_Plan[1][0] = 'prvt'
set AI_AQ_Item_Plan[1][1] = 'prvt'
set AI_AQ_Item_Plan[1][2] = 'shea'
set AI_AQ_Item_Point[1][0] = 2
set AI_AQ_Item_Point[1][1] = 2
set AI_AQ_Item_Point[1][2] = 2
//Power Fragment
set AI_AQ_Item_Plan[1][3] = 'penr'
set AI_AQ_Item_Plan[1][4] = 'penr'
set AI_AQ_Item_Plan[1][5] = 'sman'
set AI_AQ_Item_Point[1][3] = 1
set AI_AQ_Item_Point[1][4] = 1
set AI_AQ_Item_Point[1][5] = 5
//Sneaker of Exzel
set AI_AQ_Item_Plan[1][6] = 'I00K'
set AI_AQ_Item_Plan[1][7] = 'I00K'
set AI_AQ_Item_Plan[1][8] = 'gcel'
set AI_AQ_Item_Plan[1][9] = 'sres'
set AI_AQ_Item_Point[1][6] = 5
set AI_AQ_Item_Point[1][7] = 5
set AI_AQ_Item_Point[1][8] = 5
set AI_AQ_Item_Point[1][9] = 5
//Brutalic
set AI_AQ_Item_Plan[1][10] = 'modt'
set AI_AQ_Item_Plan[1][11] = 'I01B'
set AI_AQ_Item_Plan[1][12] = 'I00G'
set AI_AQ_Item_Point[1][10] = 5
set AI_AQ_Item_Point[1][11] = 5
set AI_AQ_Item_Point[1][12] = 5
//Mindseer of Ultimate
set AI_AQ_Item_Plan[1][13] = 'I00M'
set AI_AQ_Item_Plan[1][14] = 'I00I'
set AI_AQ_Item_Point[1][13] = 12
set AI_AQ_Item_Point[1][14] = 12
//Amazon Meld
set AI_AQ_Item_Plan[1][15] = 'I002'
set AI_AQ_Item_Point[1][15] = 30
endif
//General ability
if(true) then
set AI_Ability_Type[19][0] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[19][1] = ABILITY_TYPE_MOBILE
set AI_Ability_Type[19][2] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[19][3] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[19][4] = ABILITY_TYPE_ULTIMATE
set AI_Ability_Order_Type[19][0] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[19][1] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[19][2] = ACTION_ORDER_TYPE_UNKNOWN
set AI_Ability_Order_Type[19][3] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Order_Type[19][4] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Level[19][0] = 4
set AI_Ability_Level[19][1] = 3
set AI_Ability_Level[19][2] = 3
set AI_Ability_Level[19][3] = 3
set AI_Ability_Level[19][4] = 2
set AI_Ability_Type_Score[19][0] = 6
set AI_Ability_Type_Score[19][1] = 10
set AI_Ability_Type_Score[19][2] = 9
set AI_Ability_Type_Score[19][3] = 7
set AI_Ability_Type_Score[19][4] = 9
set AI_Ability_ID[19][0] = 'A092'
set AI_Ability_ID[19][1] = 'A090'
set AI_Ability_ID[19][2] = 'A093'
set AI_Ability_ID[19][3] = 'A094'
set AI_Ability_ID[19][4] = 'A08Z'
set AI_Ability_Learn_Skip[19][0] = 2
set AI_Ability_Learn_Skip[19][1] = 2
set AI_Ability_Learn_Skip[19][2] = 2
set AI_Ability_Learn_Skip[19][3] = 2
set AI_Ability_Learn_Skip[19][4] = 7
set AI_Ability_Level_Required[19][0] = 0
set AI_Ability_Level_Required[19][1] = 0
set AI_Ability_Level_Required[19][2] = 0
set AI_Ability_Level_Required[19][3] = 0
set AI_Ability_Level_Required[19][4] = 6
set AI_Ability_Order[19][0] = "web"
set AI_Ability_Order[19][1] = ""
set AI_Ability_Order[19][2] = ""
set AI_Ability_Order[19][3] = "wispharvest"
set AI_Ability_Order[19][4] = "whirlwind"
set AI_Ability_Order_Next[19][0] = ""
set AI_Ability_Order_Next[19][1] = ""
set AI_Ability_Order_Next[19][2] = ""
set AI_Ability_Order_Next[19][3] = ""
set AI_Ability_Order_Next[19][4] = ""
set AI_Ability_Buff[19][0] = 0
set AI_Ability_Buff[19][1] = 0
set AI_Ability_Buff[19][2] = 0
set AI_Ability_Buff[19][3] = 0
set AI_Ability_Buff[19][4] = 0
endif
//Water Remnant
if(true) then
set AI_AQ_Ability_Cooldown[0][0] = 10
set AI_AQ_Ability_Cooldown[0][1] = 9
set AI_AQ_Ability_Cooldown[0][2] = 7
set AI_AQ_Ability_Cooldown[0][3] = 4
set AI_AQ_Ability_Mana[0][0] = 100
set AI_AQ_Ability_Mana[0][1] = 100
set AI_AQ_Ability_Mana[0][2] = 100
set AI_AQ_Ability_Mana[0][3] = 100
set AI_AQ_Ability_Range[0][0] = 200.0
set AI_AQ_Ability_Range[0][1] = 200.0
set AI_AQ_Ability_Range[0][2] = 200.0
set AI_AQ_Ability_Range[0][3] = 200.0
set AI_AQ_Ability_Detect_Area[0][0] = 200.0
set AI_AQ_Ability_Detect_Area[0][1] = 200.0
set AI_AQ_Ability_Detect_Area[0][2] = 200.0
set AI_AQ_Ability_Detect_Area[0][3] = 200.0
set AI_AQ_Ability_Area[0][0] = 0.0
set AI_AQ_Ability_Area[0][1] = 0.0
set AI_AQ_Ability_Area[0][2] = 0.0
set AI_AQ_Ability_Area[0][3] = 0.0
set AI_AQ_Ability_Mode[0][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_AQ_Ability_Mode[0][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_AQ_Ability_Mode[0][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_AQ_Ability_Mode[0][3] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_AQ_Ability_Perceive[0][0] = 5
set AI_AQ_Ability_Perceive[0][1] = 5
set AI_AQ_Ability_Perceive[0][2] = 5
set AI_AQ_Ability_Perceive[0][3] = 5
endif
//Portal
if(true) then
set AI_AQ_Ability_Cooldown[1][0] = 0
set AI_AQ_Ability_Cooldown[1][1] = 0
set AI_AQ_Ability_Cooldown[1][2] = 0
set AI_AQ_Ability_Cooldown[1][3] = 0
set AI_AQ_Ability_Mana[1][0] = 0
set AI_AQ_Ability_Mana[1][1] = 0
set AI_AQ_Ability_Mana[1][2] = 0
set AI_AQ_Ability_Mana[1][3] = 0
set AI_AQ_Ability_Range[1][0] = 0.0
set AI_AQ_Ability_Range[1][1] = 0.0
set AI_AQ_Ability_Range[1][2] = 0.0
set AI_AQ_Ability_Range[1][3] = 0.0
set AI_AQ_Ability_Detect_Area[1][0] = 0.0
set AI_AQ_Ability_Detect_Area[1][1] = 0.0
set AI_AQ_Ability_Detect_Area[1][2] = 0.0
set AI_AQ_Ability_Detect_Area[1][3] = 0.0
set AI_AQ_Ability_Area[1][0] = 0.0
set AI_AQ_Ability_Area[1][1] = 0.0
set AI_AQ_Ability_Area[1][2] = 0.0
set AI_AQ_Ability_Area[1][3] = 0.0
set AI_AQ_Ability_Mode[1][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AQ_Ability_Mode[1][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AQ_Ability_Mode[1][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AQ_Ability_Mode[1][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AQ_Ability_Perceive[1][0] = 0
set AI_AQ_Ability_Perceive[1][1] = 0
set AI_AQ_Ability_Perceive[1][2] = 0
set AI_AQ_Ability_Perceive[1][3] = 0
endif
//Aquashield
if(true) then
set AI_AQ_Ability_Cooldown[2][0] = 0
set AI_AQ_Ability_Cooldown[2][1] = 0
set AI_AQ_Ability_Cooldown[2][2] = 0
set AI_AQ_Ability_Cooldown[2][3] = 0
set AI_AQ_Ability_Mana[2][0] = 0
set AI_AQ_Ability_Mana[2][1] = 0
set AI_AQ_Ability_Mana[2][2] = 0
set AI_AQ_Ability_Mana[2][3] = 0
set AI_AQ_Ability_Range[2][0] = 0.0
set AI_AQ_Ability_Range[2][1] = 0.0
set AI_AQ_Ability_Range[2][2] = 0.0
set AI_AQ_Ability_Range[2][3] = 0.0
set AI_AQ_Ability_Detect_Area[2][0] = 0.0
set AI_AQ_Ability_Detect_Area[2][1] = 0.0
set AI_AQ_Ability_Detect_Area[2][2] = 0.0
set AI_AQ_Ability_Detect_Area[2][3] = 0.0
set AI_AQ_Ability_Area[2][0] = 0.0
set AI_AQ_Ability_Area[2][1] = 0.0
set AI_AQ_Ability_Area[2][2] = 0.0
set AI_AQ_Ability_Area[2][3] = 0.0
set AI_AQ_Ability_Mode[2][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AQ_Ability_Mode[2][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AQ_Ability_Mode[2][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AQ_Ability_Mode[2][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AQ_Ability_Perceive[2][0] = 0
set AI_AQ_Ability_Perceive[2][1] = 0
set AI_AQ_Ability_Perceive[2][2] = 0
set AI_AQ_Ability_Perceive[2][3] = 0
endif
//Adaptation
if(true) then
set AI_AQ_Ability_Cooldown[3][0] = 8
set AI_AQ_Ability_Cooldown[3][1] = 7
set AI_AQ_Ability_Cooldown[3][2] = 5
set AI_AQ_Ability_Cooldown[3][3] = 0
set AI_AQ_Ability_Mana[3][0] = 40
set AI_AQ_Ability_Mana[3][1] = 40
set AI_AQ_Ability_Mana[3][2] = 40
set AI_AQ_Ability_Mana[3][3] = 0
set AI_AQ_Ability_Range[3][0] = 700.0
set AI_AQ_Ability_Range[3][1] = 800.0
set AI_AQ_Ability_Range[3][2] = 900.0
set AI_AQ_Ability_Range[3][3] = 0.0
set AI_AQ_Ability_Detect_Area[3][0] = 600.0
set AI_AQ_Ability_Detect_Area[3][1] = 700.0
set AI_AQ_Ability_Detect_Area[3][2] = 800.0
set AI_AQ_Ability_Detect_Area[3][3] = 0.0
set AI_AQ_Ability_Area[3][0] = 0.0
set AI_AQ_Ability_Area[3][1] = 0.0
set AI_AQ_Ability_Area[3][2] = 0.0
set AI_AQ_Ability_Area[3][3] = 0.0
set AI_AQ_Ability_Mode[3][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_AQ_Ability_Mode[3][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_AQ_Ability_Mode[3][2] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_AQ_Ability_Mode[3][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AQ_Ability_Perceive[3][0] = 5
set AI_AQ_Ability_Perceive[3][1] = 5
set AI_AQ_Ability_Perceive[3][2] = 5
set AI_AQ_Ability_Perceive[3][3] = 0
endif
//Tidal Wave
if(true) then
set AI_AQ_Ability_Cooldown[4][0] = 40
set AI_AQ_Ability_Cooldown[4][1] = 20
set AI_AQ_Ability_Cooldown[4][2] = 0
set AI_AQ_Ability_Cooldown[4][3] = 0
set AI_AQ_Ability_Mana[4][0] = 400
set AI_AQ_Ability_Mana[4][1] = 200
set AI_AQ_Ability_Mana[4][2] = 0
set AI_AQ_Ability_Mana[4][3] = 0
set AI_AQ_Ability_Range[4][0] = 1500.0
set AI_AQ_Ability_Range[4][1] = 1500.0
set AI_AQ_Ability_Range[4][2] = 0.0
set AI_AQ_Ability_Range[4][3] = 0.0
set AI_AQ_Ability_Detect_Area[4][0] = 500.0
set AI_AQ_Ability_Detect_Area[4][1] = 500.0
set AI_AQ_Ability_Detect_Area[4][2] = 0.0
set AI_AQ_Ability_Detect_Area[4][3] = 0.0
set AI_AQ_Ability_Area[4][0] = 0.0
set AI_AQ_Ability_Area[4][1] = 0.0
set AI_AQ_Ability_Area[4][2] = 0.0
set AI_AQ_Ability_Area[4][3] = 0.0
set AI_AQ_Ability_Mode[4][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_AQ_Ability_Mode[4][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_AQ_Ability_Mode[4][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AQ_Ability_Mode[4][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_AQ_Ability_Perceive[4][0] = 5
set AI_AQ_Ability_Perceive[4][1] = 5
set AI_AQ_Ability_Perceive[4][2] = 0
set AI_AQ_Ability_Perceive[4][3] = 0
endif
endif
endfunction
endscope
//TESH.scrollpos=233
//TESH.alwaysfold=0
scope AIKnowledgeBA initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Black Archer
if(true) then
set AI_Life_Zone[20][0] = 50
set AI_Life_Zone[20][1] = 70
set AI_Life_Zone[20][2] = 100
set AI_Mana_Zone[20][0] = 20
set AI_Mana_Zone[20][1] = 50
set AI_Mana_Zone[20][2] = 100
set AI_Attack_Range_Zone[20][0] = 200
set AI_Attack_Range_Zone[20][1] = 500
//Offense attitude
set AI_BA_Item_Total_Plan[0] = 20
if(true) then
//Arcanite Reaver
set AI_BA_Item_Plan[0][0] = 'rat6'
set AI_BA_Item_Plan[0][1] = 'stwp'
set AI_BA_Item_Plan[0][2] = 'prvt'
set AI_BA_Item_Plan[0][3] = 'rat6'
set AI_BA_Item_Plan[0][4] = 'stwp'
set AI_BA_Item_Plan[0][5] = 'prvt'
set AI_BA_Item_Point[0][0] = 1
set AI_BA_Item_Point[0][1] = 1
set AI_BA_Item_Point[0][2] = 1
set AI_BA_Item_Point[0][3] = 3
set AI_BA_Item_Point[0][4] = 3
set AI_BA_Item_Point[0][5] = 3
//Scourge Visor
set AI_BA_Item_Plan[0][6] = 'bgst'
set AI_BA_Item_Plan[0][7] = 'srrc'
set AI_BA_Item_Point[0][6] = 3
set AI_BA_Item_Point[0][7] = 3
//Fist of Firebringer
set AI_BA_Item_Plan[0][8] = 'gcel'
set AI_BA_Item_Plan[0][9] = 'rlif'
set AI_BA_Item_Plan[0][10] = 'gcel'
set AI_BA_Item_Plan[0][11] = 'rlif'
set AI_BA_Item_Point[0][8] = 2
set AI_BA_Item_Point[0][9] = 2
set AI_BA_Item_Point[0][10] = 3
set AI_BA_Item_Point[0][11] = 3
//Power Fragment
set AI_BA_Item_Plan[0][12] = 'pmna'
set AI_BA_Item_Plan[0][13] = 'sman'
set AI_BA_Item_Point[0][12] = 20
set AI_BA_Item_Point[0][13] = 20
//Amazon Meld
set AI_BA_Item_Plan[0][14] = 'I00R'
set AI_BA_Item_Plan[0][15] = 'I00R'
set AI_BA_Item_Plan[0][16] = 'I00P'
set AI_BA_Item_Point[0][14] = 5
set AI_BA_Item_Point[0][15] = 5
set AI_BA_Item_Point[0][16] = 8
//Brutalic
set AI_BA_Item_Plan[0][17] = 'I00G'
set AI_BA_Item_Plan[0][18] = 'I01B'
set AI_BA_Item_Point[0][17] = 16
set AI_BA_Item_Point[0][18] = 5
//Sneaker of Exzel
set AI_BA_Item_Plan[0][19] = 'I01T'
set AI_BA_Item_Point[0][19] = 20
endif
//Defense attitude (need to change)
set AI_BA_Item_Total_Plan[1] = 16
if(true) then
//Orb of Descent
set AI_BA_Item_Plan[1][0] = 'prvt'
set AI_BA_Item_Plan[1][1] = 'prvt'
set AI_BA_Item_Plan[1][2] = 'shea'
set AI_BA_Item_Point[1][0] = 2
set AI_BA_Item_Point[1][1] = 2
set AI_BA_Item_Point[1][2] = 2
//Power Fragment
set AI_BA_Item_Plan[1][3] = 'penr'
set AI_BA_Item_Plan[1][4] = 'penr'
set AI_BA_Item_Plan[1][5] = 'sman'
set AI_BA_Item_Point[1][3] = 1
set AI_BA_Item_Point[1][4] = 1
set AI_BA_Item_Point[1][5] = 5
//Sneaker of Exzel
set AI_BA_Item_Plan[1][6] = 'I00K'
set AI_BA_Item_Plan[1][7] = 'I00K'
set AI_BA_Item_Plan[1][8] = 'gcel'
set AI_BA_Item_Plan[1][9] = 'sres'
set AI_BA_Item_Point[1][6] = 5
set AI_BA_Item_Point[1][7] = 5
set AI_BA_Item_Point[1][8] = 5
set AI_BA_Item_Point[1][9] = 5
//Brutalic
set AI_BA_Item_Plan[1][10] = 'modt'
set AI_BA_Item_Plan[1][11] = 'I01B'
set AI_BA_Item_Plan[1][12] = 'I00G'
set AI_BA_Item_Point[1][10] = 5
set AI_BA_Item_Point[1][11] = 5
set AI_BA_Item_Point[1][12] = 5
//Mindseer of Ultimate
set AI_BA_Item_Plan[1][13] = 'I00M'
set AI_BA_Item_Plan[1][14] = 'I00I'
set AI_BA_Item_Point[1][13] = 12
set AI_BA_Item_Point[1][14] = 12
//Amazon Meld
set AI_BA_Item_Plan[1][15] = 'I002'
set AI_BA_Item_Point[1][15] = 30
endif
//General ability
if(true) then
set AI_Ability_Type[20][0] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[20][1] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[20][2] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[20][3] = ABILITY_TYPE_MOBILE
set AI_Ability_Type[20][4] = ABILITY_TYPE_ULTIMATE
set AI_Ability_Order_Type[20][0] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[20][1] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[20][2] = ACTION_ORDER_TYPE_UNKNOWN
set AI_Ability_Order_Type[20][3] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[20][4] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Level[20][0] = 4
set AI_Ability_Level[20][1] = 3
set AI_Ability_Level[20][2] = 3
set AI_Ability_Level[20][3] = 3
set AI_Ability_Level[20][4] = 2
set AI_Ability_Type_Score[20][0] = 5
set AI_Ability_Type_Score[20][1] = 4
set AI_Ability_Type_Score[20][2] = 7
set AI_Ability_Type_Score[20][3] = 3
set AI_Ability_Type_Score[20][4] = 8
set AI_Ability_ID[20][0] = 'A09C'
set AI_Ability_ID[20][1] = 'AEpa'
set AI_Ability_ID[20][2] = 'A09D'
set AI_Ability_ID[20][3] = 'A099'
set AI_Ability_ID[20][4] = 'A09A'
set AI_Ability_Learn_Skip[20][0] = 2
set AI_Ability_Learn_Skip[20][1] = 2
set AI_Ability_Learn_Skip[20][2] = 2
set AI_Ability_Learn_Skip[20][3] = 2
set AI_Ability_Learn_Skip[20][4] = 7
set AI_Ability_Level_Required[20][0] = 0
set AI_Ability_Level_Required[20][1] = 0
set AI_Ability_Level_Required[20][2] = 0
set AI_Ability_Level_Required[20][3] = 0
set AI_Ability_Level_Required[20][4] = 6
set AI_Ability_Order[20][0] = "webon"
set AI_Ability_Order[20][1] = "poisonarrows"
set AI_Ability_Order[20][2] = ""
set AI_Ability_Order[20][3] = "windwalk"
set AI_Ability_Order[20][4] = "whirlwind"
set AI_Ability_Order_Next[20][0] = ""
set AI_Ability_Order_Next[20][1] = ""
set AI_Ability_Order_Next[20][2] = ""
set AI_Ability_Order_Next[20][3] = ""
set AI_Ability_Order_Next[20][4] = ""
set AI_Ability_Buff[20][0] = 0
set AI_Ability_Buff[20][1] = 0
set AI_Ability_Buff[20][2] = 0
set AI_Ability_Buff[20][3] = 0
set AI_Ability_Buff[20][4] = 0
endif
//Haunt
if(true) then
set AI_BA_Ability_Cooldown[0][0] = 15
set AI_BA_Ability_Cooldown[0][1] = 14
set AI_BA_Ability_Cooldown[0][2] = 12
set AI_BA_Ability_Cooldown[0][3] = 9
set AI_BA_Ability_Mana[0][0] = 40
set AI_BA_Ability_Mana[0][1] = 40
set AI_BA_Ability_Mana[0][2] = 40
set AI_BA_Ability_Mana[0][3] = 40
set AI_BA_Ability_Range[0][0] = 9000.0
set AI_BA_Ability_Range[0][1] = 9000.0
set AI_BA_Ability_Range[0][2] = 9000.0
set AI_BA_Ability_Range[0][3] = 9000.0
set AI_BA_Ability_Detect_Area[0][0] = 600.0
set AI_BA_Ability_Detect_Area[0][1] = 600.0
set AI_BA_Ability_Detect_Area[0][2] = 600.0
set AI_BA_Ability_Detect_Area[0][3] = 600.0
set AI_BA_Ability_Area[0][0] = 0.0
set AI_BA_Ability_Area[0][1] = 0.0
set AI_BA_Ability_Area[0][2] = 0.0
set AI_BA_Ability_Area[0][3] = 0.0
set AI_BA_Ability_Mode[0][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_BA_Ability_Mode[0][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_BA_Ability_Mode[0][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_BA_Ability_Mode[0][3] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_BA_Ability_Perceive[0][0] = 5
set AI_BA_Ability_Perceive[0][1] = 5
set AI_BA_Ability_Perceive[0][2] = 5
set AI_BA_Ability_Perceive[0][3] = 5
endif
//Desolation
if(true) then
set AI_BA_Ability_Cooldown[1][0] = 60
set AI_BA_Ability_Cooldown[1][1] = 60
set AI_BA_Ability_Cooldown[1][2] = 60
set AI_BA_Ability_Cooldown[1][3] = 0
set AI_BA_Ability_Mana[1][0] = 0
set AI_BA_Ability_Mana[1][1] = 0
set AI_BA_Ability_Mana[1][2] = 0
set AI_BA_Ability_Mana[1][3] = 0
set AI_BA_Ability_Range[1][0] = 1000.0
set AI_BA_Ability_Range[1][1] = 1000.0
set AI_BA_Ability_Range[1][2] = 1000.0
set AI_BA_Ability_Range[1][3] = 0.0
set AI_BA_Ability_Detect_Area[1][0] = 5000.0
set AI_BA_Ability_Detect_Area[1][1] = 5000.0
set AI_BA_Ability_Detect_Area[1][2] = 5000.0
set AI_BA_Ability_Detect_Area[1][3] = 0.0
set AI_BA_Ability_Area[1][0] = 0.0
set AI_BA_Ability_Area[1][1] = 0.0
set AI_BA_Ability_Area[1][2] = 0.0
set AI_BA_Ability_Area[1][3] = 0.0
set AI_BA_Ability_Mode[1][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_BA_Ability_Mode[1][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_BA_Ability_Mode[1][2] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_BA_Ability_Mode[1][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_BA_Ability_Perceive[1][0] = 5
set AI_BA_Ability_Perceive[1][1] = 5
set AI_BA_Ability_Perceive[1][2] = 5
set AI_BA_Ability_Perceive[1][3] = 0
endif
//Ghostring
if(true) then
set AI_BA_Ability_Cooldown[2][0] = 0
set AI_BA_Ability_Cooldown[2][1] = 0
set AI_BA_Ability_Cooldown[2][2] = 0
set AI_BA_Ability_Cooldown[2][3] = 0
set AI_BA_Ability_Mana[2][0] = 0
set AI_BA_Ability_Mana[2][1] = 0
set AI_BA_Ability_Mana[2][2] = 0
set AI_BA_Ability_Mana[2][3] = 0
set AI_BA_Ability_Range[2][0] = 0.0
set AI_BA_Ability_Range[2][1] = 0.0
set AI_BA_Ability_Range[2][2] = 0.0
set AI_BA_Ability_Range[2][3] = 0.0
set AI_BA_Ability_Detect_Area[2][0] = 0.0
set AI_BA_Ability_Detect_Area[2][1] = 0.0
set AI_BA_Ability_Detect_Area[2][2] = 0.0
set AI_BA_Ability_Detect_Area[2][3] = 0.0
set AI_BA_Ability_Area[2][0] = 0.0
set AI_BA_Ability_Area[2][1] = 0.0
set AI_BA_Ability_Area[2][2] = 0.0
set AI_BA_Ability_Area[2][3] = 0.0
set AI_BA_Ability_Mode[2][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_BA_Ability_Mode[2][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_BA_Ability_Mode[2][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_BA_Ability_Mode[2][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_BA_Ability_Perceive[2][0] = 0
set AI_BA_Ability_Perceive[2][1] = 0
set AI_BA_Ability_Perceive[2][2] = 0
set AI_BA_Ability_Perceive[2][3] = 0
endif
//Apparitions
if(true) then
set AI_BA_Ability_Cooldown[3][0] = 9
set AI_BA_Ability_Cooldown[3][1] = 7
set AI_BA_Ability_Cooldown[3][2] = 3
set AI_BA_Ability_Cooldown[3][3] = 0
set AI_BA_Ability_Mana[3][0] = 10
set AI_BA_Ability_Mana[3][1] = 20
set AI_BA_Ability_Mana[3][2] = 30
set AI_BA_Ability_Mana[3][3] = 0
set AI_BA_Ability_Range[3][0] = 0.0
set AI_BA_Ability_Range[3][1] = 0.0
set AI_BA_Ability_Range[3][2] = 0.0
set AI_BA_Ability_Range[3][3] = 0.0
set AI_BA_Ability_Detect_Area[3][0] = 1000.0
set AI_BA_Ability_Detect_Area[3][1] = 1000.0
set AI_BA_Ability_Detect_Area[3][2] = 1000.0
set AI_BA_Ability_Detect_Area[3][3] = 0.0
set AI_BA_Ability_Area[3][0] = 0.0
set AI_BA_Ability_Area[3][1] = 0.0
set AI_BA_Ability_Area[3][2] = 0.0
set AI_BA_Ability_Area[3][3] = 0.0
set AI_BA_Ability_Mode[3][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_BA_Ability_Mode[3][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_BA_Ability_Mode[3][2] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_BA_Ability_Mode[3][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_BA_Ability_Perceive[3][0] = 5
set AI_BA_Ability_Perceive[3][1] = 5
set AI_BA_Ability_Perceive[3][2] = 5
set AI_BA_Ability_Perceive[3][3] = 0
endif
//Wraith
if(true) then
set AI_BA_Ability_Cooldown[4][0] = 60
set AI_BA_Ability_Cooldown[4][1] = 40
set AI_BA_Ability_Cooldown[4][2] = 0
set AI_BA_Ability_Cooldown[4][3] = 0
set AI_BA_Ability_Mana[4][0] = 100
set AI_BA_Ability_Mana[4][1] = 100
set AI_BA_Ability_Mana[4][2] = 0
set AI_BA_Ability_Mana[4][3] = 0
set AI_BA_Ability_Range[4][0] = 0.0
set AI_BA_Ability_Range[4][1] = 0.0
set AI_BA_Ability_Range[4][2] = 0.0
set AI_BA_Ability_Range[4][3] = 0.0
set AI_BA_Ability_Detect_Area[4][0] = 2000.0
set AI_BA_Ability_Detect_Area[4][1] = 2000.0
set AI_BA_Ability_Detect_Area[4][2] = 0.0
set AI_BA_Ability_Detect_Area[4][3] = 0.0
set AI_BA_Ability_Area[4][0] = 0.0
set AI_BA_Ability_Area[4][1] = 0.0
set AI_BA_Ability_Area[4][2] = 0.0
set AI_BA_Ability_Area[4][3] = 0.0
set AI_BA_Ability_Mode[4][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_BA_Ability_Mode[4][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_BA_Ability_Mode[4][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_BA_Ability_Mode[4][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_BA_Ability_Perceive[4][0] = 5
set AI_BA_Ability_Perceive[4][1] = 5
set AI_BA_Ability_Perceive[4][2] = 0
set AI_BA_Ability_Perceive[4][3] = 0
endif
endif
endfunction
endscope
//TESH.scrollpos=230
//TESH.alwaysfold=0
scope AIKnowledgeSY initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Sky Wanderer
if(true) then
set AI_Life_Zone[21][0] = 50
set AI_Life_Zone[21][1] = 70
set AI_Life_Zone[21][2] = 100
set AI_Mana_Zone[21][0] = 20
set AI_Mana_Zone[21][1] = 50
set AI_Mana_Zone[21][2] = 100
set AI_Attack_Range_Zone[21][0] = 200
set AI_Attack_Range_Zone[21][1] = 300
//Offense attitude
set AI_SY_Item_Total_Plan[0] = 20
if(true) then
//Arcanite Reaver
set AI_SY_Item_Plan[0][0] = 'rat6'
set AI_SY_Item_Plan[0][1] = 'stwp'
set AI_SY_Item_Plan[0][2] = 'prvt'
set AI_SY_Item_Plan[0][3] = 'rat6'
set AI_SY_Item_Plan[0][4] = 'stwp'
set AI_SY_Item_Plan[0][5] = 'prvt'
set AI_SY_Item_Point[0][0] = 1
set AI_SY_Item_Point[0][1] = 1
set AI_SY_Item_Point[0][2] = 1
set AI_SY_Item_Point[0][3] = 3
set AI_SY_Item_Point[0][4] = 3
set AI_SY_Item_Point[0][5] = 3
//Scourge Visor
set AI_SY_Item_Plan[0][6] = 'bgst'
set AI_SY_Item_Plan[0][7] = 'srrc'
set AI_SY_Item_Point[0][6] = 3
set AI_SY_Item_Point[0][7] = 3
//Fist of Firebringer
set AI_SY_Item_Plan[0][8] = 'gcel'
set AI_SY_Item_Plan[0][9] = 'rlif'
set AI_SY_Item_Plan[0][10] = 'gcel'
set AI_SY_Item_Plan[0][11] = 'rlif'
set AI_SY_Item_Point[0][8] = 2
set AI_SY_Item_Point[0][9] = 2
set AI_SY_Item_Point[0][10] = 3
set AI_SY_Item_Point[0][11] = 3
//Power Fragment
set AI_SY_Item_Plan[0][12] = 'pmna'
set AI_SY_Item_Plan[0][13] = 'sman'
set AI_SY_Item_Point[0][12] = 20
set AI_SY_Item_Point[0][13] = 20
//Amazon Meld
set AI_SY_Item_Plan[0][14] = 'I00R'
set AI_SY_Item_Plan[0][15] = 'I00R'
set AI_SY_Item_Plan[0][16] = 'I00P'
set AI_SY_Item_Point[0][14] = 5
set AI_SY_Item_Point[0][15] = 5
set AI_SY_Item_Point[0][16] = 8
//Brutalic
set AI_SY_Item_Plan[0][17] = 'I00G'
set AI_SY_Item_Plan[0][18] = 'I01B'
set AI_SY_Item_Point[0][17] = 16
set AI_SY_Item_Point[0][18] = 5
//Sneaker of Exzel
set AI_SY_Item_Plan[0][19] = 'I01T'
set AI_SY_Item_Point[0][19] = 20
endif
//Defense attitude (need to change)
set AI_SY_Item_Total_Plan[1] = 16
if(true) then
//Orb of Descent
set AI_SY_Item_Plan[1][0] = 'prvt'
set AI_SY_Item_Plan[1][1] = 'prvt'
set AI_SY_Item_Plan[1][2] = 'shea'
set AI_SY_Item_Point[1][0] = 2
set AI_SY_Item_Point[1][1] = 2
set AI_SY_Item_Point[1][2] = 2
//Power Fragment
set AI_SY_Item_Plan[1][3] = 'penr'
set AI_SY_Item_Plan[1][4] = 'penr'
set AI_SY_Item_Plan[1][5] = 'sman'
set AI_SY_Item_Point[1][3] = 1
set AI_SY_Item_Point[1][4] = 1
set AI_SY_Item_Point[1][5] = 5
//Sneaker of Exzel
set AI_SY_Item_Plan[1][6] = 'I00K'
set AI_SY_Item_Plan[1][7] = 'I00K'
set AI_SY_Item_Plan[1][8] = 'gcel'
set AI_SY_Item_Plan[1][9] = 'sres'
set AI_SY_Item_Point[1][6] = 5
set AI_SY_Item_Point[1][7] = 5
set AI_SY_Item_Point[1][8] = 5
set AI_SY_Item_Point[1][9] = 5
//Brutalic
set AI_SY_Item_Plan[1][10] = 'modt'
set AI_SY_Item_Plan[1][11] = 'I01B'
set AI_SY_Item_Plan[1][12] = 'I00G'
set AI_SY_Item_Point[1][10] = 5
set AI_SY_Item_Point[1][11] = 5
set AI_SY_Item_Point[1][12] = 5
//Mindseer of Ultimate
set AI_SY_Item_Plan[1][13] = 'I00M'
set AI_SY_Item_Plan[1][14] = 'I00I'
set AI_SY_Item_Point[1][13] = 12
set AI_SY_Item_Point[1][14] = 12
//Amazon Meld
set AI_SY_Item_Plan[1][15] = 'I002'
set AI_SY_Item_Point[1][15] = 30
endif
//General ability
if(true) then
set AI_Ability_Type[21][0] = ABILITY_TYPE_MOBILE
set AI_Ability_Type[21][1] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[21][2] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[21][3] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[21][4] = ABILITY_TYPE_ULTIMATE
set AI_Ability_Order_Type[21][0] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Order_Type[21][1] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[21][2] = ACTION_ORDER_TYPE_UNKNOWN
set AI_Ability_Order_Type[21][3] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[21][4] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Level[21][0] = 4
set AI_Ability_Level[21][1] = 3
set AI_Ability_Level[21][2] = 3
set AI_Ability_Level[21][3] = 3
set AI_Ability_Level[21][4] = 2
set AI_Ability_Type_Score[21][0] = 6
set AI_Ability_Type_Score[21][1] = 6
set AI_Ability_Type_Score[21][2] = 6
set AI_Ability_Type_Score[21][3] = 10
set AI_Ability_Type_Score[21][4] = 9
set AI_Ability_ID[21][0] = 'A09I'
set AI_Ability_ID[21][1] = 'A09K'
set AI_Ability_ID[21][2] = 'A09J'
set AI_Ability_ID[21][3] = 'A09L'
set AI_Ability_ID[21][4] = 'A09G'
set AI_Ability_Learn_Skip[21][0] = 2
set AI_Ability_Learn_Skip[21][1] = 2
set AI_Ability_Learn_Skip[21][2] = 2
set AI_Ability_Learn_Skip[21][3] = 2
set AI_Ability_Learn_Skip[21][4] = 7
set AI_Ability_Level_Required[21][0] = 0
set AI_Ability_Level_Required[21][1] = 0
set AI_Ability_Level_Required[21][2] = 0
set AI_Ability_Level_Required[21][3] = 0
set AI_Ability_Level_Required[21][4] = 6
set AI_Ability_Order[21][0] = "web"
set AI_Ability_Order[21][1] = "poisonarrows"
set AI_Ability_Order[21][2] = ""
set AI_Ability_Order[21][3] = "weboff"
set AI_Ability_Order[21][4] = "whirlwind"
set AI_Ability_Order_Next[21][0] = ""
set AI_Ability_Order_Next[21][1] = ""
set AI_Ability_Order_Next[21][2] = ""
set AI_Ability_Order_Next[21][3] = ""
set AI_Ability_Order_Next[21][4] = ""
set AI_Ability_Buff[21][0] = 0
set AI_Ability_Buff[21][1] = 0
set AI_Ability_Buff[21][2] = 0
set AI_Ability_Buff[21][3] = 0
set AI_Ability_Buff[21][4] = 0
endif
//Gush
if(true) then
set AI_SY_Ability_Cooldown[0][0] = 17
set AI_SY_Ability_Cooldown[0][1] = 15
set AI_SY_Ability_Cooldown[0][2] = 12
set AI_SY_Ability_Cooldown[0][3] = 8
set AI_SY_Ability_Mana[0][0] = 50
set AI_SY_Ability_Mana[0][1] = 50
set AI_SY_Ability_Mana[0][2] = 50
set AI_SY_Ability_Mana[0][3] = 50
set AI_SY_Ability_Range[0][0] = 1000.0
set AI_SY_Ability_Range[0][1] = 1000.0
set AI_SY_Ability_Range[0][2] = 1000.0
set AI_SY_Ability_Range[0][3] = 1000.0
set AI_SY_Ability_Detect_Area[0][0] = 800.0
set AI_SY_Ability_Detect_Area[0][1] = 800.0
set AI_SY_Ability_Detect_Area[0][2] = 800.0
set AI_SY_Ability_Detect_Area[0][3] = 800.0
set AI_SY_Ability_Area[0][0] = 0.0
set AI_SY_Ability_Area[0][1] = 0.0
set AI_SY_Ability_Area[0][2] = 0.0
set AI_SY_Ability_Area[0][3] = 0.0
set AI_SY_Ability_Mode[0][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_SY_Ability_Mode[0][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_SY_Ability_Mode[0][2] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_SY_Ability_Mode[0][3] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_SY_Ability_Perceive[0][0] = 15
set AI_SY_Ability_Perceive[0][1] = 15
set AI_SY_Ability_Perceive[0][2] = 15
set AI_SY_Ability_Perceive[0][3] = 15
endif
//Whirlblow
if(true) then
set AI_SY_Ability_Cooldown[1][0] = 60
set AI_SY_Ability_Cooldown[1][1] = 60
set AI_SY_Ability_Cooldown[1][2] = 60
set AI_SY_Ability_Cooldown[1][3] = 0
set AI_SY_Ability_Mana[1][0] = 0
set AI_SY_Ability_Mana[1][1] = 0
set AI_SY_Ability_Mana[1][2] = 0
set AI_SY_Ability_Mana[1][3] = 0
set AI_SY_Ability_Range[1][0] = 0.0
set AI_SY_Ability_Range[1][1] = 0.0
set AI_SY_Ability_Range[1][2] = 0.0
set AI_SY_Ability_Range[1][3] = 0.0
set AI_SY_Ability_Detect_Area[1][0] = 5000.0
set AI_SY_Ability_Detect_Area[1][1] = 5000.0
set AI_SY_Ability_Detect_Area[1][2] = 5000.0
set AI_SY_Ability_Detect_Area[1][3] = 0.0
set AI_SY_Ability_Area[1][0] = 0.0
set AI_SY_Ability_Area[1][1] = 0.0
set AI_SY_Ability_Area[1][2] = 0.0
set AI_SY_Ability_Area[1][3] = 0.0
set AI_SY_Ability_Mode[1][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_SY_Ability_Mode[1][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_SY_Ability_Mode[1][2] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_SY_Ability_Mode[1][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SY_Ability_Perceive[1][0] = 5
set AI_SY_Ability_Perceive[1][1] = 5
set AI_SY_Ability_Perceive[1][2] = 5
set AI_SY_Ability_Perceive[1][3] = 0
endif
//Wind Elude
if(true) then
set AI_SY_Ability_Cooldown[2][0] = 0
set AI_SY_Ability_Cooldown[2][1] = 0
set AI_SY_Ability_Cooldown[2][2] = 0
set AI_SY_Ability_Cooldown[2][3] = 0
set AI_SY_Ability_Mana[2][0] = 0
set AI_SY_Ability_Mana[2][1] = 0
set AI_SY_Ability_Mana[2][2] = 0
set AI_SY_Ability_Mana[2][3] = 0
set AI_SY_Ability_Range[2][0] = 0.0
set AI_SY_Ability_Range[2][1] = 0.0
set AI_SY_Ability_Range[2][2] = 0.0
set AI_SY_Ability_Range[2][3] = 0.0
set AI_SY_Ability_Detect_Area[2][0] = 0.0
set AI_SY_Ability_Detect_Area[2][1] = 0.0
set AI_SY_Ability_Detect_Area[2][2] = 0.0
set AI_SY_Ability_Detect_Area[2][3] = 0.0
set AI_SY_Ability_Area[2][0] = 0.0
set AI_SY_Ability_Area[2][1] = 0.0
set AI_SY_Ability_Area[2][2] = 0.0
set AI_SY_Ability_Area[2][3] = 0.0
set AI_SY_Ability_Mode[2][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SY_Ability_Mode[2][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SY_Ability_Mode[2][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SY_Ability_Mode[2][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SY_Ability_Perceive[2][0] = 0
set AI_SY_Ability_Perceive[2][1] = 0
set AI_SY_Ability_Perceive[2][2] = 0
set AI_SY_Ability_Perceive[2][3] = 0
endif
//Turbine
if(true) then
set AI_SY_Ability_Cooldown[3][0] = 20
set AI_SY_Ability_Cooldown[3][1] = 16
set AI_SY_Ability_Cooldown[3][2] = 10
set AI_SY_Ability_Cooldown[3][3] = 0
set AI_SY_Ability_Mana[3][0] = 160
set AI_SY_Ability_Mana[3][1] = 160
set AI_SY_Ability_Mana[3][2] = 160
set AI_SY_Ability_Mana[3][3] = 0
set AI_SY_Ability_Range[3][0] = 0.0
set AI_SY_Ability_Range[3][1] = 0.0
set AI_SY_Ability_Range[3][2] = 0.0
set AI_SY_Ability_Range[3][3] = 0.0
set AI_SY_Ability_Detect_Area[3][0] = 400.0
set AI_SY_Ability_Detect_Area[3][1] = 400.0
set AI_SY_Ability_Detect_Area[3][2] = 400.0
set AI_SY_Ability_Detect_Area[3][3] = 0.0
set AI_SY_Ability_Area[3][0] = 0.0
set AI_SY_Ability_Area[3][1] = 0.0
set AI_SY_Ability_Area[3][2] = 0.0
set AI_SY_Ability_Area[3][3] = 0.0
set AI_SY_Ability_Mode[3][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SY_Ability_Mode[3][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SY_Ability_Mode[3][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SY_Ability_Mode[3][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SY_Ability_Perceive[3][0] = 5
set AI_SY_Ability_Perceive[3][1] = 5
set AI_SY_Ability_Perceive[3][2] = 5
set AI_SY_Ability_Perceive[3][3] = 0
endif
//Colossal Cyclone
if(true) then
set AI_SY_Ability_Cooldown[4][0] = 50
set AI_SY_Ability_Cooldown[4][1] = 40
set AI_SY_Ability_Cooldown[4][2] = 0
set AI_SY_Ability_Cooldown[4][3] = 0
set AI_SY_Ability_Mana[4][0] = 100
set AI_SY_Ability_Mana[4][1] = 100
set AI_SY_Ability_Mana[4][2] = 0
set AI_SY_Ability_Mana[4][3] = 0
set AI_SY_Ability_Range[4][0] = 400.0
set AI_SY_Ability_Range[4][1] = 400.0
set AI_SY_Ability_Range[4][2] = 0.0
set AI_SY_Ability_Range[4][3] = 0.0
set AI_SY_Ability_Detect_Area[4][0] = 800.0
set AI_SY_Ability_Detect_Area[4][1] = 800.0
set AI_SY_Ability_Detect_Area[4][2] = 0.0
set AI_SY_Ability_Detect_Area[4][3] = 0.0
set AI_SY_Ability_Area[4][0] = 400.0
set AI_SY_Ability_Area[4][1] = 400.0
set AI_SY_Ability_Area[4][2] = 0.0
set AI_SY_Ability_Area[4][3] = 0.0
set AI_SY_Ability_Mode[4][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SY_Ability_Mode[4][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SY_Ability_Mode[4][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SY_Ability_Mode[4][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SY_Ability_Perceive[4][0] = 5
set AI_SY_Ability_Perceive[4][1] = 5
set AI_SY_Ability_Perceive[4][2] = 0
set AI_SY_Ability_Perceive[4][3] = 0
endif
endif
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope AIKnowledgeBH initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Damned Amok
if(true) then
set AI_Life_Zone[22][0] = 50
set AI_Life_Zone[22][1] = 70
set AI_Life_Zone[22][2] = 100
set AI_Mana_Zone[22][0] = 20
set AI_Mana_Zone[22][1] = 50
set AI_Mana_Zone[22][2] = 100
set AI_Attack_Range_Zone[22][0] = 200
set AI_Attack_Range_Zone[22][1] = 200
//Offense attitude
set AI_BH_Item_Total_Plan[0] = 20
if(true) then
//Arcanite Reaver
set AI_BH_Item_Plan[0][0] = 'rat6'
set AI_BH_Item_Plan[0][1] = 'stwp'
set AI_BH_Item_Plan[0][2] = 'prvt'
set AI_BH_Item_Plan[0][3] = 'rat6'
set AI_BH_Item_Plan[0][4] = 'stwp'
set AI_BH_Item_Plan[0][5] = 'prvt'
set AI_BH_Item_Point[0][0] = 1
set AI_BH_Item_Point[0][1] = 1
set AI_BH_Item_Point[0][2] = 1
set AI_BH_Item_Point[0][3] = 3
set AI_BH_Item_Point[0][4] = 3
set AI_BH_Item_Point[0][5] = 3
//Scourge Visor
set AI_BH_Item_Plan[0][6] = 'bgst'
set AI_BH_Item_Plan[0][7] = 'srrc'
set AI_BH_Item_Point[0][6] = 3
set AI_BH_Item_Point[0][7] = 3
//Fist of Firebringer
set AI_BH_Item_Plan[0][8] = 'gcel'
set AI_BH_Item_Plan[0][9] = 'rlif'
set AI_BH_Item_Plan[0][10] = 'gcel'
set AI_BH_Item_Plan[0][11] = 'rlif'
set AI_BH_Item_Point[0][8] = 2
set AI_BH_Item_Point[0][9] = 2
set AI_BH_Item_Point[0][10] = 3
set AI_BH_Item_Point[0][11] = 3
//Power Fragment
set AI_BH_Item_Plan[0][12] = 'pmna'
set AI_BH_Item_Plan[0][13] = 'sman'
set AI_BH_Item_Point[0][12] = 20
set AI_BH_Item_Point[0][13] = 20
//Amazon Meld
set AI_BH_Item_Plan[0][14] = 'I00R'
set AI_BH_Item_Plan[0][15] = 'I00R'
set AI_BH_Item_Plan[0][16] = 'I00P'
set AI_BH_Item_Point[0][14] = 5
set AI_BH_Item_Point[0][15] = 5
set AI_BH_Item_Point[0][16] = 8
//Brutalic
set AI_BH_Item_Plan[0][17] = 'I00G'
set AI_BH_Item_Plan[0][18] = 'I01B'
set AI_BH_Item_Point[0][17] = 16
set AI_BH_Item_Point[0][18] = 5
//Sneaker of Exzel
set AI_BH_Item_Plan[0][19] = 'I01T'
set AI_BH_Item_Point[0][19] = 20
endif
//Defense attitude (need to change)
set AI_BH_Item_Total_Plan[1] = 16
if(true) then
//Orb of Descent
set AI_BH_Item_Plan[1][0] = 'prvt'
set AI_BH_Item_Plan[1][1] = 'prvt'
set AI_BH_Item_Plan[1][2] = 'shea'
set AI_BH_Item_Point[1][0] = 2
set AI_BH_Item_Point[1][1] = 2
set AI_BH_Item_Point[1][2] = 2
//Power Fragment
set AI_BH_Item_Plan[1][3] = 'penr'
set AI_BH_Item_Plan[1][4] = 'penr'
set AI_BH_Item_Plan[1][5] = 'sman'
set AI_BH_Item_Point[1][3] = 1
set AI_BH_Item_Point[1][4] = 1
set AI_BH_Item_Point[1][5] = 5
//Sneaker of Exzel
set AI_BH_Item_Plan[1][6] = 'I00K'
set AI_BH_Item_Plan[1][7] = 'I00K'
set AI_BH_Item_Plan[1][8] = 'gcel'
set AI_BH_Item_Plan[1][9] = 'sres'
set AI_BH_Item_Point[1][6] = 5
set AI_BH_Item_Point[1][7] = 5
set AI_BH_Item_Point[1][8] = 5
set AI_BH_Item_Point[1][9] = 5
//Brutalic
set AI_BH_Item_Plan[1][10] = 'modt'
set AI_BH_Item_Plan[1][11] = 'I01B'
set AI_BH_Item_Plan[1][12] = 'I00G'
set AI_BH_Item_Point[1][10] = 5
set AI_BH_Item_Point[1][11] = 5
set AI_BH_Item_Point[1][12] = 5
//Mindseer of Ultimate
set AI_BH_Item_Plan[1][13] = 'I00M'
set AI_BH_Item_Plan[1][14] = 'I00I'
set AI_BH_Item_Point[1][13] = 12
set AI_BH_Item_Point[1][14] = 12
//Amazon Meld
set AI_BH_Item_Plan[1][15] = 'I002'
set AI_BH_Item_Point[1][15] = 30
endif
//General ability
if(true) then
set AI_Ability_Type[22][0] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[22][1] = ABILITY_TYPE_MOBILE_OFFENSE
set AI_Ability_Type[22][2] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[22][3] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[22][4] = ABILITY_TYPE_ULTIMATE
set AI_Ability_Order_Type[22][0] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[22][1] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[22][2] = ACTION_ORDER_TYPE_UNKNOWN
set AI_Ability_Order_Type[22][3] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[22][4] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Level[22][0] = 4
set AI_Ability_Level[22][1] = 3
set AI_Ability_Level[22][2] = 3
set AI_Ability_Level[22][3] = 3
set AI_Ability_Level[22][4] = 2
set AI_Ability_Type_Score[22][0] = 5
set AI_Ability_Type_Score[22][1] = 8
set AI_Ability_Type_Score[22][2] = 7
set AI_Ability_Type_Score[22][3] = 2
set AI_Ability_Type_Score[22][4] = 9
set AI_Ability_ID[22][0] = 'Absk'
set AI_Ability_ID[22][1] = 'AOw2'
set AI_Ability_ID[22][2] = 'A09P'
set AI_Ability_ID[22][3] = 'ACbb'
set AI_Ability_ID[22][4] = 'A09N'
set AI_Ability_Learn_Skip[22][0] = 2
set AI_Ability_Learn_Skip[22][1] = 2
set AI_Ability_Learn_Skip[22][2] = 2
set AI_Ability_Learn_Skip[22][3] = 2
set AI_Ability_Learn_Skip[22][4] = 7
set AI_Ability_Level_Required[22][0] = 0
set AI_Ability_Level_Required[22][1] = 0
set AI_Ability_Level_Required[22][2] = 0
set AI_Ability_Level_Required[22][3] = 0
set AI_Ability_Level_Required[22][4] = 6
set AI_Ability_Order[22][0] = "berserk"
set AI_Ability_Order[22][1] = "stomp"
set AI_Ability_Order[22][2] = ""
set AI_Ability_Order[22][3] = "bloodluston"
set AI_Ability_Order[22][4] = "whirlwind"
set AI_Ability_Order_Next[22][0] = ""
set AI_Ability_Order_Next[22][1] = ""
set AI_Ability_Order_Next[22][2] = ""
set AI_Ability_Order_Next[22][3] = ""
set AI_Ability_Order_Next[22][4] = ""
set AI_Ability_Buff[22][0] = 0
set AI_Ability_Buff[22][1] = 0
set AI_Ability_Buff[22][2] = 0
set AI_Ability_Buff[22][3] = 0
set AI_Ability_Buff[22][4] = 0
endif
//Beast Unleashed
if(true) then
set AI_BH_Ability_Cooldown[0][0] = 5
set AI_BH_Ability_Cooldown[0][1] = 5
set AI_BH_Ability_Cooldown[0][2] = 5
set AI_BH_Ability_Cooldown[0][3] = 5
set AI_BH_Ability_Mana[0][0] = 25
set AI_BH_Ability_Mana[0][1] = 25
set AI_BH_Ability_Mana[0][2] = 25
set AI_BH_Ability_Mana[0][3] = 25
set AI_BH_Ability_Range[0][0] = 400.0
set AI_BH_Ability_Range[0][1] = 400.0
set AI_BH_Ability_Range[0][2] = 400.0
set AI_BH_Ability_Range[0][3] = 400.0
set AI_BH_Ability_Detect_Area[0][0] = 400.0
set AI_BH_Ability_Detect_Area[0][1] = 400.0
set AI_BH_Ability_Detect_Area[0][2] = 400.0
set AI_BH_Ability_Detect_Area[0][3] = 400.0
set AI_BH_Ability_Area[0][0] = 0.0
set AI_BH_Ability_Area[0][1] = 0.0
set AI_BH_Ability_Area[0][2] = 0.0
set AI_BH_Ability_Area[0][3] = 0.0
set AI_BH_Ability_Mode[0][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_BH_Ability_Mode[0][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_BH_Ability_Mode[0][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_BH_Ability_Mode[0][3] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_BH_Ability_Perceive[0][0] = 5
set AI_BH_Ability_Perceive[0][1] = 5
set AI_BH_Ability_Perceive[0][2] = 5
set AI_BH_Ability_Perceive[0][3] = 5
endif
//Savage Stomp
if(true) then
set AI_BH_Ability_Cooldown[1][0] = 2
set AI_BH_Ability_Cooldown[1][1] = 2
set AI_BH_Ability_Cooldown[1][2] = 2
set AI_BH_Ability_Cooldown[1][3] = 0
set AI_BH_Ability_Mana[1][0] = 40
set AI_BH_Ability_Mana[1][1] = 50
set AI_BH_Ability_Mana[1][2] = 60
set AI_BH_Ability_Mana[1][3] = 0
set AI_BH_Ability_Range[1][0] = 300.0
set AI_BH_Ability_Range[1][1] = 300.0
set AI_BH_Ability_Range[1][2] = 300.0
set AI_BH_Ability_Range[1][3] = 0.0
set AI_BH_Ability_Detect_Area[1][0] = 200.0
set AI_BH_Ability_Detect_Area[1][1] = 200.0
set AI_BH_Ability_Detect_Area[1][2] = 200.0
set AI_BH_Ability_Detect_Area[1][3] = 0.0
set AI_BH_Ability_Area[1][0] = 0.0
set AI_BH_Ability_Area[1][1] = 0.0
set AI_BH_Ability_Area[1][2] = 0.0
set AI_BH_Ability_Area[1][3] = 0.0
set AI_BH_Ability_Mode[1][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_BH_Ability_Mode[1][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_BH_Ability_Mode[1][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_BH_Ability_Mode[1][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_BH_Ability_Perceive[1][0] = 5
set AI_BH_Ability_Perceive[1][1] = 5
set AI_BH_Ability_Perceive[1][2] = 5
set AI_BH_Ability_Perceive[1][3] = 0
endif
//Breaking Axe
if(true) then
set AI_BH_Ability_Cooldown[2][0] = 0
set AI_BH_Ability_Cooldown[2][1] = 0
set AI_BH_Ability_Cooldown[2][2] = 0
set AI_BH_Ability_Cooldown[2][3] = 0
set AI_BH_Ability_Mana[2][0] = 0
set AI_BH_Ability_Mana[2][1] = 0
set AI_BH_Ability_Mana[2][2] = 0
set AI_BH_Ability_Mana[2][3] = 0
set AI_BH_Ability_Range[2][0] = 0.0
set AI_BH_Ability_Range[2][1] = 0.0
set AI_BH_Ability_Range[2][2] = 0.0
set AI_BH_Ability_Range[2][3] = 0.0
set AI_BH_Ability_Detect_Area[2][0] = 0.0
set AI_BH_Ability_Detect_Area[2][1] = 0.0
set AI_BH_Ability_Detect_Area[2][2] = 0.0
set AI_BH_Ability_Detect_Area[2][3] = 0.0
set AI_BH_Ability_Area[2][0] = 0.0
set AI_BH_Ability_Area[2][1] = 0.0
set AI_BH_Ability_Area[2][2] = 0.0
set AI_BH_Ability_Area[2][3] = 0.0
set AI_BH_Ability_Mode[2][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_BH_Ability_Mode[2][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_BH_Ability_Mode[2][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_BH_Ability_Mode[2][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_BH_Ability_Perceive[2][0] = 0
set AI_BH_Ability_Perceive[2][1] = 0
set AI_BH_Ability_Perceive[2][2] = 0
set AI_BH_Ability_Perceive[2][3] = 0
endif
//Battle Roar
if(true) then
set AI_BH_Ability_Cooldown[3][0] = 60
set AI_BH_Ability_Cooldown[3][1] = 60
set AI_BH_Ability_Cooldown[3][2] = 60
set AI_BH_Ability_Cooldown[3][3] = 0
set AI_BH_Ability_Mana[3][0] = 0
set AI_BH_Ability_Mana[3][1] = 0
set AI_BH_Ability_Mana[3][2] = 0
set AI_BH_Ability_Mana[3][3] = 0
set AI_BH_Ability_Range[3][0] = 0.0
set AI_BH_Ability_Range[3][1] = 0.0
set AI_BH_Ability_Range[3][2] = 0.0
set AI_BH_Ability_Range[3][3] = 0.0
set AI_BH_Ability_Detect_Area[3][0] = 2000.0
set AI_BH_Ability_Detect_Area[3][1] = 2000.0
set AI_BH_Ability_Detect_Area[3][2] = 2000.0
set AI_BH_Ability_Detect_Area[3][3] = 0.0
set AI_BH_Ability_Area[3][0] = 0.0
set AI_BH_Ability_Area[3][1] = 0.0
set AI_BH_Ability_Area[3][2] = 0.0
set AI_BH_Ability_Area[3][3] = 0.0
set AI_BH_Ability_Mode[3][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_BH_Ability_Mode[3][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_BH_Ability_Mode[3][2] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_BH_Ability_Mode[3][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_BH_Ability_Perceive[3][0] = 5
set AI_BH_Ability_Perceive[3][1] = 5
set AI_BH_Ability_Perceive[3][2] = 5
set AI_BH_Ability_Perceive[3][3] = 0
endif
//Shade Shift
if(true) then
set AI_BH_Ability_Cooldown[4][0] = 25
set AI_BH_Ability_Cooldown[4][1] = 20
set AI_BH_Ability_Cooldown[4][2] = 0
set AI_BH_Ability_Cooldown[4][3] = 0
set AI_BH_Ability_Mana[4][0] = 200
set AI_BH_Ability_Mana[4][1] = 200
set AI_BH_Ability_Mana[4][2] = 0
set AI_BH_Ability_Mana[4][3] = 0
set AI_BH_Ability_Range[4][0] = 0.0
set AI_BH_Ability_Range[4][1] = 0.0
set AI_BH_Ability_Range[4][2] = 0.0
set AI_BH_Ability_Range[4][3] = 0.0
set AI_BH_Ability_Detect_Area[4][0] = 2000.0
set AI_BH_Ability_Detect_Area[4][1] = 2000.0
set AI_BH_Ability_Detect_Area[4][2] = 0.0
set AI_BH_Ability_Detect_Area[4][3] = 0.0
set AI_BH_Ability_Area[4][0] = 0.0
set AI_BH_Ability_Area[4][1] = 0.0
set AI_BH_Ability_Area[4][2] = 0.0
set AI_BH_Ability_Area[4][3] = 0.0
set AI_BH_Ability_Mode[4][0] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_BH_Ability_Mode[4][1] = KNOWLEDGE_ABILITY_MODE_SELF
set AI_BH_Ability_Mode[4][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_BH_Ability_Mode[4][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_BH_Ability_Perceive[4][0] = 5
set AI_BH_Ability_Perceive[4][1] = 5
set AI_BH_Ability_Perceive[4][2] = 0
set AI_BH_Ability_Perceive[4][3] = 0
endif
endif
endfunction
endscope
//TESH.scrollpos=120
//TESH.alwaysfold=0
scope AIKnowledgeSK initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Snake Widow
if(true) then
set AI_Life_Zone[23][0] = 50
set AI_Life_Zone[23][1] = 70
set AI_Life_Zone[23][2] = 100
set AI_Mana_Zone[23][0] = 20
set AI_Mana_Zone[23][1] = 50
set AI_Mana_Zone[23][2] = 100
set AI_Attack_Range_Zone[23][0] = 200
set AI_Attack_Range_Zone[23][1] = 500
//Offense attitude
set AI_SK_Item_Total_Plan[0] = 20
if(true) then
//Arcanite Reaver
set AI_SK_Item_Plan[0][0] = 'rat6'
set AI_SK_Item_Plan[0][1] = 'stwp'
set AI_SK_Item_Plan[0][2] = 'prvt'
set AI_SK_Item_Plan[0][3] = 'rat6'
set AI_SK_Item_Plan[0][4] = 'stwp'
set AI_SK_Item_Plan[0][5] = 'prvt'
set AI_SK_Item_Point[0][0] = 1
set AI_SK_Item_Point[0][1] = 1
set AI_SK_Item_Point[0][2] = 1
set AI_SK_Item_Point[0][3] = 3
set AI_SK_Item_Point[0][4] = 3
set AI_SK_Item_Point[0][5] = 3
//Scourge Visor
set AI_SK_Item_Plan[0][6] = 'bgst'
set AI_SK_Item_Plan[0][7] = 'srrc'
set AI_SK_Item_Point[0][6] = 3
set AI_SK_Item_Point[0][7] = 3
//Fist of Firebringer
set AI_SK_Item_Plan[0][8] = 'gcel'
set AI_SK_Item_Plan[0][9] = 'rlif'
set AI_SK_Item_Plan[0][10] = 'gcel'
set AI_SK_Item_Plan[0][11] = 'rlif'
set AI_SK_Item_Point[0][8] = 2
set AI_SK_Item_Point[0][9] = 2
set AI_SK_Item_Point[0][10] = 3
set AI_SK_Item_Point[0][11] = 3
//Power Fragment
set AI_SK_Item_Plan[0][12] = 'pmna'
set AI_SK_Item_Plan[0][13] = 'sman'
set AI_SK_Item_Point[0][12] = 20
set AI_SK_Item_Point[0][13] = 20
//Amazon Meld
set AI_SK_Item_Plan[0][14] = 'I00R'
set AI_SK_Item_Plan[0][15] = 'I00R'
set AI_SK_Item_Plan[0][16] = 'I00P'
set AI_SK_Item_Point[0][14] = 5
set AI_SK_Item_Point[0][15] = 5
set AI_SK_Item_Point[0][16] = 8
//Brutalic
set AI_SK_Item_Plan[0][17] = 'I00G'
set AI_SK_Item_Plan[0][18] = 'I01B'
set AI_SK_Item_Point[0][17] = 16
set AI_SK_Item_Point[0][18] = 5
//Sneaker of Exzel
set AI_SK_Item_Plan[0][19] = 'I01T'
set AI_SK_Item_Point[0][19] = 20
endif
//Defense attitude (need to change)
set AI_SK_Item_Total_Plan[1] = 16
if(true) then
//Orb of Descent
set AI_SK_Item_Plan[1][0] = 'prvt'
set AI_SK_Item_Plan[1][1] = 'prvt'
set AI_SK_Item_Plan[1][2] = 'shea'
set AI_SK_Item_Point[1][0] = 2
set AI_SK_Item_Point[1][1] = 2
set AI_SK_Item_Point[1][2] = 2
//Power Fragment
set AI_SK_Item_Plan[1][3] = 'penr'
set AI_SK_Item_Plan[1][4] = 'penr'
set AI_SK_Item_Plan[1][5] = 'sman'
set AI_SK_Item_Point[1][3] = 1
set AI_SK_Item_Point[1][4] = 1
set AI_SK_Item_Point[1][5] = 5
//Sneaker of Exzel
set AI_SK_Item_Plan[1][6] = 'I00K'
set AI_SK_Item_Plan[1][7] = 'I00K'
set AI_SK_Item_Plan[1][8] = 'gcel'
set AI_SK_Item_Plan[1][9] = 'sres'
set AI_SK_Item_Point[1][6] = 5
set AI_SK_Item_Point[1][7] = 5
set AI_SK_Item_Point[1][8] = 5
set AI_SK_Item_Point[1][9] = 5
//Brutalic
set AI_SK_Item_Plan[1][10] = 'modt'
set AI_SK_Item_Plan[1][11] = 'I01B'
set AI_SK_Item_Plan[1][12] = 'I00G'
set AI_SK_Item_Point[1][10] = 5
set AI_SK_Item_Point[1][11] = 5
set AI_SK_Item_Point[1][12] = 5
//Mindseer of Ultimate
set AI_SK_Item_Plan[1][13] = 'I00M'
set AI_SK_Item_Plan[1][14] = 'I00I'
set AI_SK_Item_Point[1][13] = 12
set AI_SK_Item_Point[1][14] = 12
//Amazon Meld
set AI_SK_Item_Plan[1][15] = 'I002'
set AI_SK_Item_Point[1][15] = 30
endif
//General ability
if(true) then
set AI_Ability_Type[23][0] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[23][1] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[23][2] = ABILITY_TYPE_MOBILE
set AI_Ability_Type[23][3] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[23][4] = ABILITY_TYPE_ULTIMATE
set AI_Ability_Order_Type[23][0] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[23][1] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[23][2] = ACTION_ORDER_TYPE_UNKNOWN
set AI_Ability_Order_Type[23][3] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[23][4] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Level[23][0] = 4
set AI_Ability_Level[23][1] = 3
set AI_Ability_Level[23][2] = 3
set AI_Ability_Level[23][3] = 3
set AI_Ability_Level[23][4] = 2
set AI_Ability_Type_Score[23][0] = 4
set AI_Ability_Type_Score[23][1] = 6
set AI_Ability_Type_Score[23][2] = 1
set AI_Ability_Type_Score[23][3] = 2
set AI_Ability_Type_Score[23][4] = 7
set AI_Ability_ID[23][0] = 'A09R'
set AI_Ability_ID[23][1] = 'A09Q'
set AI_Ability_ID[23][2] = 'A09S'
set AI_Ability_ID[23][3] = 'Arpb'
set AI_Ability_ID[23][4] = 'A09T'
set AI_Ability_Learn_Skip[23][0] = 2
set AI_Ability_Learn_Skip[23][1] = 2
set AI_Ability_Learn_Skip[23][2] = 2
set AI_Ability_Learn_Skip[23][3] = 2
set AI_Ability_Learn_Skip[23][4] = 7
set AI_Ability_Level_Required[23][0] = 0
set AI_Ability_Level_Required[23][1] = 0
set AI_Ability_Level_Required[23][2] = 0
set AI_Ability_Level_Required[23][3] = 0
set AI_Ability_Level_Required[23][4] = 6
set AI_Ability_Order[23][0] = "web"
set AI_Ability_Order[23][1] = "weboff"
set AI_Ability_Order[23][2] = ""
set AI_Ability_Order[23][3] = ""
set AI_Ability_Order[23][4] = "whirlwind"
set AI_Ability_Order_Next[23][0] = ""
set AI_Ability_Order_Next[23][1] = ""
set AI_Ability_Order_Next[23][2] = ""
set AI_Ability_Order_Next[23][3] = ""
set AI_Ability_Order_Next[23][4] = ""
set AI_Ability_Buff[23][0] = 0
set AI_Ability_Buff[23][1] = 0
set AI_Ability_Buff[23][2] = 0
set AI_Ability_Buff[23][3] = 0
set AI_Ability_Buff[23][4] = 0
endif
//Constrictions
if(true) then
set AI_SK_Ability_Cooldown[0][0] = 18
set AI_SK_Ability_Cooldown[0][1] = 17
set AI_SK_Ability_Cooldown[0][2] = 15
set AI_SK_Ability_Cooldown[0][3] = 12
set AI_SK_Ability_Mana[0][0] = 90
set AI_SK_Ability_Mana[0][1] = 90
set AI_SK_Ability_Mana[0][2] = 90
set AI_SK_Ability_Mana[0][3] = 90
set AI_SK_Ability_Range[0][0] = 800.0
set AI_SK_Ability_Range[0][1] = 800.0
set AI_SK_Ability_Range[0][2] = 800.0
set AI_SK_Ability_Range[0][3] = 800.0
set AI_SK_Ability_Detect_Area[0][0] = 400.0
set AI_SK_Ability_Detect_Area[0][1] = 400.0
set AI_SK_Ability_Detect_Area[0][2] = 400.0
set AI_SK_Ability_Detect_Area[0][3] = 400.0
set AI_SK_Ability_Area[0][0] = 0.0
set AI_SK_Ability_Area[0][1] = 0.0
set AI_SK_Ability_Area[0][2] = 0.0
set AI_SK_Ability_Area[0][3] = 0.0
set AI_SK_Ability_Mode[0][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SK_Ability_Mode[0][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SK_Ability_Mode[0][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SK_Ability_Mode[0][3] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SK_Ability_Perceive[0][0] = 5
set AI_SK_Ability_Perceive[0][1] = 5
set AI_SK_Ability_Perceive[0][2] = 5
set AI_SK_Ability_Perceive[0][3] = 5
endif
//Fan of Fangs
if(true) then
set AI_SK_Ability_Cooldown[1][0] = 12
set AI_SK_Ability_Cooldown[1][1] = 12
set AI_SK_Ability_Cooldown[1][2] = 12
set AI_SK_Ability_Cooldown[1][3] = 0
set AI_SK_Ability_Mana[1][0] = 170
set AI_SK_Ability_Mana[1][1] = 170
set AI_SK_Ability_Mana[1][2] = 170
set AI_SK_Ability_Mana[1][3] = 0
set AI_SK_Ability_Range[1][0] = 1500.0
set AI_SK_Ability_Range[1][1] = 1500.0
set AI_SK_Ability_Range[1][2] = 1500.0
set AI_SK_Ability_Range[1][3] = 0.0
set AI_SK_Ability_Detect_Area[1][0] = 1000.0
set AI_SK_Ability_Detect_Area[1][1] = 1000.0
set AI_SK_Ability_Detect_Area[1][2] = 1000.0
set AI_SK_Ability_Detect_Area[1][3] = 0.0
set AI_SK_Ability_Area[1][0] = 0.0
set AI_SK_Ability_Area[1][1] = 0.0
set AI_SK_Ability_Area[1][2] = 0.0
set AI_SK_Ability_Area[1][3] = 0.0
set AI_SK_Ability_Mode[1][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SK_Ability_Mode[1][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SK_Ability_Mode[1][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SK_Ability_Mode[1][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SK_Ability_Perceive[1][0] = 5
set AI_SK_Ability_Perceive[1][1] = 5
set AI_SK_Ability_Perceive[1][2] = 5
set AI_SK_Ability_Perceive[1][3] = 0
endif
//Glide
if(true) then
set AI_SK_Ability_Cooldown[2][0] = 0
set AI_SK_Ability_Cooldown[2][1] = 0
set AI_SK_Ability_Cooldown[2][2] = 0
set AI_SK_Ability_Cooldown[2][3] = 0
set AI_SK_Ability_Mana[2][0] = 0
set AI_SK_Ability_Mana[2][1] = 0
set AI_SK_Ability_Mana[2][2] = 0
set AI_SK_Ability_Mana[2][3] = 0
set AI_SK_Ability_Range[2][0] = 0.0
set AI_SK_Ability_Range[2][1] = 0.0
set AI_SK_Ability_Range[2][2] = 0.0
set AI_SK_Ability_Range[2][3] = 0.0
set AI_SK_Ability_Detect_Area[2][0] = 0.0
set AI_SK_Ability_Detect_Area[2][1] = 0.0
set AI_SK_Ability_Detect_Area[2][2] = 0.0
set AI_SK_Ability_Detect_Area[2][3] = 0.0
set AI_SK_Ability_Area[2][0] = 0.0
set AI_SK_Ability_Area[2][1] = 0.0
set AI_SK_Ability_Area[2][2] = 0.0
set AI_SK_Ability_Area[2][3] = 0.0
set AI_SK_Ability_Mode[2][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SK_Ability_Mode[2][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SK_Ability_Mode[2][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SK_Ability_Mode[2][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SK_Ability_Perceive[2][0] = 0
set AI_SK_Ability_Perceive[2][1] = 0
set AI_SK_Ability_Perceive[2][2] = 0
set AI_SK_Ability_Perceive[2][3] = 0
endif
//Replenish
if(true) then
set AI_SK_Ability_Cooldown[3][0] = 60
set AI_SK_Ability_Cooldown[3][1] = 60
set AI_SK_Ability_Cooldown[3][2] = 60
set AI_SK_Ability_Cooldown[3][3] = 0
set AI_SK_Ability_Mana[3][0] = 0
set AI_SK_Ability_Mana[3][1] = 0
set AI_SK_Ability_Mana[3][2] = 0
set AI_SK_Ability_Mana[3][3] = 0
set AI_SK_Ability_Range[3][0] = 0.0
set AI_SK_Ability_Range[3][1] = 0.0
set AI_SK_Ability_Range[3][2] = 0.0
set AI_SK_Ability_Range[3][3] = 0.0
set AI_SK_Ability_Detect_Area[3][0] = 2000.0
set AI_SK_Ability_Detect_Area[3][1] = 2000.0
set AI_SK_Ability_Detect_Area[3][2] = 2000.0
set AI_SK_Ability_Detect_Area[3][3] = 0.0
set AI_SK_Ability_Area[3][0] = 0.0
set AI_SK_Ability_Area[3][1] = 0.0
set AI_SK_Ability_Area[3][2] = 0.0
set AI_SK_Ability_Area[3][3] = 0.0
set AI_SK_Ability_Mode[3][0] = KNOWLEDGE_ABILITY_MODE_ALLY
set AI_SK_Ability_Mode[3][1] = KNOWLEDGE_ABILITY_MODE_ALLY
set AI_SK_Ability_Mode[3][2] = KNOWLEDGE_ABILITY_MODE_ALLY
set AI_SK_Ability_Mode[3][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SK_Ability_Perceive[3][0] = 5
set AI_SK_Ability_Perceive[3][1] = 5
set AI_SK_Ability_Perceive[3][2] = 5
set AI_SK_Ability_Perceive[3][3] = 0
endif
//Paralyzing Gaze
if(true) then
set AI_SK_Ability_Cooldown[4][0] = 70
set AI_SK_Ability_Cooldown[4][1] = 35
set AI_SK_Ability_Cooldown[4][2] = 0
set AI_SK_Ability_Cooldown[4][3] = 0
set AI_SK_Ability_Mana[4][0] = 400
set AI_SK_Ability_Mana[4][1] = 400
set AI_SK_Ability_Mana[4][2] = 0
set AI_SK_Ability_Mana[4][3] = 0
set AI_SK_Ability_Range[4][0] = 0.0
set AI_SK_Ability_Range[4][1] = 0.0
set AI_SK_Ability_Range[4][2] = 0.0
set AI_SK_Ability_Range[4][3] = 0.0
set AI_SK_Ability_Detect_Area[4][0] = 1200.0
set AI_SK_Ability_Detect_Area[4][1] = 1200.0
set AI_SK_Ability_Detect_Area[4][2] = 0.0
set AI_SK_Ability_Detect_Area[4][3] = 0.0
set AI_SK_Ability_Area[4][0] = 0.0
set AI_SK_Ability_Area[4][1] = 0.0
set AI_SK_Ability_Area[4][2] = 0.0
set AI_SK_Ability_Area[4][3] = 0.0
set AI_SK_Ability_Mode[4][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SK_Ability_Mode[4][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_SK_Ability_Mode[4][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SK_Ability_Mode[4][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_SK_Ability_Perceive[4][0] = 5
set AI_SK_Ability_Perceive[4][1] = 5
set AI_SK_Ability_Perceive[4][2] = 0
set AI_SK_Ability_Perceive[4][3] = 0
endif
endif
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope AIKnowledgeFC initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//First Conjurer
if(true) then
set AI_Life_Zone[24][0] = 50
set AI_Life_Zone[24][1] = 70
set AI_Life_Zone[24][2] = 100
set AI_Mana_Zone[24][0] = 20
set AI_Mana_Zone[24][1] = 50
set AI_Mana_Zone[24][2] = 100
set AI_Attack_Range_Zone[24][0] = 200
set AI_Attack_Range_Zone[24][1] = 200
//Offense attitude
set AI_FC_Item_Total_Plan[0] = 20
if(true) then
//Arcanite Reaver
set AI_FC_Item_Plan[0][0] = 'rat6'
set AI_FC_Item_Plan[0][1] = 'stwp'
set AI_FC_Item_Plan[0][2] = 'prvt'
set AI_FC_Item_Plan[0][3] = 'rat6'
set AI_FC_Item_Plan[0][4] = 'stwp'
set AI_FC_Item_Plan[0][5] = 'prvt'
set AI_FC_Item_Point[0][0] = 1
set AI_FC_Item_Point[0][1] = 1
set AI_FC_Item_Point[0][2] = 1
set AI_FC_Item_Point[0][3] = 3
set AI_FC_Item_Point[0][4] = 3
set AI_FC_Item_Point[0][5] = 3
//Scourge Visor
set AI_FC_Item_Plan[0][6] = 'bgst'
set AI_FC_Item_Plan[0][7] = 'srrc'
set AI_FC_Item_Point[0][6] = 3
set AI_FC_Item_Point[0][7] = 3
//Fist of Firebringer
set AI_FC_Item_Plan[0][8] = 'gcel'
set AI_FC_Item_Plan[0][9] = 'rlif'
set AI_FC_Item_Plan[0][10] = 'gcel'
set AI_FC_Item_Plan[0][11] = 'rlif'
set AI_FC_Item_Point[0][8] = 2
set AI_FC_Item_Point[0][9] = 2
set AI_FC_Item_Point[0][10] = 3
set AI_FC_Item_Point[0][11] = 3
//Power Fragment
set AI_FC_Item_Plan[0][12] = 'pmna'
set AI_FC_Item_Plan[0][13] = 'sman'
set AI_FC_Item_Point[0][12] = 20
set AI_FC_Item_Point[0][13] = 20
//Amazon Meld
set AI_FC_Item_Plan[0][14] = 'I00R'
set AI_FC_Item_Plan[0][15] = 'I00R'
set AI_FC_Item_Plan[0][16] = 'I00P'
set AI_FC_Item_Point[0][14] = 5
set AI_FC_Item_Point[0][15] = 5
set AI_FC_Item_Point[0][16] = 8
//Brutalic
set AI_FC_Item_Plan[0][17] = 'I00G'
set AI_FC_Item_Plan[0][18] = 'I01B'
set AI_FC_Item_Point[0][17] = 16
set AI_FC_Item_Point[0][18] = 5
//Sneaker of Exzel
set AI_FC_Item_Plan[0][19] = 'I01T'
set AI_FC_Item_Point[0][19] = 20
endif
//Defense attitude (need to change)
set AI_FC_Item_Total_Plan[1] = 16
if(true) then
//Orb of Descent
set AI_FC_Item_Plan[1][0] = 'prvt'
set AI_FC_Item_Plan[1][1] = 'prvt'
set AI_FC_Item_Plan[1][2] = 'shea'
set AI_FC_Item_Point[1][0] = 2
set AI_FC_Item_Point[1][1] = 2
set AI_FC_Item_Point[1][2] = 2
//Power Fragment
set AI_FC_Item_Plan[1][3] = 'penr'
set AI_FC_Item_Plan[1][4] = 'penr'
set AI_FC_Item_Plan[1][5] = 'sman'
set AI_FC_Item_Point[1][3] = 1
set AI_FC_Item_Point[1][4] = 1
set AI_FC_Item_Point[1][5] = 5
//Sneaker of Exzel
set AI_FC_Item_Plan[1][6] = 'I00K'
set AI_FC_Item_Plan[1][7] = 'I00K'
set AI_FC_Item_Plan[1][8] = 'gcel'
set AI_FC_Item_Plan[1][9] = 'sres'
set AI_FC_Item_Point[1][6] = 5
set AI_FC_Item_Point[1][7] = 5
set AI_FC_Item_Point[1][8] = 5
set AI_FC_Item_Point[1][9] = 5
//Brutalic
set AI_FC_Item_Plan[1][10] = 'modt'
set AI_FC_Item_Plan[1][11] = 'I01B'
set AI_FC_Item_Plan[1][12] = 'I00G'
set AI_FC_Item_Point[1][10] = 5
set AI_FC_Item_Point[1][11] = 5
set AI_FC_Item_Point[1][12] = 5
//Mindseer of Ultimate
set AI_FC_Item_Plan[1][13] = 'I00M'
set AI_FC_Item_Plan[1][14] = 'I00I'
set AI_FC_Item_Point[1][13] = 12
set AI_FC_Item_Point[1][14] = 12
//Amazon Meld
set AI_FC_Item_Plan[1][15] = 'I002'
set AI_FC_Item_Point[1][15] = 30
endif
//General ability
if(true) then
set AI_Ability_Type[24][0] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[24][1] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[24][2] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[24][3] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[24][4] = ABILITY_TYPE_ULTIMATE
set AI_Ability_Order_Type[24][0] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Order_Type[24][1] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[24][2] = ACTION_ORDER_TYPE_UNKNOWN
set AI_Ability_Order_Type[24][3] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Order_Type[24][4] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Level[24][0] = 4
set AI_Ability_Level[24][1] = 3
set AI_Ability_Level[24][2] = 3
set AI_Ability_Level[24][3] = 3
set AI_Ability_Level[24][4] = 2
set AI_Ability_Type_Score[24][0] = 3
set AI_Ability_Type_Score[24][1] = 8
set AI_Ability_Type_Score[24][2] = 5
set AI_Ability_Type_Score[24][3] = 7
set AI_Ability_Type_Score[24][4] = 10
set AI_Ability_ID[24][0] = 'A0A9'
set AI_Ability_ID[24][1] = 'A0AA'
set AI_Ability_ID[24][2] = 'A0AF'
set AI_Ability_ID[24][3] = 'A0AB'
set AI_Ability_ID[24][4] = 'A0AG'
set AI_Ability_Learn_Skip[24][0] = 2
set AI_Ability_Learn_Skip[24][1] = 2
set AI_Ability_Learn_Skip[24][2] = 2
set AI_Ability_Learn_Skip[24][3] = 2
set AI_Ability_Learn_Skip[24][4] = 7
set AI_Ability_Level_Required[24][0] = 0
set AI_Ability_Level_Required[24][1] = 0
set AI_Ability_Level_Required[24][2] = 0
set AI_Ability_Level_Required[24][3] = 0
set AI_Ability_Level_Required[24][4] = 6
set AI_Ability_Order[24][0] = "mirrorimage"
set AI_Ability_Order[24][1] = "web"
set AI_Ability_Order[24][2] = ""
set AI_Ability_Order[24][3] = "weboff"
set AI_Ability_Order[24][4] = "whirlwind"
set AI_Ability_Order_Next[24][0] = ""
set AI_Ability_Order_Next[24][1] = ""
set AI_Ability_Order_Next[24][2] = ""
set AI_Ability_Order_Next[24][3] = ""
set AI_Ability_Order_Next[24][4] = ""
set AI_Ability_Buff[24][0] = 0
set AI_Ability_Buff[24][1] = 0
set AI_Ability_Buff[24][2] = 0
set AI_Ability_Buff[24][3] = 0
set AI_Ability_Buff[24][4] = 0
endif
//Conjuring Image
if(true) then
set AI_FC_Ability_Cooldown[0][0] = 9
set AI_FC_Ability_Cooldown[0][1] = 8
set AI_FC_Ability_Cooldown[0][2] = 6
set AI_FC_Ability_Cooldown[0][3] = 3
set AI_FC_Ability_Mana[0][0] = 90
set AI_FC_Ability_Mana[0][1] = 90
set AI_FC_Ability_Mana[0][2] = 90
set AI_FC_Ability_Mana[0][3] = 90
set AI_FC_Ability_Range[0][0] = 0.0
set AI_FC_Ability_Range[0][1] = 0.0
set AI_FC_Ability_Range[0][2] = 0.0
set AI_FC_Ability_Range[0][3] = 0.0
set AI_FC_Ability_Detect_Area[0][0] = 800.0
set AI_FC_Ability_Detect_Area[0][1] = 800.0
set AI_FC_Ability_Detect_Area[0][2] = 800.0
set AI_FC_Ability_Detect_Area[0][3] = 800.0
set AI_FC_Ability_Area[0][0] = 0.0
set AI_FC_Ability_Area[0][1] = 0.0
set AI_FC_Ability_Area[0][2] = 0.0
set AI_FC_Ability_Area[0][3] = 0.0
set AI_FC_Ability_Mode[0][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_FC_Ability_Mode[0][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_FC_Ability_Mode[0][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_FC_Ability_Mode[0][3] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_FC_Ability_Perceive[0][0] = 5
set AI_FC_Ability_Perceive[0][1] = 5
set AI_FC_Ability_Perceive[0][2] = 5
set AI_FC_Ability_Perceive[0][3] = 5
endif
//Juxtapose
if(true) then
set AI_FC_Ability_Cooldown[1][0] = 5
set AI_FC_Ability_Cooldown[1][1] = 5
set AI_FC_Ability_Cooldown[1][2] = 5
set AI_FC_Ability_Cooldown[1][3] = 0
set AI_FC_Ability_Mana[1][0] = 25
set AI_FC_Ability_Mana[1][1] = 40
set AI_FC_Ability_Mana[1][2] = 55
set AI_FC_Ability_Mana[1][3] = 0
set AI_FC_Ability_Range[1][0] = 800.0
set AI_FC_Ability_Range[1][1] = 800.0
set AI_FC_Ability_Range[1][2] = 800.0
set AI_FC_Ability_Range[1][3] = 0.0
set AI_FC_Ability_Detect_Area[1][0] = 1000.0
set AI_FC_Ability_Detect_Area[1][1] = 1000.0
set AI_FC_Ability_Detect_Area[1][2] = 1000.0
set AI_FC_Ability_Detect_Area[1][3] = 0.0
set AI_FC_Ability_Area[1][0] = 0.0
set AI_FC_Ability_Area[1][1] = 0.0
set AI_FC_Ability_Area[1][2] = 0.0
set AI_FC_Ability_Area[1][3] = 0.0
set AI_FC_Ability_Mode[1][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_FC_Ability_Mode[1][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_FC_Ability_Mode[1][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_FC_Ability_Mode[1][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_FC_Ability_Perceive[1][0] = 15
set AI_FC_Ability_Perceive[1][1] = 15
set AI_FC_Ability_Perceive[1][2] = 15
set AI_FC_Ability_Perceive[1][3] = 0
endif
//Disappearance
if(true) then
set AI_FC_Ability_Cooldown[2][0] = 0
set AI_FC_Ability_Cooldown[2][1] = 0
set AI_FC_Ability_Cooldown[2][2] = 0
set AI_FC_Ability_Cooldown[2][3] = 0
set AI_FC_Ability_Mana[2][0] = 0
set AI_FC_Ability_Mana[2][1] = 0
set AI_FC_Ability_Mana[2][2] = 0
set AI_FC_Ability_Mana[2][3] = 0
set AI_FC_Ability_Range[2][0] = 0.0
set AI_FC_Ability_Range[2][1] = 0.0
set AI_FC_Ability_Range[2][2] = 0.0
set AI_FC_Ability_Range[2][3] = 0.0
set AI_FC_Ability_Detect_Area[2][0] = 0.0
set AI_FC_Ability_Detect_Area[2][1] = 0.0
set AI_FC_Ability_Detect_Area[2][2] = 0.0
set AI_FC_Ability_Detect_Area[2][3] = 0.0
set AI_FC_Ability_Area[2][0] = 0.0
set AI_FC_Ability_Area[2][1] = 0.0
set AI_FC_Ability_Area[2][2] = 0.0
set AI_FC_Ability_Area[2][3] = 0.0
set AI_FC_Ability_Mode[2][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_FC_Ability_Mode[2][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_FC_Ability_Mode[2][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_FC_Ability_Mode[2][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_FC_Ability_Perceive[2][0] = 0
set AI_FC_Ability_Perceive[2][1] = 0
set AI_FC_Ability_Perceive[2][2] = 0
set AI_FC_Ability_Perceive[2][3] = 0
endif
//Hallucination
if(true) then
set AI_FC_Ability_Cooldown[3][0] = 9
set AI_FC_Ability_Cooldown[3][1] = 7
set AI_FC_Ability_Cooldown[3][2] = 5
set AI_FC_Ability_Cooldown[3][3] = 0
set AI_FC_Ability_Mana[3][0] = 50
set AI_FC_Ability_Mana[3][1] = 75
set AI_FC_Ability_Mana[3][2] = 100
set AI_FC_Ability_Mana[3][3] = 0
set AI_FC_Ability_Range[3][0] = 1000.0
set AI_FC_Ability_Range[3][1] = 1400.0
set AI_FC_Ability_Range[3][2] = 1800.0
set AI_FC_Ability_Range[3][3] = 0.0
set AI_FC_Ability_Detect_Area[3][0] = 1200.0
set AI_FC_Ability_Detect_Area[3][1] = 1600.0
set AI_FC_Ability_Detect_Area[3][2] = 2000.0
set AI_FC_Ability_Detect_Area[3][3] = 0.0
set AI_FC_Ability_Area[3][0] = 0.0
set AI_FC_Ability_Area[3][1] = 0.0
set AI_FC_Ability_Area[3][2] = 0.0
set AI_FC_Ability_Area[3][3] = 0.0
set AI_FC_Ability_Mode[3][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_FC_Ability_Mode[3][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_FC_Ability_Mode[3][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_FC_Ability_Mode[3][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_FC_Ability_Perceive[3][0] = 5
set AI_FC_Ability_Perceive[3][1] = 5
set AI_FC_Ability_Perceive[3][2] = 5
set AI_FC_Ability_Perceive[3][3] = 0
endif
//Gates of Deception
if(true) then
set AI_FC_Ability_Cooldown[4][0] = 30
set AI_FC_Ability_Cooldown[4][1] = 25
set AI_FC_Ability_Cooldown[4][2] = 0
set AI_FC_Ability_Cooldown[4][3] = 0
set AI_FC_Ability_Mana[4][0] = 200
set AI_FC_Ability_Mana[4][1] = 200
set AI_FC_Ability_Mana[4][2] = 0
set AI_FC_Ability_Mana[4][3] = 0
set AI_FC_Ability_Range[4][0] = 0.0
set AI_FC_Ability_Range[4][1] = 0.0
set AI_FC_Ability_Range[4][2] = 0.0
set AI_FC_Ability_Range[4][3] = 0.0
set AI_FC_Ability_Detect_Area[4][0] = 600.0
set AI_FC_Ability_Detect_Area[4][1] = 600.0
set AI_FC_Ability_Detect_Area[4][2] = 0.0
set AI_FC_Ability_Detect_Area[4][3] = 0.0
set AI_FC_Ability_Area[4][0] = 0.0
set AI_FC_Ability_Area[4][1] = 0.0
set AI_FC_Ability_Area[4][2] = 0.0
set AI_FC_Ability_Area[4][3] = 0.0
set AI_FC_Ability_Mode[4][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_FC_Ability_Mode[4][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_FC_Ability_Mode[4][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_FC_Ability_Mode[4][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_FC_Ability_Perceive[4][0] = 5
set AI_FC_Ability_Perceive[4][1] = 5
set AI_FC_Ability_Perceive[4][2] = 0
set AI_FC_Ability_Perceive[4][3] = 0
endif
endif
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope AIKnowledgeVC initializer Init
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//Volcanic Core
if(true) then
set AI_Life_Zone[25][0] = 50
set AI_Life_Zone[25][1] = 70
set AI_Life_Zone[25][2] = 100
set AI_Mana_Zone[25][0] = 20
set AI_Mana_Zone[25][1] = 50
set AI_Mana_Zone[25][2] = 100
set AI_Attack_Range_Zone[25][0] = 200
set AI_Attack_Range_Zone[25][1] = 500
//Offense attitude
set AI_VC_Item_Total_Plan[0] = 20
if(true) then
//Arcanite Reaver
set AI_VC_Item_Plan[0][0] = 'rat6'
set AI_VC_Item_Plan[0][1] = 'stwp'
set AI_VC_Item_Plan[0][2] = 'prvt'
set AI_VC_Item_Plan[0][3] = 'rat6'
set AI_VC_Item_Plan[0][4] = 'stwp'
set AI_VC_Item_Plan[0][5] = 'prvt'
set AI_VC_Item_Point[0][0] = 1
set AI_VC_Item_Point[0][1] = 1
set AI_VC_Item_Point[0][2] = 1
set AI_VC_Item_Point[0][3] = 3
set AI_VC_Item_Point[0][4] = 3
set AI_VC_Item_Point[0][5] = 3
//Scourge Visor
set AI_VC_Item_Plan[0][6] = 'bgst'
set AI_VC_Item_Plan[0][7] = 'srrc'
set AI_VC_Item_Point[0][6] = 3
set AI_VC_Item_Point[0][7] = 3
//Fist of Firebringer
set AI_VC_Item_Plan[0][8] = 'gcel'
set AI_VC_Item_Plan[0][9] = 'rlif'
set AI_VC_Item_Plan[0][10] = 'gcel'
set AI_VC_Item_Plan[0][11] = 'rlif'
set AI_VC_Item_Point[0][8] = 2
set AI_VC_Item_Point[0][9] = 2
set AI_VC_Item_Point[0][10] = 3
set AI_VC_Item_Point[0][11] = 3
//Power Fragment
set AI_VC_Item_Plan[0][12] = 'pmna'
set AI_VC_Item_Plan[0][13] = 'sman'
set AI_VC_Item_Point[0][12] = 20
set AI_VC_Item_Point[0][13] = 20
//Amazon Meld
set AI_VC_Item_Plan[0][14] = 'I00R'
set AI_VC_Item_Plan[0][15] = 'I00R'
set AI_VC_Item_Plan[0][16] = 'I00P'
set AI_VC_Item_Point[0][14] = 5
set AI_VC_Item_Point[0][15] = 5
set AI_VC_Item_Point[0][16] = 8
//Brutalic
set AI_VC_Item_Plan[0][17] = 'I00G'
set AI_VC_Item_Plan[0][18] = 'I01B'
set AI_VC_Item_Point[0][17] = 16
set AI_VC_Item_Point[0][18] = 5
//Sneaker of Exzel
set AI_VC_Item_Plan[0][19] = 'I01T'
set AI_VC_Item_Point[0][19] = 20
endif
//Defense attitude (need to change)
set AI_VC_Item_Total_Plan[1] = 16
if(true) then
//Orb of Descent
set AI_VC_Item_Plan[1][0] = 'prvt'
set AI_VC_Item_Plan[1][1] = 'prvt'
set AI_VC_Item_Plan[1][2] = 'shea'
set AI_VC_Item_Point[1][0] = 2
set AI_VC_Item_Point[1][1] = 2
set AI_VC_Item_Point[1][2] = 2
//Power Fragment
set AI_VC_Item_Plan[1][3] = 'penr'
set AI_VC_Item_Plan[1][4] = 'penr'
set AI_VC_Item_Plan[1][5] = 'sman'
set AI_VC_Item_Point[1][3] = 1
set AI_VC_Item_Point[1][4] = 1
set AI_VC_Item_Point[1][5] = 5
//Sneaker of Exzel
set AI_VC_Item_Plan[1][6] = 'I00K'
set AI_VC_Item_Plan[1][7] = 'I00K'
set AI_VC_Item_Plan[1][8] = 'gcel'
set AI_VC_Item_Plan[1][9] = 'sres'
set AI_VC_Item_Point[1][6] = 5
set AI_VC_Item_Point[1][7] = 5
set AI_VC_Item_Point[1][8] = 5
set AI_VC_Item_Point[1][9] = 5
//Brutalic
set AI_VC_Item_Plan[1][10] = 'modt'
set AI_VC_Item_Plan[1][11] = 'I01B'
set AI_VC_Item_Plan[1][12] = 'I00G'
set AI_VC_Item_Point[1][10] = 5
set AI_VC_Item_Point[1][11] = 5
set AI_VC_Item_Point[1][12] = 5
//Mindseer of Ultimate
set AI_VC_Item_Plan[1][13] = 'I00M'
set AI_VC_Item_Plan[1][14] = 'I00I'
set AI_VC_Item_Point[1][13] = 12
set AI_VC_Item_Point[1][14] = 12
//Amazon Meld
set AI_VC_Item_Plan[1][15] = 'I002'
set AI_VC_Item_Point[1][15] = 30
endif
//General ability
if(true) then
set AI_Ability_Type[25][0] = ABILITY_TYPE_OFFENSE
set AI_Ability_Type[25][1] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[25][2] = ABILITY_TYPE_DEFENSE
set AI_Ability_Type[25][3] = ABILITY_TYPE_MOBILE
set AI_Ability_Type[25][4] = ABILITY_TYPE_ULTIMATE
set AI_Ability_Order_Type[25][0] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[25][1] = ACTION_ORDER_TYPE_UNKNOWN
set AI_Ability_Order_Type[25][2] = ACTION_ORDER_TYPE_TARGET
set AI_Ability_Order_Type[25][3] = ACTION_ORDER_TYPE_POINT
set AI_Ability_Order_Type[25][4] = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Ability_Level[25][0] = 4
set AI_Ability_Level[25][1] = 3
set AI_Ability_Level[25][2] = 3
set AI_Ability_Level[25][3] = 3
set AI_Ability_Level[25][4] = 2
set AI_Ability_Type_Score[25][0] = 8
set AI_Ability_Type_Score[25][1] = 7
set AI_Ability_Type_Score[25][2] = 7
set AI_Ability_Type_Score[25][3] = 3
set AI_Ability_Type_Score[25][4] = 7
set AI_Ability_ID[25][0] = 'A0AI'
set AI_Ability_ID[25][1] = 'A0AJ'
set AI_Ability_ID[25][2] = 'A0AL'
set AI_Ability_ID[25][3] = 'A0AM'
set AI_Ability_ID[25][4] = 'A0AO'
set AI_Ability_Learn_Skip[25][0] = 2
set AI_Ability_Learn_Skip[25][1] = 2
set AI_Ability_Learn_Skip[25][2] = 2
set AI_Ability_Learn_Skip[25][3] = 2
set AI_Ability_Learn_Skip[25][4] = 7
set AI_Ability_Level_Required[25][0] = 0
set AI_Ability_Level_Required[25][1] = 0
set AI_Ability_Level_Required[25][2] = 0
set AI_Ability_Level_Required[25][3] = 0
set AI_Ability_Level_Required[25][4] = 6
set AI_Ability_Order[25][0] = "web"
set AI_Ability_Order[25][1] = ""
set AI_Ability_Order[25][2] = "wispharvest"
set AI_Ability_Order[25][3] = "windwalk"
set AI_Ability_Order[25][4] = "whirlwind"
set AI_Ability_Order_Next[25][0] = ""
set AI_Ability_Order_Next[25][1] = ""
set AI_Ability_Order_Next[25][2] = ""
set AI_Ability_Order_Next[25][3] = ""
set AI_Ability_Order_Next[25][4] = ""
set AI_Ability_Buff[25][0] = 0
set AI_Ability_Buff[25][1] = 0
set AI_Ability_Buff[25][2] = 0
set AI_Ability_Buff[25][3] = 0
set AI_Ability_Buff[25][4] = 0
endif
//Rupturing Magma
if(true) then
set AI_VC_Ability_Cooldown[0][0] = 15
set AI_VC_Ability_Cooldown[0][1] = 15
set AI_VC_Ability_Cooldown[0][2] = 15
set AI_VC_Ability_Cooldown[0][3] = 15
set AI_VC_Ability_Mana[0][0] = 80
set AI_VC_Ability_Mana[0][1] = 100
set AI_VC_Ability_Mana[0][2] = 120
set AI_VC_Ability_Mana[0][3] = 140
set AI_VC_Ability_Range[0][0] = 0.0
set AI_VC_Ability_Range[0][1] = 0.0
set AI_VC_Ability_Range[0][2] = 0.0
set AI_VC_Ability_Range[0][3] = 0.0
set AI_VC_Ability_Detect_Area[0][0] = 900.0
set AI_VC_Ability_Detect_Area[0][1] = 900.0
set AI_VC_Ability_Detect_Area[0][2] = 900.0
set AI_VC_Ability_Detect_Area[0][3] = 900.0
set AI_VC_Ability_Area[0][0] = 0.0
set AI_VC_Ability_Area[0][1] = 0.0
set AI_VC_Ability_Area[0][2] = 0.0
set AI_VC_Ability_Area[0][3] = 0.0
set AI_VC_Ability_Mode[0][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_VC_Ability_Mode[0][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_VC_Ability_Mode[0][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_VC_Ability_Mode[0][3] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_VC_Ability_Perceive[0][0] = 5
set AI_VC_Ability_Perceive[0][1] = 5
set AI_VC_Ability_Perceive[0][2] = 5
set AI_VC_Ability_Perceive[0][3] = 5
endif
//Lava Birth
if(true) then
set AI_VC_Ability_Cooldown[1][0] = 0
set AI_VC_Ability_Cooldown[1][1] = 0
set AI_VC_Ability_Cooldown[1][2] = 0
set AI_VC_Ability_Cooldown[1][3] = 0
set AI_VC_Ability_Mana[1][0] = 0
set AI_VC_Ability_Mana[1][1] = 0
set AI_VC_Ability_Mana[1][2] = 0
set AI_VC_Ability_Mana[1][3] = 0
set AI_VC_Ability_Range[1][0] = 0.0
set AI_VC_Ability_Range[1][1] = 0.0
set AI_VC_Ability_Range[1][2] = 0.0
set AI_VC_Ability_Range[1][3] = 0.0
set AI_VC_Ability_Detect_Area[1][0] = 0.0
set AI_VC_Ability_Detect_Area[1][1] = 0.0
set AI_VC_Ability_Detect_Area[1][2] = 0.0
set AI_VC_Ability_Detect_Area[1][3] = 0.0
set AI_VC_Ability_Area[1][0] = 0.0
set AI_VC_Ability_Area[1][1] = 0.0
set AI_VC_Ability_Area[1][2] = 0.0
set AI_VC_Ability_Area[1][3] = 0.0
set AI_VC_Ability_Mode[1][0] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_VC_Ability_Mode[1][1] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_VC_Ability_Mode[1][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_VC_Ability_Mode[1][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_VC_Ability_Perceive[1][0] = 0
set AI_VC_Ability_Perceive[1][1] = 0
set AI_VC_Ability_Perceive[1][2] = 0
set AI_VC_Ability_Perceive[1][3] = 0
endif
//Consume Warmth
if(true) then
set AI_VC_Ability_Cooldown[2][0] = 3
set AI_VC_Ability_Cooldown[2][1] = 3
set AI_VC_Ability_Cooldown[2][2] = 3
set AI_VC_Ability_Cooldown[2][3] = 0
set AI_VC_Ability_Mana[2][0] = 0
set AI_VC_Ability_Mana[2][1] = 0
set AI_VC_Ability_Mana[2][2] = 0
set AI_VC_Ability_Mana[2][3] = 0
set AI_VC_Ability_Range[2][0] = 1000.0
set AI_VC_Ability_Range[2][1] = 1000.0
set AI_VC_Ability_Range[2][2] = 1000.0
set AI_VC_Ability_Range[2][3] = 0.0
set AI_VC_Ability_Detect_Area[2][0] = 1000.0
set AI_VC_Ability_Detect_Area[2][1] = 1000.0
set AI_VC_Ability_Detect_Area[2][2] = 1000.0
set AI_VC_Ability_Detect_Area[2][3] = 0.0
set AI_VC_Ability_Area[2][0] = 0.0
set AI_VC_Ability_Area[2][1] = 0.0
set AI_VC_Ability_Area[2][2] = 0.0
set AI_VC_Ability_Area[2][3] = 0.0
set AI_VC_Ability_Mode[2][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_VC_Ability_Mode[2][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_VC_Ability_Mode[2][2] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_VC_Ability_Mode[2][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_VC_Ability_Perceive[2][0] = 5
set AI_VC_Ability_Perceive[2][1] = 5
set AI_VC_Ability_Perceive[2][2] = 5
set AI_VC_Ability_Perceive[2][3] = 0
endif
//Molten Flow
if(true) then
set AI_VC_Ability_Cooldown[3][0] = 14
set AI_VC_Ability_Cooldown[3][1] = 11
set AI_VC_Ability_Cooldown[3][2] = 7
set AI_VC_Ability_Cooldown[3][3] = 0
set AI_VC_Ability_Mana[3][0] = 0
set AI_VC_Ability_Mana[3][1] = 0
set AI_VC_Ability_Mana[3][2] = 0
set AI_VC_Ability_Mana[3][3] = 0
set AI_VC_Ability_Range[3][0] = 2000.0
set AI_VC_Ability_Range[3][1] = 2000.0
set AI_VC_Ability_Range[3][2] = 2000.0
set AI_VC_Ability_Range[3][3] = 0.0
set AI_VC_Ability_Detect_Area[3][0] = 2200.0
set AI_VC_Ability_Detect_Area[3][1] = 2200.0
set AI_VC_Ability_Detect_Area[3][2] = 2200.0
set AI_VC_Ability_Detect_Area[3][3] = 0.0
set AI_VC_Ability_Area[3][0] = 0.0
set AI_VC_Ability_Area[3][1] = 0.0
set AI_VC_Ability_Area[3][2] = 0.0
set AI_VC_Ability_Area[3][3] = 0.0
set AI_VC_Ability_Mode[3][0] = KNOWLEDGE_ABILITY_MODE_ALLY
set AI_VC_Ability_Mode[3][1] = KNOWLEDGE_ABILITY_MODE_ALLY
set AI_VC_Ability_Mode[3][2] = KNOWLEDGE_ABILITY_MODE_ALLY
set AI_VC_Ability_Mode[3][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_VC_Ability_Perceive[3][0] = 5
set AI_VC_Ability_Perceive[3][1] = 5
set AI_VC_Ability_Perceive[3][2] = 5
set AI_VC_Ability_Perceive[3][3] = 0
endif
//Volcanic Eruption
if(true) then
set AI_VC_Ability_Cooldown[4][0] = 0
set AI_VC_Ability_Cooldown[4][1] = 0
set AI_VC_Ability_Cooldown[4][2] = 0
set AI_VC_Ability_Cooldown[4][3] = 0
set AI_VC_Ability_Mana[4][0] = 0
set AI_VC_Ability_Mana[4][1] = 0
set AI_VC_Ability_Mana[4][2] = 0
set AI_VC_Ability_Mana[4][3] = 0
set AI_VC_Ability_Range[4][0] = 0.0
set AI_VC_Ability_Range[4][1] = 0.0
set AI_VC_Ability_Range[4][2] = 0.0
set AI_VC_Ability_Range[4][3] = 0.0
set AI_VC_Ability_Detect_Area[4][0] = 700.0
set AI_VC_Ability_Detect_Area[4][1] = 700.0
set AI_VC_Ability_Detect_Area[4][2] = 0.0
set AI_VC_Ability_Detect_Area[4][3] = 0.0
set AI_VC_Ability_Area[4][0] = 0.0
set AI_VC_Ability_Area[4][1] = 0.0
set AI_VC_Ability_Area[4][2] = 0.0
set AI_VC_Ability_Area[4][3] = 0.0
set AI_VC_Ability_Mode[4][0] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_VC_Ability_Mode[4][1] = KNOWLEDGE_ABILITY_MODE_ENEMY
set AI_VC_Ability_Mode[4][2] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_VC_Ability_Mode[4][3] = KNOWLEDGE_ABILITY_MODE_UNKNOWN
set AI_VC_Ability_Perceive[4][0] = 5
set AI_VC_Ability_Perceive[4][1] = 5
set AI_VC_Ability_Perceive[4][2] = 0
set AI_VC_Ability_Perceive[4][3] = 0
endif
endif
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
globals
constant string SAY_TEXT = " : "
constant integer TOTAL_TEXT_TYPE_MEMORY = 10
constant integer TEXT_TYPE_UNKNOWN = 0
constant integer TEXT_TYPE_GOOD_GAME = 1
constant integer TEXT_TYPE_REMAKE = 2
constant integer TOTAL_GOOD_GAME_TEXT = 10
string array GOOD_GAME_TEXT[TOTAL_GOOD_GAME_TEXT]
constant integer TOTAL_REMAKE_TEXT = 10
string array REMAKE_TEXT[TOTAL_REMAKE_TEXT]
endglobals
scope AICommunication initializer Init
//----------------------------------------------------------------
function Communicate_All takes player p, string text returns nothing
call DisplayTextToForce(Players, Player_Name[GetPlayerId(p)] + SAY_TEXT + text)
endfunction
//----------------------------------------------------------------
function Communication takes AI_Base_Data ad returns nothing
local integer memoryInteger1 = 0
local boolean continue = false
if(ad.s == STATE_HERO_READY) then
if(GamePhase == GAME_PHASE_END) then
set continue = true
set memoryInteger1 = 0
loop
exitwhen(memoryInteger1 >= TOTAL_TEXT_TYPE_MEMORY)
if(continue) then
if(ad.pt[memoryInteger1] == TEXT_TYPE_REMAKE) then
set continue = false
endif
endif
set memoryInteger1 = memoryInteger1 + 1
endloop
if(continue) then
set AI_Text = REMAKE_TEXT[GetRandomInt(0, TOTAL_REMAKE_TEXT - 1)]
set AI_Action_Text = ACTION_TEXT_ALL
set AI_Text_Type = TEXT_TYPE_REMAKE
endif
endif
elseif(ad.s == STATE_HERO_NEED_KILL) then
if(GamePhase == GAME_PHASE_END) then
set continue = true
set memoryInteger1 = 0
loop
exitwhen(memoryInteger1 >= TOTAL_TEXT_TYPE_MEMORY)
if(continue) then
if(ad.pt[memoryInteger1] == TEXT_TYPE_GOOD_GAME) then
set continue = false
endif
endif
set memoryInteger1 = memoryInteger1 + 1
endloop
if(continue) then
set AI_Text = GOOD_GAME_TEXT[GetRandomInt(0, TOTAL_GOOD_GAME_TEXT - 1)]
set AI_Action_Text = ACTION_TEXT_ALL
set AI_Text_Type = TEXT_TYPE_GOOD_GAME
endif
endif
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
set GOOD_GAME_TEXT[0] = "GG"
set GOOD_GAME_TEXT[1] = "gg"
set GOOD_GAME_TEXT[2] = "Good Game"
set GOOD_GAME_TEXT[3] = "Good game"
set GOOD_GAME_TEXT[4] = "Ggwp"
set GOOD_GAME_TEXT[5] = "Well played"
set GOOD_GAME_TEXT[6] = "Good job team"
set GOOD_GAME_TEXT[7] = "Lol"
set GOOD_GAME_TEXT[8] = "Good job all"
set GOOD_GAME_TEXT[9] = "Try again!"
set REMAKE_TEXT[0] = "GG"
set REMAKE_TEXT[1] = "gg"
set REMAKE_TEXT[2] = "Good Game"
set REMAKE_TEXT[3] = "Good game"
set REMAKE_TEXT[4] = "Ggwp"
set REMAKE_TEXT[5] = "Well played"
set REMAKE_TEXT[6] = "Remake please"
set REMAKE_TEXT[7] = "Rmk"
set REMAKE_TEXT[8] = "zzz"
set REMAKE_TEXT[9] = "Host create again"
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
globals
constant integer PERCEIVE_NONE = 0
constant integer PERCEIVE_NEGATIVE = 1
constant integer PERCEIVE_NO = 2
constant integer PERCEIVE_OKEY = 3
constant integer PERCEIVE_FINE = 4
constant integer PERCEIVE_YES = 5
constant integer PERCEIVE_POSITIVE = 6
constant integer PERCEIVE_DEFAULT_VALUE = 0
constant integer PERCEIVE_MAX_LEVEL_PICK_HERO = 2
constant real PERCEIVE_DETECT_ENEMY_RADIUS = 1000.0
constant real PERCEIVE_DETECT_ENEMY_UNIT_RADIUS = 500.0
constant real PERCEIVE_DETECT_ENEMY_HERO_RADIUS = 1000.0
constant real PERCEIVE_REPOSITIONING_DETECT_ENEMY_HERO_RADIUS = 1000.0
constant integer PERCEIVE_MAX_LEVEL_RADIUS_DETECT_HERO = 3
constant integer PERCEIVE_MAX_LEVEL_CARE_HERO = 1
constant integer PERCEIVE_MAX_LEVEL_RADIUS_DETECT_ENEMY = 30
constant real PERCEIVE_FOLLOW_DISTANCE = 300.0
constant real PERCEIVE_LOAD_DISTANCE = 200.0
constant integer PERCEIVE_MAX_LEVEL_IMMOBILE = 5
constant integer PERCEIVE_MAX_LEVEL_CHASE_HERO = 30
constant real PERCEIVE_PULLING_DISTANCE = 100.0
constant integer PERCEIVE_MAX_LEVEL_DANGER = 3
constant integer PERCEIVE_MAX_LEVEL_CAST = 1
constant integer PERCEIVE_MAX_LEVEL_RECAST = 20
constant integer PERCEIVE_MAX_LEVEL_CASTING = 10
constant integer PERCEIVE_MAX_LEVEL_CAST_EFFECT = 600
constant real PERCEIVE_DETECT_ITEM_RADIUS = 1000.0
integer array Perceive_Score[7]
endglobals
scope AIPerceive initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
//----------------------------------------------------------------
function Hero_Life_Mode takes integer mode returns integer
if(mode == 0) then //Min
return Perceive_Score[PERCEIVE_NEGATIVE]
elseif(mode == 1) then //Max
return Perceive_Score[PERCEIVE_YES]
else
return 0
endif
endfunction
//----------------------------------------------------------------
function Hero_Mana_Mode takes integer mode returns integer
if(mode == 0) then //Min
return Perceive_Score[PERCEIVE_NO]
elseif(mode == 1) then //Max
return Perceive_Score[PERCEIVE_POSITIVE]
else
return 0
endif
endfunction
//----------------------------------------------------------------
function Hero_Attack_Range_Mode takes integer mode returns integer
if(mode == 0) then //Min
return Perceive_Score[PERCEIVE_OKEY]
elseif(mode == 1) then //Max
return Perceive_Score[PERCEIVE_POSITIVE]
else
return 0
endif
endfunction
//----------------------------------------------------------------
function Perceive takes AI_Base_Data ad returns nothing
if(ad.s == STATE_INTRO) then
if(GamePhase == GAME_PHASE_READY or GamePhase == GAME_PHASE_START) then
if(GameMode == MODE_NORMAL or GameMode == MODE_ALLPICK or GameMode == MODE_TEST) then
set AI_Action = ACTION_PICK_HERO
else
set AI_Action = ACTION_WAIT
endif
else
set AI_Action = ACTION_NONE
endif
endif
endfunction
//----------------------------------------------------------------
function Perceive_Unit_Invulnerable takes unit u returns boolean
local boolean okey = (GetUnitAbilityLevel(u, 'Avul') > 0)
set u = null
return okey
endfunction
//----------------------------------------------------------------
function Perceive_Level_Hero_Life takes unit u, integer index returns integer
local integer perceiving = PERCEIVE_NONE
local real memoryReal1 = 0.0
local real memoryReal2 = 0.0
local real memoryReal3 = 0.0
local real life = 0.0
local real maxLife = 0.0
set memoryReal1 = GetLifeZone(index, LIFE_ZONE_RED) * 0.01
set memoryReal2 = GetLifeZone(index, LIFE_ZONE_YELLOW) * 0.01
set memoryReal3 = GetLifeZone(index, LIFE_ZONE_GREEN) * 0.01
set life = GetUnitState(u, UNIT_STATE_LIFE)
set maxLife = GetUnitState(u, UNIT_STATE_MAX_LIFE)
if(life <= (memoryReal1 * maxLife)) then
set perceiving = PERCEIVE_NEGATIVE
elseif(life <= (memoryReal2 * maxLife)) then
set perceiving = PERCEIVE_OKEY
elseif(life <= (memoryReal3 * maxLife)) then
set perceiving = PERCEIVE_YES
endif
set u = null
return perceiving
endfunction
//----------------------------------------------------------------
function Perceive_Level_Hero_Mana takes unit u, integer index returns integer
local integer perceiving = PERCEIVE_NONE
local real memoryReal1 = 0.0
local real memoryReal2 = 0.0
local real memoryReal3 = 0.0
local real mana = 0.0
local real maxMana = 0.0
set memoryReal1 = GetManaZone(index, MANA_ZONE_RED) * 0.01
set memoryReal2 = GetManaZone(index, MANA_ZONE_YELLOW) * 0.01
set memoryReal3 = GetManaZone(index, MANA_ZONE_GREEN) * 0.01
set mana = GetUnitState(u, UNIT_STATE_MANA)
set maxMana = GetUnitState(u, UNIT_STATE_MAX_MANA)
if(mana <= (memoryReal1 * maxMana)) then
set perceiving = PERCEIVE_NO
elseif(mana <= (memoryReal2 * maxMana)) then
set perceiving = PERCEIVE_FINE
elseif(mana <= (memoryReal3 * maxMana)) then
set perceiving = PERCEIVE_POSITIVE
endif
set u = null
return perceiving
endfunction
//----------------------------------------------------------------
function Perceive_Level_Hero_Attack_Range takes unit u, unit t, integer index returns integer
local integer perceiving = PERCEIVE_NONE
local real memoryReal1 = 0.0
local real memoryReal2 = 0.0
local real uX = GetUnitX(u)
local real uY = GetUnitY(u)
local real tX = GetUnitX(u)
local real tY = GetUnitY(u)
local real dx = uX - tX
local real dy = uY - tY
local real distance = SquareRoot(dx * dx + dy * dy)
set memoryReal1 = GetAttackZone(index, ATTACK_RANGE_ZONE_NEAR) * 0.01
set memoryReal2 = GetAttackZone(index, ATTACK_RANGE_ZONE_FAR) * 0.01
if(distance < memoryReal1) then
set perceiving = PERCEIVE_POSITIVE
elseif(distance < memoryReal2) then
set perceiving = PERCEIVE_FINE
else
set perceiving = PERCEIVE_OKEY
endif
set u = null
set t = null
return perceiving
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//setting globals
set Perceive_Score[0] = 0
set Perceive_Score[1] = 1
set Perceive_Score[2] = 2
set Perceive_Score[3] = 3
set Perceive_Score[4] = 4
set Perceive_Score[5] = 5
set Perceive_Score[6] = 6
endfunction
endscope
//TESH.scrollpos=931
//TESH.alwaysfold=0
scope AIPerceiveHero initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and /*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and /*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Item affected
private function Targets_Item takes item target returns boolean
return GetItemType(target) != ITEM_TYPE_PERMANENT and /*
*/IsItemVisible(target) and /*
*/target != null and /*
*/GetWidgetLife(target) > 0
endfunction
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private group all
private boolexpr bexpr
private rect rct
private location loc
private boolexpr bexprItem
private item targetItem
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Pick_Item takes nothing returns boolean
local item filtered = GetFilterItem()
local boolean isTargets = Targets_Item(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Action_Item takes nothing returns nothing
if(targetItem == null) then
set targetItem = GetEnumItem()
endif
endfunction
//----------------------------------------------------------------
function Perceive_Hero takes AI_Base_Data ad, integer ct_index returns nothing
local real perceive = 0.0
local real maxScore = 0.0
local boolean continue = false
local real memoryReal1 = 0.0
local real memoryReal2 = 0.0
local real memoryReal3 = 0.0
local real memoryReal4 = 0.0
local integer memoryInteger1 = 0
local integer memoryInteger2 = 0
local boolean memoryBoolean1 = false
local unit memoryUnit1 = null
local real x = 0.0
local real y = 0.0
local real tX = 0.0
local real tY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local unit f = null
if(ad.s == STATE_PICK_HERO) then
if(ad.u == null) then
set memoryInteger1 = GetPlayerId(ad.p)
if(ad.v[ct_index] > PERCEIVE_MAX_LEVEL_PICK_HERO * memoryInteger1) then
set AI_Action = ACTION_PICK_HERO
else
set AI_Action = ACTION_PERCEIVE
endif
else
set AI_Action = ACTION_GET_READY
endif
elseif(ad.s == STATE_HERO_INIT) then
if(GameMode == MODE_ALLRANDOM or GameMode == MODE_ALLSAME) then
if(GetHero(ad.p) == null) then
set AI_Action = ACTION_WAIT
else
set AI_Action = ACTION_INIT
endif
else
if(ad.u == null) then
set AI_Action = ACTION_PICK_HERO
else
set AI_Action = ACTION_GET_READY
endif
endif
elseif(ad.s == STATE_HERO_NEED_READY) then
if(not IsUnitDead(ad.u)) then
set continue = (not IsUnitInGroup(ad.u, LoadedHero))
if(continue) then
if(Conqueror[0] != Guardian[0]) then
set continue = (ad.u != Conqueror[0])
else
set continue = true
endif
if(continue) then
set perceive = perceive + (Perceive_Score[Perceive_Level_Hero_Life(ad.u, ad.un)] * LIFE_WEIGHTAGE)
set maxScore = maxScore + Hero_Life_Mode(1) * LIFE_WEIGHTAGE
if((perceive * TOTAL_SCORE_ATTITUDE) / maxScore < AI_Player_Attitude[GetPlayerId(ad.p)][0]) then
set continue = false
else
set continue = true
endif
if(continue) then
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set memoryInteger1 = 0
call GroupEnumUnitsInRange(all, x, y, PERCEIVE_DETECT_ENEMY_RADIUS + PERCEIVE_DETECT_ENEMY_RADIUS * ad.v[ct_index], bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, ad.p) and /*
*/(IsUnitVisible(f, ad.p)) and /*
*/(not (NeglectingUnits(f)))) then
set memoryInteger1 = memoryInteger1 + 1
endif
endloop
if(memoryInteger1 > 0) then
set AI_Action = ACTION_GET_READY
else
if(GamePhase == GAME_PHASE_END) then
set AI_Order = "stop"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_GET_READY
else
//set memoryInteger1 = GetRandomInt(50, 100)
//set memoryReal1 = GetRandomReal(0.0, 360.0) * bj_DEGTORAD
//set tX = x + memoryInteger1 * Cos(memoryReal1)
//set tY = y + memoryInteger1 * Sin(memoryReal1)
set tX = GetRectCenterX(KNOWLEDGE_READY_BOTTOM_RIGHT)
set tY = GetRectCenterY(KNOWLEDGE_READY_BOTTOM_RIGHT)
set dx = x - tX
set dy = y - tY
set distance = SquareRoot(dx * dx + dy * dy)
set memoryReal1 = distance
set tX = GetRectCenterX(KNOWLEDGE_READY_TOP_RIGHT)
set tY = GetRectCenterY(KNOWLEDGE_READY_TOP_RIGHT)
set dx = x - tX
set dy = y - tY
set distance = SquareRoot(dx * dx + dy * dy)
set memoryReal2 = distance
set tX = GetRectCenterX(KNOWLEDGE_READY_BOTTOM_LEFT)
set tY = GetRectCenterY(KNOWLEDGE_READY_BOTTOM_LEFT)
set dx = x - tX
set dy = y - tY
set distance = SquareRoot(dx * dx + dy * dy)
set memoryReal3 = distance
set tX = GetRectCenterX(KNOWLEDGE_READY_TOP_LEFT)
set tY = GetRectCenterY(KNOWLEDGE_READY_TOP_LEFT)
set dx = x - tX
set dy = y - tY
set distance = SquareRoot(dx * dx + dy * dy)
set memoryReal4 = distance
set memoryInteger1 = 0
if(memoryReal1 > memoryReal2) then
set memoryInteger1 = 1
endif
if(memoryInteger1 == 1) then
if(memoryReal2 > memoryReal3) then
set memoryInteger1 = 2
endif
elseif(memoryInteger1 == 0) then
if(memoryReal1 > memoryReal3) then
set memoryInteger1 = 2
endif
endif
if(memoryInteger1 == 2) then
if(memoryReal3 > memoryReal4) then
set memoryInteger1 = 3
endif
elseif(memoryInteger1 == 1) then
if(memoryReal2 > memoryReal4) then
set memoryInteger1 = 3
endif
elseif(memoryInteger1 == 0) then
if(memoryReal1 > memoryReal4) then
set memoryInteger1 = 3
endif
endif
if(memoryInteger1 == 0) then
set AI_Action_Location = Location(GetRectCenterX(KNOWLEDGE_READY_BOTTOM_RIGHT), GetRectCenterY(KNOWLEDGE_READY_BOTTOM_RIGHT))
elseif(memoryInteger1 == 1) then
set AI_Action_Location = Location(GetRectCenterX(KNOWLEDGE_READY_TOP_RIGHT), GetRectCenterY(KNOWLEDGE_READY_TOP_RIGHT))
elseif(memoryInteger1 == 2) then
set AI_Action_Location = Location(GetRectCenterX(KNOWLEDGE_READY_BOTTOM_LEFT), GetRectCenterY(KNOWLEDGE_READY_BOTTOM_LEFT))
elseif(memoryInteger1 == 3) then
set AI_Action_Location = Location(GetRectCenterX(KNOWLEDGE_READY_TOP_LEFT), GetRectCenterY(KNOWLEDGE_READY_TOP_LEFT))
else
set AI_Action_Location = GetUnitLoc(ad.b)
endif
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_TO_LOCATION
endif
endif
else
set AI_Action_Unit = ad.b
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_RUN
endif
else
if(IsUnitInGroup(ad.u, Unit_Inside_Temple)) then
set AI_Order = "stop"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_GET_READY
else
set AI_Action_Location = GetRandomLocInRect(gg_rct_Temple_High_Center)
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_TO_LOCATION
endif
endif
else
set AI_Action = ACTION_UNLOAD_HERO
endif
else
set AI_Action = ACTION_DEAD
endif
elseif(ad.s == STATE_HERO_READY) then
if(not IsUnitDead(ad.u)) then
if(GetHeroSkillPoints(ad.u) > 0) then
if(IsUnitPaused(ad.u)) then
set AI_Action = ACTION_NONE
else
if(Conqueror[0] != Guardian[0]) then
set continue = (ad.u != Conqueror[0])
else
set continue = true
endif
if(continue) then
set AI_Action = ACTION_LEARN
else
if(IsUnitInGroup(ad.u, Unit_Inside_Temple)) then
set AI_Action = ACTION_LEARN
else
set AI_Action_Location = GetRectCenter(gg_rct_Temple_High_Center)
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_TO_LOCATION
endif
endif
endif
else
set continue = ((ad.ui < GetTotalItemPlan(ad.un, ad.ut)) and /*
*/(GetPlayerState(ad.p, PLAYER_STATE_RESOURCE_GOLD) > GetItemCostById(GetItemPlan(ad.un, ad.ut, ad.ui))))
if(continue) then
set continue = false
set memoryInteger1 = 0
loop
exitwhen(memoryInteger1 >= bj_MAX_INVENTORY)
if(UnitItemInSlot(ad.u, memoryInteger1) == null) then
set continue = true
endif
set memoryInteger1 = memoryInteger1 + 1
endloop
if(continue) then
set AI_Action_ID = GetItemPlan(ad.un, ad.ut, ad.ui)
set AI_Action = ACTION_BUY_ITEM
else
set continue = false
set memoryInteger2 = -1
set memoryInteger1 = 0
loop
exitwhen(memoryInteger1 >= bj_MAX_INVENTORY)
if(not continue) then
if(UnitItemInSlot(ad.u, memoryInteger1) != null) then
if(GetItemType(UnitItemInSlot(ad.u, memoryInteger1)) != ITEM_TYPE_PERMANENT) then
set memoryInteger2 = memoryInteger1
set continue = true
endif
endif
endif
set memoryInteger1 = memoryInteger1 + 1
endloop
if(continue) then
if(GamePhase == GAME_PHASE_END) then
set AI_Action_ID = memoryInteger2
set AI_Action = ACTION_DROP_ITEM
else
if(Conqueror[0] != Guardian[0]) then
set continue = (ad.u != Conqueror[0])
else
set continue = true
endif
if(continue) then
set AI_Action_ID = memoryInteger2
set AI_Action = ACTION_SELL_ITEM
else
set AI_Action_ID = memoryInteger2
set AI_Action = ACTION_DROP_ITEM
endif
endif
else
set AI_Action = ACTION_GO_FARM
endif
endif
else
if(GamePhase == GAME_PHASE_END) then
if(Win_Side == 0) then
set continue = IsPlayerInForce(ad.p, Players_Luminous)
elseif(Win_Side == 1) then
set continue = IsPlayerInForce(ad.p, Players_Overcast)
endif
if(continue) then
set AI_Action = ACTION_KILL_ATOK
else
set AI_Order = "stop"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_RUN
endif
elseif(GamePhase == GAME_PHASE_START) then
if(Conqueror[0] != Guardian[0]) then
set continue = (ad.u != Conqueror[0])
else
set continue = true
endif
if(continue) then
if(ad.i < KNOWLEDGE_POINT_NEED_FARM) then
set AI_Action = ACTION_GO_FARM
else
if(ad.i < KNOWLEDGE_POINT_NEED_VICTOR) then
set AI_Action = ACTION_GO_KILL
else
if(not IsUnitDead(Guardian[0])) then
set AI_Action_Location = GetUnitLoc(Guardian[0])
set AI_Action_Unit = Guardian[0]
set AI_Order = "attack"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_GET_VICTOR
else
set AI_Action = ACTION_GO_KILL
endif
endif
endif
else
if(IsUnitInGroup(ad.u, Unit_Inside_Temple)) then
set AI_Action = ACTION_GO_KILL
else
set AI_Action_Location = GetRectCenter(gg_rct_Temple_High_Center)
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_TO_LOCATION
endif
endif
else
set AI_Action = ACTION_NONE
endif
endif
endif
else
if(GamePhase != GAME_PHASE_END) then
set AI_Action = ACTION_DEAD
else
set AI_Action = ACTION_NONE
endif
endif
elseif(ad.s == STATE_HERO_NEED_FARM) then
if(not IsUnitDead(ad.u)) then
if(GetHeroSkillPoints(ad.u) > 0) then
set AI_Action = ACTION_GET_READY
else
set continue = ((ad.ui < GetTotalItemPlan(ad.un, ad.ut))) and /*
*/(GetPlayerState(ad.p, PLAYER_STATE_RESOURCE_GOLD) > GetItemCostById(GetItemPlan(ad.un, ad.ut, ad.ui)))
if(continue) then
set AI_Action = ACTION_GET_READY
else
if(Conqueror[0] != Guardian[0]) then
set continue = (ad.u != Conqueror[0])
else
set continue = true
endif
if(continue) then
set perceive = perceive + (Perceive_Score[Perceive_Level_Hero_Life(ad.u, ad.un)] * LIFE_WEIGHTAGE)
set maxScore = maxScore + Hero_Life_Mode(1) * LIFE_WEIGHTAGE
if((perceive * TOTAL_SCORE_ATTITUDE) / maxScore < AI_Player_Attitude[GetPlayerId(ad.p)][0]) then
set continue = false
else
set continue = true
endif
if(continue) then
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set continue = false
set memoryInteger1 = 0
call GroupEnumUnitsInRange(all, x, y, PERCEIVE_DETECT_ENEMY_HERO_RADIUS, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, ad.p) and /*
*/(IsUnitVisible(f, ad.p)) and /*
*/(IsUnitType(f, UNIT_TYPE_HERO)) and /*
*/(GetPlayerId(GetOwningPlayer(f)) < 8) and /*
*/(not (NeglectingUnits(f)))) then
set memoryInteger1 = memoryInteger1 + 1
endif
endloop
set continue = (memoryInteger1 <= 0)
if(continue) then
set memoryBoolean1 = false
call GroupEnumUnitsInRange(all, x, y, PERCEIVE_DETECT_ENEMY_UNIT_RADIUS + PERCEIVE_DETECT_ENEMY_UNIT_RADIUS * ad.v[ct_index], bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, ad.p) and /*
*/(IsUnitVisible(f, ad.p)) and /*
*/(not IsUnitType(f, UNIT_TYPE_HERO)) and /*
*/(not IsUnitInGroup(f, Unit_Inside_Temple)) and /*
*/(not (NeglectingUnits(f)))) then
if(not memoryBoolean1) then
set memoryBoolean1 = true
set memoryUnit1 = f
else
if(NonAttackingUnits(f)) then
set memoryUnit1 = f
endif
endif
endif
endloop
if(memoryBoolean1) then
set targetItem = null
set loc = Location(x, y)
set rct = RectFromCenterSizeBJ(loc, PERCEIVE_DETECT_ITEM_RADIUS, PERCEIVE_DETECT_ITEM_RADIUS)
call EnumItemsInRect(rct, bexprItem, function Action_Item)
if(targetItem == null) then
set AI_Action_Unit = memoryUnit1
set AI_Order = "attack"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_COMBAT
else
set AI_Action_Item = targetItem
set AI_Order = "smart"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_TAKE_ITEM
endif
else
if(ad.v[ct_index] > PERCEIVE_MAX_LEVEL_RADIUS_DETECT_ENEMY) then
set tX = GetRectCenterX(gg_rct_AI_Farm_Location_North_West)
set tY = GetRectCenterY(gg_rct_AI_Farm_Location_North_West)
set dx = x - tX
set dy = y - tY
set distance = SquareRoot(dx * dx + dy * dy)
if(RectContainsUnit(gg_rct_AI_Farm_Location_North_West, ad.u)) then
set memoryReal1 = 0.0
else
set memoryReal1 = distance
endif
set tX = GetRectCenterX(gg_rct_AI_Farm_Location_South_East)
set tY = GetRectCenterY(gg_rct_AI_Farm_Location_South_East)
set dx = x - tX
set dy = y - tY
set distance = SquareRoot(dx * dx + dy * dy)
if(RectContainsUnit(gg_rct_AI_Farm_Location_South_East, ad.u)) then
set memoryReal2 = 0.0
else
set memoryReal2 = distance
endif
set tX = GetRectCenterX(gg_rct_AI_Farm_Location_South_West)
set tY = GetRectCenterY(gg_rct_AI_Farm_Location_South_West)
set dx = x - tX
set dy = y - tY
set distance = SquareRoot(dx * dx + dy * dy)
if(RectContainsUnit(gg_rct_AI_Farm_Location_South_West, ad.u)) then
set memoryReal3 = 0.0
else
set memoryReal3 = distance
endif
set tX = GetRectCenterX(gg_rct_AI_Farm_Location_North_East)
set tY = GetRectCenterY(gg_rct_AI_Farm_Location_North_East)
set dx = x - tX
set dy = y - tY
set distance = SquareRoot(dx * dx + dy * dy)
if(RectContainsUnit(gg_rct_AI_Farm_Location_North_East, ad.u)) then
set memoryReal4 = 0.0
else
set memoryReal4 = distance
endif
set memoryInteger1 = 0
if(memoryReal1 < memoryReal2) then
set memoryInteger1 = 1
endif
if(memoryInteger1 == 1) then
if(memoryReal2 < memoryReal3) then
set memoryInteger1 = 2
endif
elseif(memoryInteger1 == 0) then
if(memoryReal1 < memoryReal3) then
set memoryInteger1 = 2
endif
endif
if(memoryInteger1 == 2) then
if(memoryReal3 < memoryReal4) then
set memoryInteger1 = 3
endif
elseif(memoryInteger1 == 1) then
if(memoryReal2 < memoryReal4) then
set memoryInteger1 = 3
endif
elseif(memoryInteger1 == 0) then
if(memoryReal1 < memoryReal4) then
set memoryInteger1 = 3
endif
endif
if(memoryInteger1 == 0) then
set AI_Action_Location = GetRandomLocInRect(gg_rct_AI_Farm_Location_North_West)
elseif(memoryInteger1 == 1) then
set AI_Action_Location = GetRandomLocInRect(gg_rct_AI_Farm_Location_South_East)
elseif(memoryInteger1 == 2) then
set AI_Action_Location = GetRandomLocInRect(gg_rct_AI_Farm_Location_South_West)
elseif(memoryInteger1 == 3) then
set AI_Action_Location = GetRandomLocInRect(gg_rct_AI_Farm_Location_North_East)
else
set AI_Action_Location = GetRandomLocInRect(gg_rct_AI_Farm_Location)
endif
set AI_Order = "smart"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_GO_FARM
else
set AI_Action = ACTION_PERCEIVE
endif
endif
else
set AI_Order = "holdposition"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_CARE
endif
else
set AI_Action_Unit = ad.b
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_RUN
endif
else
set AI_Action_Location = GetRandomLocInRect(gg_rct_Temple_High_Center)
set AI_Order = "smart"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_GO_FARM
endif
endif
endif
else
set AI_Action = ACTION_DEAD
endif
elseif(ad.s == STATE_HERO_DEAD) then
if(not IsUnitDead(ad.u)) then
set AI_Action = ACTION_GET_READY
endif
elseif(ad.s == STATE_HERO_LOAD) then
if(not IsUnitInGroup(ad.u, LoadedHero)) then
if(not IsUnitDead(ad.u)) then
set AI_Order = "stop"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_LOAD_HERO
else
set AI_Action = ACTION_DEAD
endif
else
set AI_Action = ACTION_NONE
endif
elseif(ad.s == STATE_HERO_UNLOAD) then
if(not IsUnitDead(ad.u)) then
if(not IsUnitInGroup(ad.u, LoadedHero)) then
if(ad.v[ct_index] <= 0) then
set AI_Action = ACTION_STOP
else
set AI_Order = "holdposition"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_GET_READY
endif
else
set AI_Action = ACTION_NONE
endif
else
set AI_Action = ACTION_DEAD
endif
elseif(ad.s == STATE_HERO_CARE) then
if(not IsUnitDead(ad.u)) then
if(Conqueror[0] != Guardian[0]) then
set continue = (ad.u != Conqueror[0])
else
set continue = true
endif
if(continue) then
set perceive = perceive + (Perceive_Score[Perceive_Level_Hero_Life(ad.u, ad.un)] * LIFE_WEIGHTAGE)
set maxScore = maxScore + Hero_Life_Mode(1) * LIFE_WEIGHTAGE
if((perceive * TOTAL_SCORE_ATTITUDE) / maxScore < AI_Player_Attitude[GetPlayerId(ad.p)][0]) then
set continue = false
else
set continue = true
endif
if(continue) then
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set memoryInteger1 = 0
set memoryInteger2 = 0
set memoryReal1 = 0
set memoryUnit1 = null
call GroupEnumUnitsInRange(all, x, y, PERCEIVE_DETECT_ENEMY_HERO_RADIUS + PERCEIVE_DETECT_ENEMY_HERO_RADIUS * ad.v[ct_index], bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, ad.p) and /*
*/(IsUnitVisible(f, ad.p)) and /*
*/(IsUnitType(f, UNIT_TYPE_HERO))) then
if(GetPlayerId(GetOwningPlayer(f)) < 8) then
set memoryInteger1 = memoryInteger1 + 1
if(memoryUnit1 == null) then
set memoryUnit1 = f
set memoryReal1 = GetUnitState(f, UNIT_STATE_LIFE)
else
if(memoryReal1 > GetUnitState(f, UNIT_STATE_LIFE)) then
set memoryUnit1 = f
set memoryReal1 = GetUnitState(f, UNIT_STATE_LIFE)
endif
endif
endif
if(GetUnitTypeId(f) == KNOWLEDGE_REVENANT_WAKE) then
set memoryInteger2 = memoryInteger2 + 1
endif
endif
endloop
if(memoryInteger2 > 0) then
if(IsUnitInGroup(ad.u, Unit_Inside_Temple)) then
set AI_Action_Location = GetUnitLoc(ad.b)
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_GET_READY
else
set AI_Action = ACTION_GET_READY
endif
//set AI_Action = ACTION_RUN
else
if(memoryInteger1 > 0) then
set AI_Action_Unit = memoryUnit1
set AI_Order = "attack"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_KILL
else
if(ad.v[ct_index] > PERCEIVE_MAX_LEVEL_CARE_HERO) then
set AI_Action = ACTION_GET_READY
else
set AI_Action = ACTION_PERCEIVE
endif
endif
endif
else
set AI_Action_Unit = ad.b
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_RUN
endif
else
endif
else
set AI_Action = ACTION_DEAD
endif
elseif(ad.s == STATE_HERO_CAST) then
if(not IsUnitDead(ad.u)) then
if(ad.v[ct_index] > PERCEIVE_MAX_LEVEL_CAST_EFFECT) then
if(ad.o == OBJECTIVE_GET_VICTOR) then
if(not IsUnitDead(Conqueror[0]) and /*
*/(not IsUnitInvisible(Conqueror[0], ad.p)) and /*
*/(not Perceive_Unit_Invulnerable(Conqueror[0]))) then
set AI_Action_Unit = Conqueror[0]
set AI_Order = "attack"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_GET_VICTOR
else
set AI_Order = "stop"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_STOP
endif
elseif(ad.o == OBJECTIVE_KILL_HEROES) then
set AI_Action = ACTION_GO_KILL
elseif(ad.o == OBJECTIVE_KILL_UNITS) then
set AI_Action = ACTION_GO_FARM
else
set AI_Order = "stop"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_STOP
endif
else
if(ad.v[ct_index] <= PERCEIVE_MAX_LEVEL_CAST) then
set AI_Action = ACTION_CAST
else
set AI_Action = ACTION_PERCEIVE
/*if(ad.o == OBJECTIVE_KILL_HEROES) then
set AI_Action = ACTION_PERCEIVE
elseif(ad.o == OBJECTIVE_KILL_UNITS) then
set AI_Action = ACTION_PERCEIVE
elseif(ad.o == OBJECTIVE_RUN) then
set AI_Action = ACTION_PERCEIVE
elseif(ad.o == OBJECTIVE_NEUTRAL) then
set AI_Action = ACTION_PERCEIVE
endif*/
endif
endif
else
set AI_Action = ACTION_DEAD
endif
elseif(ad.s == STATE_HERO_NEED_KILL) then
if(not IsUnitDead(ad.u)) then
if(Conqueror[0] != Guardian[0]) then
set continue = (ad.u != Conqueror[0])
else
set continue = true
endif
if(continue) then
set perceive = perceive + (Perceive_Score[Perceive_Level_Hero_Life(ad.u, ad.un)] * LIFE_WEIGHTAGE)
set maxScore = maxScore + Hero_Life_Mode(1) * LIFE_WEIGHTAGE
if((perceive * TOTAL_SCORE_ATTITUDE) / maxScore < AI_Player_Attitude[GetPlayerId(ad.p)][0]) then
set continue = false
else
set continue = true
endif
if(continue) then
if(GetHeroSkillPoints(ad.u) > 0) then
set AI_Action = ACTION_GET_READY
else
set continue = ((ad.ui < GetTotalItemPlan(ad.un, ad.ut))) and /*
*/(GetPlayerState(ad.p, PLAYER_STATE_RESOURCE_GOLD) > GetItemCostById(GetItemPlan(ad.un, ad.ut, ad.ui)))
if(continue) then
set AI_Action = ACTION_GET_READY
else
if(GamePhase != GAME_PHASE_END) then
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set continue = false
set memoryInteger1 = 0
set memoryUnit1 = null
set memoryBoolean1 = false
call GroupEnumUnitsInRange(all, x, y, PERCEIVE_DETECT_ENEMY_HERO_RADIUS + PERCEIVE_DETECT_ENEMY_HERO_RADIUS * ad.v[ct_index], bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, ad.p) and /*
*/(IsUnitVisible(f, ad.p)) and /*
*/(IsUnitType(f, UNIT_TYPE_HERO)) and /*
*/(GetPlayerId(GetOwningPlayer(f)) < 8) and /*
*/(not (NeglectingUnits(f)))) then
set memoryInteger1 = memoryInteger1 + 1
if(not memoryBoolean1) then
set memoryUnit1 = f
endif
if(f == Conqueror[0]) then
set memoryUnit1 = f
set memoryBoolean1 = true
endif
endif
endloop
set continue = (memoryInteger1 <= 0)
if(continue) then
if(ad.v[ct_index] > PERCEIVE_MAX_LEVEL_RADIUS_DETECT_ENEMY) then
if(Conqueror[0] != Guardian[0]) then
set AI_Action_Location = GetRandomLocInRect(gg_rct_Temple_High_Center)
set AI_Order = "smart"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_KILL
else
set AI_Action_Location = GetRandomLocInRect(gg_rct_AI_Farm_Location)
set AI_Order = "smart"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_KILL
endif
else
set AI_Action = ACTION_PERCEIVE
endif
else
set targetItem = null
set loc = Location(x, y)
set rct = RectFromCenterSizeBJ(loc, PERCEIVE_DETECT_ITEM_RADIUS, PERCEIVE_DETECT_ITEM_RADIUS)
call EnumItemsInRect(rct, bexprItem, function Action_Item)
if(targetItem != null) then
set AI_Action_Item = targetItem
set AI_Order = "smart"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_TAKE_ITEM
else
set AI_Action_Unit = memoryUnit1
set AI_Order = "attack"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_COMBAT
endif
endif
else
set AI_Action_Unit = Atok
set AI_Order = "attack"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_COMBAT
endif
endif
endif
else
if(GamePhase == GAME_PHASE_END) then
set AI_Action_Unit = Atok
set AI_Order = "attack"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_COMBAT
else
set AI_Action_Unit = ad.b
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_RUN
endif
endif
else
if(IsUnitInGroup(ad.u, Unit_Inside_Temple)) then
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set continue = false
set memoryInteger1 = 0
set memoryUnit1 = null
call GroupEnumUnitsInRange(all, x, y, PERCEIVE_DETECT_ENEMY_HERO_RADIUS + PERCEIVE_DETECT_ENEMY_HERO_RADIUS * ad.v[ct_index], bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
set tX = GetUnitX(f)
set tY = GetUnitY(f)
if(IsUnitEnemy(f, ad.p) and /*
*/(IsUnitVisible(f, ad.p)) and /*
*/(IsUnitType(f, UNIT_TYPE_HERO)) and /*
*/(GetPlayerId(GetOwningPlayer(f)) < 8) and /*
*/(not (NeglectingUnits(f))) and /*
*/(RectContainsCoords(gg_rct_Temple_Center, tX, tY))) then
set memoryInteger1 = memoryInteger1 + 1
set memoryUnit1 = f
endif
endloop
set continue = (memoryInteger1 <= 0)
if(continue) then
if(ad.v[ct_index] > PERCEIVE_MAX_LEVEL_RADIUS_DETECT_ENEMY) then
set AI_Action_Location = GetRandomLocInRect(gg_rct_Temple_High_Center)
set AI_Order = "smart"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_KILL
else
set AI_Action = ACTION_PERCEIVE
endif
else
set AI_Action_Unit = memoryUnit1
set AI_Order = "attack"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_COMBAT
endif
else
set AI_Action_Location = GetRectCenter(gg_rct_Temple_High_Center)
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_TO_LOCATION
endif
endif
else
set AI_Action = ACTION_DEAD
endif
endif
set memoryUnit1 = null
set f = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//setting globals
set all = CreateGroup()
set bexpr = Condition(function Pick)
set loc = Location(0.0, 0.0)
set rct = null
set bexprItem = Condition(function Pick_Item)
endfunction
endscope
//TESH.scrollpos=1019
//TESH.alwaysfold=0
scope AIPerceiveHeroTarget initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and /*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and /*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Item affected
private function Targets_Item takes item target returns boolean
return GetItemType(target) != ITEM_TYPE_PERMANENT and /*
*/IsItemVisible(target) and /*
*/target != null and /*
*/GetWidgetLife(target) > 0
endfunction
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private group all
private boolexpr bexpr
private rect rct
private location loc
private boolexpr bexprItem
private item targetItem
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Pick_Item takes nothing returns boolean
local item filtered = GetFilterItem()
local boolean isTargets = Targets_Item(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Action_Item takes nothing returns nothing
if(targetItem == null) then
set targetItem = GetEnumItem()
endif
endfunction
//----------------------------------------------------------------
function Perceive_Hero_Target takes AI_Base_Data ad, unit target, integer ct_index returns nothing
local integer memoryInteger1 = 0
local integer memoryInteger2 = 0
local real memoryReal1 = 0.0
local real memoryReal2 = 0.0
local real memoryReal3 = 0.0
local real memoryReal4 = 0.0
local boolean memoryBoolean1 = false
local unit memoryUnit1 = null
local real perceive = 0.0
local real maxScore = 0.0
local boolean continue = false
local real x = 0.0
local real y = 0.0
local real tX = 0.0
local real tY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local unit f = null
if(ad.s == STATE_HERO_AWARE_UNIT) then
if(not IsUnitDead(ad.u)) then
if(Conqueror[0] != Guardian[0]) then
set continue = (ad.u != Conqueror[0])
else
set continue = true
endif
if(continue) then
set perceive = perceive + (Perceive_Score[Perceive_Level_Hero_Life(ad.u, ad.un)] * LIFE_WEIGHTAGE)
set maxScore = maxScore + Hero_Life_Mode(1) * LIFE_WEIGHTAGE
if((perceive * TOTAL_SCORE_ATTITUDE) / maxScore < AI_Player_Attitude[GetPlayerId(ad.p)][0]) then
set continue = false
else
set continue = true
endif
if(continue) then
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set memoryInteger1 = 0
call GroupEnumUnitsInRange(all, x, y, PERCEIVE_DETECT_ENEMY_RADIUS, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, ad.p) and /*
*/(IsUnitVisible(f, ad.p)) and /*
*/(not (NeglectingUnits(f)))) then
set memoryInteger1 = memoryInteger1 + 1
endif
endloop
set continue = (memoryInteger1 <= 0)
if(continue) then
if(not IsUnitDead(target)) then
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set tX = GetUnitX(target)
set tY = GetUnitY(target)
set dx = x - tX
set dy = y - tY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance > PERCEIVE_FOLLOW_DISTANCE) then
if(ad.ux != x or ad.uy != y) then
set AI_Action_Unit = target
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_NONE
else
if(ad.v[ct_index] > PERCEIVE_MAX_LEVEL_IMMOBILE) then
set AI_Action_Location = GetUnitLoc(target)
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action_Perceive = 0
set AI_Action = ACTION_BOAT_RECALL
else
set AI_Action_Unit = target
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_PERCEIVE
endif
endif
else
set AI_Order = "stop"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_STOP
endif
else
set AI_Order = "stop"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_STOP
endif
else
set AI_Order = "stop"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_STOP
endif
else
set AI_Action_Unit = ad.b
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_RUN
endif
else
if(not IsUnitDead(target)) then
if(IsUnitInGroup(target, Unit_Inside_Temple)) then
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set tX = GetUnitX(target)
set tY = GetUnitY(target)
set dx = x - tX
set dy = y - tY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance > PERCEIVE_FOLLOW_DISTANCE) then
set AI_Action_Unit = target
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_NONE
else
set AI_Order = "stop"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_STOP
endif
else
set AI_Order = "stop"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_STOP
endif
else
set AI_Order = "stop"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_STOP
endif
endif
else
set AI_Action = ACTION_DEAD
endif
elseif(ad.s == STATE_HERO_FARM) then
if(not IsUnitDead(ad.u)) then
if(Conqueror[0] != Guardian[0]) then
set continue = (ad.u != Conqueror[0])
else
set continue = true
endif
if(continue) then
set perceive = perceive + (Perceive_Score[Perceive_Level_Hero_Life(ad.u, ad.un)] * LIFE_WEIGHTAGE)
set maxScore = maxScore + Hero_Life_Mode(1) * LIFE_WEIGHTAGE
if((perceive * TOTAL_SCORE_ATTITUDE) / maxScore < AI_Player_Attitude[GetPlayerId(ad.p)][0]) then
set continue = false
else
set continue = true
endif
if(continue) then
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set memoryInteger1 = 0
set memoryInteger2 = 0
call GroupEnumUnitsInRange(all, x, y, PERCEIVE_DETECT_ENEMY_HERO_RADIUS + PERCEIVE_DETECT_ENEMY_HERO_RADIUS * ad.v[ct_index], bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, ad.p) and /*
*/(IsUnitVisible(f, ad.p)) and /*
*/(IsUnitType(f, UNIT_TYPE_HERO))) then
if((GetPlayerId(GetOwningPlayer(f)) < 8)) then
set memoryInteger1 = memoryInteger1 + 1
elseif(GetUnitTypeId(f) == KNOWLEDGE_REVENANT_WAKE) then
set memoryInteger2 = memoryInteger2 + 1
endif
endif
endloop
if(memoryInteger2 <= 0) then
set continue = (memoryInteger1 <= 0)
if(continue) then
if(target != null) then
if(not IsUnitDead(target)) then
if(IsUnitAlly(target, ad.p)) then
set AI_Action = ACTION_GO_FARM
else
if(IsUnitVisible(target, ad.p)) then
if(IsUnitType(target, UNIT_TYPE_ATTACKS_GROUND)) then
set targetItem = null
set loc = Location(x, y)
set rct = RectFromCenterSizeBJ(loc, PERCEIVE_DETECT_ITEM_RADIUS, PERCEIVE_DETECT_ITEM_RADIUS)
call EnumItemsInRect(rct, bexprItem, function Action_Item)
if(targetItem != null) then
set AI_Action_Item = targetItem
set AI_Order = "smart"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_COMBAT
else
set AI_Action_Unit = target
set AI_Action_Perceive = PERCEIVE_DEFAULT_VALUE
set AI_Order = "attack"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_COMBAT
endif
else
set memoryInteger1 = 0
set memoryUnit1 = null
set continue = false
call GroupEnumUnitsInRange(all, x, y, PERCEIVE_DETECT_ENEMY_UNIT_RADIUS + PERCEIVE_DETECT_ENEMY_UNIT_RADIUS * ad.v[ct_index], bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, ad.p) and /*
*/(IsUnitVisible(f, ad.p)) and /*
*/(not IsUnitType(f, UNIT_TYPE_HERO)) and /*
*/(not (NeglectingUnits(f))) and /*
*/(SkeletonUnits(f))) then
set memoryInteger1 = memoryInteger1 + 1
if(memoryUnit1 == null) then
set memoryUnit1 = f
endif
endif
endloop
set continue = (memoryInteger1 <= 0)
if(continue) then
set AI_Action_Unit = target
set AI_Action_Perceive = PERCEIVE_DEFAULT_VALUE
set AI_Order = "attack"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_COMBAT
else
set AI_Action_Unit = memoryUnit1
set AI_Order = "attack"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_CHANGE_TARGET
endif
endif
else
set AI_Action = ACTION_GO_FARM
endif
endif
else
set AI_Action = ACTION_GO_FARM
endif
else
set AI_Action = ACTION_GO_FARM
endif
else
set AI_Order = "holdposition"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_CARE
endif
else
set tX = GetRectCenterX(gg_rct_AI_Farm_Location_North_West)
set tY = GetRectCenterY(gg_rct_AI_Farm_Location_North_West)
set dx = x - tX
set dy = y - tY
set distance = SquareRoot(dx * dx + dy * dy)
set memoryReal1 = distance
set tX = GetRectCenterX(gg_rct_AI_Farm_Location_South_East)
set tY = GetRectCenterY(gg_rct_AI_Farm_Location_South_East)
set dx = x - tX
set dy = y - tY
set distance = SquareRoot(dx * dx + dy * dy)
set memoryReal2 = distance
set tX = GetRectCenterX(gg_rct_AI_Farm_Location_South_West)
set tY = GetRectCenterY(gg_rct_AI_Farm_Location_South_West)
set dx = x - tX
set dy = y - tY
set distance = SquareRoot(dx * dx + dy * dy)
set memoryReal3 = distance
set tX = GetRectCenterX(gg_rct_AI_Farm_Location_North_East)
set tY = GetRectCenterY(gg_rct_AI_Farm_Location_North_East)
set dx = x - tX
set dy = y - tY
set distance = SquareRoot(dx * dx + dy * dy)
set memoryReal4 = distance
set memoryInteger1 = 0
if(memoryReal1 < memoryReal2) then
set memoryInteger1 = 1
endif
if(memoryInteger1 == 1) then
if(memoryReal2 < memoryReal3) then
set memoryInteger1 = 2
endif
elseif(memoryInteger1 == 0) then
if(memoryReal1 < memoryReal3) then
set memoryInteger1 = 2
endif
endif
if(memoryInteger1 == 2) then
if(memoryReal3 < memoryReal4) then
set memoryInteger1 = 3
endif
elseif(memoryInteger1 == 1) then
if(memoryReal2 < memoryReal4) then
set memoryInteger1 = 3
endif
elseif(memoryInteger1 == 0) then
if(memoryReal1 < memoryReal4) then
set memoryInteger1 = 3
endif
endif
if(memoryInteger1 == 0) then
set AI_Action_Location = GetRandomLocInRect(gg_rct_AI_Farm_Location_North_West)
elseif(memoryInteger1 == 1) then
set AI_Action_Location = GetRandomLocInRect(gg_rct_AI_Farm_Location_South_East)
elseif(memoryInteger1 == 2) then
set AI_Action_Location = GetRandomLocInRect(gg_rct_AI_Farm_Location_South_West)
elseif(memoryInteger1 == 3) then
set AI_Action_Location = GetRandomLocInRect(gg_rct_AI_Farm_Location_North_East)
else
set AI_Action_Location = GetRandomLocInRect(gg_rct_AI_Farm_Location)
endif
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_TO_LOCATION
endif
else
set AI_Action_Unit = ad.b
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_RUN
endif
else
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set memoryInteger1 = 0
call GroupEnumUnitsInRange(all, x, y, PERCEIVE_DETECT_ENEMY_HERO_RADIUS, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, ad.p) and /*
*/(IsUnitVisible(f, ad.p)) and /*
*/(IsUnitType(f, UNIT_TYPE_HERO)) and /*
*/(GetPlayerId(GetOwningPlayer(f)) < 8)) then
set memoryInteger1 = memoryInteger1 + 1
endif
endloop
if(memoryInteger1 > 0) then
set AI_Order = "holdposition"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_CARE
else
if(target != null) then
if(not IsUnitDead(target)) then
if(IsUnitAlly(target, ad.p)) then
set AI_Action = ACTION_GO_FARM
else
set AI_Action = ACTION_GO_FARM
endif
else
set AI_Action = ACTION_GO_FARM
endif
else
set AI_Action = ACTION_GO_FARM
endif
endif
endif
else
set AI_Action = ACTION_DEAD
endif
elseif(ad.s == STATE_HERO_RUN) then
if(not IsUnitDead(ad.u)) then
if(Conqueror[0] != Guardian[0]) then
set continue = (ad.u != Conqueror[0])
else
set continue = true
endif
if(continue) then
set perceive = perceive + (Perceive_Score[Perceive_Level_Hero_Life(ad.u, ad.un)] * LIFE_WEIGHTAGE)
set maxScore = maxScore + Hero_Life_Mode(1) * LIFE_WEIGHTAGE
if((perceive * TOTAL_SCORE_ATTITUDE) / maxScore < AI_Player_Attitude[GetPlayerId(ad.p)][0]) then
set continue = false
else
set continue = true
endif
if(continue) then
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set tX = GetUnitX(target)
set tY = GetUnitY(target)
set dx = x - tX
set dy = y - tY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance > PERCEIVE_FOLLOW_DISTANCE) then
set AI_Action = ACTION_GET_READY
else
set AI_Action_Unit = target
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_TO_BOAT
endif
else
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set memoryInteger1 = 0
set memoryReal1 = GetUnitState(ad.u, UNIT_STATE_LIFE)
set continue = true
call GroupEnumUnitsInRange(all, x, y, PERCEIVE_DETECT_ENEMY_HERO_RADIUS + PERCEIVE_DETECT_ENEMY_HERO_RADIUS * ad.v[ct_index], bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, ad.p) and /*
*/(IsUnitVisible(f, ad.p)) and /*
*/(IsUnitType(f, UNIT_TYPE_HERO)) and /*
*/(not (NeglectingUnits(f))) and /*
*/(GetUnitState(f, UNIT_STATE_LIFE) < memoryReal1)) then
if(GetPlayerId(GetOwningPlayer(f)) < 8) then
set perceive = perceive + (Perceive_Score[Perceive_Level_Hero_Attack_Range(ad.u, f, ad.un)] * ATTACK_RANGE_WEIGHTAGE)
set maxScore = maxScore + Hero_Attack_Range_Mode(1) * ATTACK_RANGE_WEIGHTAGE
set memoryBoolean1 = false
if((perceive * TOTAL_SCORE_ATTITUDE) / maxScore < AI_Player_Attitude[GetPlayerId(ad.p)][1]) then
set memoryBoolean1 = false
else
set memoryBoolean1 = true
endif
if(memoryBoolean1 and memoryReal1 > GetUnitState(f, UNIT_STATE_LIFE)) then
set continue = false
set memoryUnit1 = f
set memoryReal1 = GetUnitState(f, UNIT_STATE_LIFE)
endif
endif
if(ad.o == OBJECTIVE_KILL_UNITS or ad.o == OBJECTIVE_NEUTRAL) then
if(GetUnitTypeId(f) == KNOWLEDGE_REVENANT_WAKE) then
set memoryInteger1 = memoryInteger1 + 1
endif
endif
endif
endloop
if(memoryInteger1 > 0) then
set AI_Action_Location = GetUnitLoc(target)
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_RUN
else
if(continue) then
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set tX = GetUnitX(target)
set tY = GetUnitY(target)
set dx = x - tX
set dy = y - tY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance > PERCEIVE_FOLLOW_DISTANCE) then
set targetItem = null
set loc = Location(x, y)
set rct = RectFromCenterSizeBJ(loc, PERCEIVE_DETECT_ITEM_RADIUS, PERCEIVE_DETECT_ITEM_RADIUS)
call EnumItemsInRect(rct, bexprItem, function Action_Item)
if(targetItem != null) then
if(GetItemTypeId(targetItem) == KNOWLEDGE_RUNE_RESTORATION) then
set AI_Action_Item = targetItem
set AI_Order = "smart"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_TAKE_ITEM
else
set AI_Action_Location = GetUnitLoc(target)
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_RUN
endif
else
set AI_Action_Location = GetUnitLoc(target)
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_RUN
endif
else
if(ad.b == target) then
set AI_Action_Unit = target
set AI_Order = "smart"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_TO_BOAT
else
set AI_Order = "stop"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_STOP
endif
endif
else
set AI_Action_Unit = memoryUnit1
set AI_Order = "attack"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_KILL
endif
endif
endif
else
set AI_Action = ACTION_GET_READY
endif
else
set AI_Action = ACTION_DEAD
endif
elseif(ad.s == STATE_HERO_NEED_LOAD) then
if(not IsUnitDead(ad.u)) then
if(not IsUnitInGroup(ad.u, LoadedHero)) then
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set tX = GetUnitX(target)
set tY = GetUnitY(target)
set dx = x - tX
set dy = y - tY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance > PERCEIVE_LOAD_DISTANCE) then
set AI_Action = ACTION_TO_BOAT
else
set AI_Action_Unit = ad.b
set AI_Action_Location = GetUnitLoc(ad.b)
set AI_Order = "smart"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_LOAD_HERO
endif
else
set AI_Action = ACTION_NONE
endif
else
set AI_Action = ACTION_DEAD
endif
elseif(ad.s == STATE_HERO_KILL) then
if(not IsUnitDead(ad.u)) then
if(Conqueror[0] != Guardian[0]) then
set continue = (ad.u != Conqueror[0])
else
set continue = true
endif
if(continue) then
set perceive = perceive + (Perceive_Score[Perceive_Level_Hero_Life(ad.u, ad.un)] * LIFE_WEIGHTAGE)
set maxScore = maxScore + Hero_Life_Mode(1) * LIFE_WEIGHTAGE
if((perceive * TOTAL_SCORE_ATTITUDE) / maxScore < AI_Player_Attitude[GetPlayerId(ad.p)][0]) then
set continue = false
else
set continue = true
endif
if(ad.o != OBJECTIVE_KILL_ATOK) then
if(continue) then
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set continue = false
set memoryInteger1 = 0
set memoryReal1 = 0
set memoryUnit1 = null
call GroupEnumUnitsInRange(all, x, y, PERCEIVE_DETECT_ENEMY_HERO_RADIUS + PERCEIVE_DETECT_ENEMY_HERO_RADIUS * ad.v[ct_index], bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, ad.p) and /*
*/(IsUnitVisible(f, ad.p)) and /*
*/(IsUnitType(f, UNIT_TYPE_HERO)) and /*
*/(GetPlayerId(GetOwningPlayer(f)) < 8)) then
set memoryInteger1 = memoryInteger1 + 1
if(memoryUnit1 == null) then
set memoryUnit1 = f
set memoryReal1 = GetUnitState(f, UNIT_STATE_LIFE)
else
if(memoryReal1 > GetUnitState(f, UNIT_STATE_LIFE)) then
set memoryUnit1 = f
set memoryReal1 = GetUnitState(f, UNIT_STATE_LIFE)
endif
endif
endif
endloop
if(memoryInteger1 > 0) then
if(memoryUnit1 == target) then
set continue = true
else
set memoryReal1 = GetUnitState(target, UNIT_STATE_LIFE)
set memoryReal2 = GetUnitState(memoryUnit1, UNIT_STATE_LIFE)
if(memoryReal1 > memoryReal2) then
set continue = false
else
set continue = true
endif
endif
else
set continue = true
endif
if(continue) then
if(not IsUnitDead(target)) then
if(not IsUnitInGroup(target, LoadedHero)) then
if(IsUnitVisible(target, ad.p)) then
set perceive = perceive + (Perceive_Score[Perceive_Level_Hero_Attack_Range(ad.u, target, ad.un)] * ATTACK_RANGE_WEIGHTAGE)
set maxScore = maxScore + Hero_Attack_Range_Mode(1) * ATTACK_RANGE_WEIGHTAGE
if((perceive * TOTAL_SCORE_ATTITUDE) / maxScore < AI_Player_Attitude[GetPlayerId(ad.p)][1]) then
set continue = false
else
set continue = true
endif
if(continue) then
set targetItem = null
set loc = Location(x, y)
set rct = RectFromCenterSizeBJ(loc, PERCEIVE_DETECT_ITEM_RADIUS/2, PERCEIVE_DETECT_ITEM_RADIUS/2)
call EnumItemsInRect(rct, bexprItem, function Action_Item)
if(targetItem != null) then
if(GetItemTypeId(targetItem) == KNOWLEDGE_RUNE_RESTORATION) then
set AI_Action_Item = targetItem
set AI_Order = "smart"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_TAKE_ITEM
else
set AI_Action_Unit = target
set AI_Action_Perceive = PERCEIVE_DEFAULT_VALUE
set AI_Order = "attack"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_COMBAT
endif
else
set AI_Action_Unit = target
set AI_Action_Perceive = PERCEIVE_DEFAULT_VALUE
set AI_Order = "attack"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_COMBAT
endif
else
set AI_Action_Unit = target
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_CHASE
endif
else
set AI_Action_Unit = target
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_CHASE
endif
else
set AI_Action = ACTION_GET_READY
endif
else
set AI_Action = ACTION_GET_READY
endif
else
set AI_Action_Unit = memoryUnit1
set AI_Order = "attack"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action_Perceive = PERCEIVE_DEFAULT_VALUE
set AI_Action = ACTION_CHANGE_TARGET
endif
else
if(not IsUnitDead(target)) then
if(not IsUnitInGroup(target, LoadedHero)) then
if(IsUnitVisible(target, ad.p)) then
set perceive = perceive + (Perceive_Score[Perceive_Level_Hero_Life(target, GetHeroIndex(target))] * LIFE_WEIGHTAGE)
set maxScore = maxScore + Hero_Life_Mode(1) * LIFE_WEIGHTAGE
if((perceive * TOTAL_SCORE_ATTITUDE) / maxScore < AI_Player_Attitude[GetPlayerId(ad.p)][0]) then
set continue = true
else
set continue = false
endif
if(continue) then
set AI_Action_Unit = ad.b
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_RUN
//set AI_Action_Unit = target
//set AI_Action_Perceive = PERCEIVE_DEFAULT_VALUE
//set AI_Order = "attack"
//set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
//set AI_Action = ACTION_COMBAT
else
if(ad.u != Conqueror[0]) then
set AI_Action_Unit = ad.b
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_RUN
else
set AI_Action_Unit = target
set AI_Action_Perceive = PERCEIVE_DEFAULT_VALUE
set AI_Order = "attack"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_COMBAT
endif
endif
else
set AI_Action_Unit = ad.b
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_RUN
endif
else
set AI_Action_Unit = ad.b
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_RUN
//set AI_Action_Unit = target
//set AI_Order = "move"
//set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
//set AI_Action = ACTION_CHASE
endif
else
set AI_Action_Unit = ad.b
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_RUN
endif
endif
else
set AI_Action_Unit = target
set AI_Action_Perceive = PERCEIVE_DEFAULT_VALUE
set AI_Order = "attack"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_COMBAT
endif
else
if(IsUnitInGroup(ad.u, Unit_Inside_Temple)) then
set AI_Action_Unit = target
set AI_Action_Perceive = PERCEIVE_DEFAULT_VALUE
set AI_Order = "attack"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_COMBAT
else
set AI_Action_Location = GetRectCenter(gg_rct_Temple_High_Center)
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_TO_LOCATION
endif
endif
else
set AI_Action = ACTION_DEAD
endif
elseif(ad.s == STATE_HERO_CHASE) then
if(not IsUnitDead(ad.u)) then
if(Conqueror[0] != Guardian[0]) then
set continue = (ad.u != Conqueror[0])
else
set continue = true
endif
if(continue) then
set perceive = perceive + (Perceive_Score[Perceive_Level_Hero_Life(ad.u, ad.un)] * LIFE_WEIGHTAGE)
set maxScore = maxScore + Hero_Life_Mode(1) * LIFE_WEIGHTAGE
if((perceive * TOTAL_SCORE_ATTITUDE) / maxScore < AI_Player_Attitude[GetPlayerId(ad.p)][0]) then
set continue = false
else
set continue = true
endif
if(continue) then
if(not IsUnitDead(target)) then
if(not IsUnitInGroup(target, LoadedHero)) then
if(IsUnitVisible(target, ad.p)) then
set perceive = perceive + (Perceive_Score[Perceive_Level_Hero_Attack_Range(ad.u, target, ad.un)] * ATTACK_RANGE_WEIGHTAGE)
set maxScore = maxScore + Hero_Attack_Range_Mode(1) * ATTACK_RANGE_WEIGHTAGE
if((perceive * TOTAL_SCORE_ATTITUDE) / maxScore < AI_Player_Attitude[GetPlayerId(ad.p)][1]) then
set continue = false
else
set continue = true
endif
if(continue) then
if(ad.o == OBJECTIVE_GET_VICTOR) then
set AI_Action_Unit = target
set AI_Order = "attack"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_GET_VICTOR
else
set AI_Action_Unit = target
set AI_Order = "attack"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_COMBAT
endif
else
set AI_Action = ACTION_CHASE
endif
else
if(ad.v[ct_index] > PERCEIVE_MAX_LEVEL_CHASE_HERO) then
set AI_Action = ACTION_GET_READY
else
set AI_Action = ACTION_PERCEIVE
endif
endif
else
if(ad.v[ct_index] > PERCEIVE_MAX_LEVEL_CHASE_HERO) then
set AI_Action = ACTION_GET_READY
else
set AI_Action = ACTION_PERCEIVE
endif
endif
else
set AI_Action = ACTION_GET_READY
endif
else
if(ad.u != Conqueror[0]) then
set AI_Action_Unit = ad.b
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_RUN
else
set AI_Action = ACTION_GET_READY
endif
endif
else
if(IsUnitInGroup(ad.u, Unit_Inside_Temple)) then
set AI_Action = ACTION_CHASE
else
set AI_Action_Location = GetRectCenter(gg_rct_Temple_High_Center)
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_TO_LOCATION
endif
endif
else
set AI_Action = ACTION_DEAD
endif
elseif(ad.s == STATE_HERO_PULL) then
if(not IsUnitDead(ad.u)) then
if(Conqueror[0] != Guardian[0]) then
set continue = (ad.u != Conqueror[0])
else
set continue = true
endif
if(continue) then
set perceive = perceive + (Perceive_Score[Perceive_Level_Hero_Life(ad.u, ad.un)] * LIFE_WEIGHTAGE)
set maxScore = maxScore + Hero_Life_Mode(1) * LIFE_WEIGHTAGE
if((perceive * TOTAL_SCORE_ATTITUDE) / maxScore < AI_Player_Attitude[GetPlayerId(ad.p)][0]) then
set continue = false
else
set continue = true
endif
if(continue) then
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set tX = GetUnitX(target)
set tY = GetUnitY(target)
set dx = x - tX
set dy = y - tY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance > PERCEIVE_PULLING_DISTANCE) then
set AI_Action = ACTION_PULL
else
set AI_Order = "stop"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_STOP
endif
else
set AI_Action_Unit = ad.b
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_RUN
endif
else
if(IsUnitInGroup(ad.u, Unit_Inside_Temple)) then
set AI_Action = ACTION_PULL
else
set AI_Action_Location = GetRectCenter(gg_rct_Temple_High_Center)
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_TO_LOCATION
endif
endif
else
set AI_Action = ACTION_DEAD
endif
elseif(ad.s == STATE_GET_VICTOR) then
if(not IsUnitDead(ad.u)) then
if(Conqueror[0] != Guardian[0]) then
set continue = (ad.u != Conqueror[0])
else
set continue = true
endif
if(continue) then
set perceive = perceive + (Perceive_Score[Perceive_Level_Hero_Life(ad.u, ad.un)] * LIFE_WEIGHTAGE)
set maxScore = maxScore + Hero_Life_Mode(1) * LIFE_WEIGHTAGE
if((perceive * TOTAL_SCORE_ATTITUDE) / maxScore < AI_Player_Attitude[GetPlayerId(ad.p)][0]) then
set continue = false
else
set continue = true
endif
if(continue) then
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set continue = false
set memoryInteger1 = 0
set memoryReal1 = 0
set memoryUnit1 = null
call GroupEnumUnitsInRange(all, x, y, PERCEIVE_DETECT_ENEMY_HERO_RADIUS + PERCEIVE_DETECT_ENEMY_HERO_RADIUS * ad.v[ct_index], bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, ad.p) and /*
*/(IsUnitVisible(f, ad.p)) and /*
*/(IsUnitType(f, UNIT_TYPE_HERO)) and /*
*/(GetPlayerId(GetOwningPlayer(f)) < 8)) then
set memoryInteger1 = memoryInteger1 + 1
if(memoryUnit1 == null) then
set memoryUnit1 = f
set memoryReal1 = GetUnitState(f, UNIT_STATE_LIFE)
else
if(memoryReal1 > GetUnitState(f, UNIT_STATE_LIFE)) then
set memoryUnit1 = f
set memoryReal1 = GetUnitState(f, UNIT_STATE_LIFE)
endif
endif
endif
endloop
if(memoryInteger1 > 0) then
if(memoryUnit1 == target) then
set continue = true
else
set memoryReal1 = GetUnitState(target, UNIT_STATE_LIFE)
set memoryReal2 = GetUnitState(memoryUnit1, UNIT_STATE_LIFE)
if(memoryReal1 > memoryReal2) then
set continue = false
else
set continue = true
endif
endif
else
set continue = true
endif
if(continue) then
if(target != null) then
if(not IsUnitDead(target)) then
if(not IsUnitInGroup(target, LoadedHero)) then
if(not Perceive_Unit_Invulnerable(target)) then
if(IsUnitVisible(target, ad.p)) then
set perceive = perceive + (Perceive_Score[Perceive_Level_Hero_Attack_Range(ad.u, target, ad.un)] * ATTACK_RANGE_WEIGHTAGE)
set maxScore = maxScore + Hero_Attack_Range_Mode(1) * ATTACK_RANGE_WEIGHTAGE
if((perceive * TOTAL_SCORE_ATTITUDE) / maxScore < AI_Player_Attitude[GetPlayerId(ad.p)][1]) then
set continue = false
else
set continue = true
endif
if(continue) then
set AI_Action_Unit = target
set AI_Action_Perceive = PERCEIVE_DEFAULT_VALUE
set AI_Order = "attack"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_COMBAT
else
set AI_Action = ACTION_KILL
endif
else
set AI_Action_Unit = target
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_CHASE
endif
else
set AI_Action = ACTION_KILL
endif
else
set AI_Action = ACTION_KILL
endif
else
set AI_Action = ACTION_KILL
endif
else
set AI_Action = ACTION_GET_READY
endif
else
set AI_Action_Unit = memoryUnit1
set AI_Order = "attack"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_CHANGE_TARGET
endif
else
set AI_Action_Unit = ad.b
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_RUN
endif
else
if(IsUnitInGroup(ad.u, Unit_Inside_Temple)) then
set AI_Action = ACTION_KILL
else
set AI_Action_Location = GetRectCenter(gg_rct_Temple_High_Center)
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_TO_LOCATION
endif
endif
else
set AI_Action = ACTION_DEAD
endif
endif
set memoryUnit1 = null
set f = null
set target = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//setting globals
set all = CreateGroup()
set bexpr = Condition(function Pick)
set loc = Location(0.0, 0.0)
set rct = null
set bexprItem = Condition(function Pick_Item)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope AIPerceiveHeroLocation initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and /*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and /*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Item affected
private function Targets_Item takes item target returns boolean
return GetItemType(target) != ITEM_TYPE_PERMANENT and /*
*/IsItemVisible(target) and /*
*/target != null and /*
*/GetWidgetLife(target) > 0
endfunction
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private group all
private boolexpr bexpr
private rect rct
private location loc
private boolexpr bexprItem
private item targetItem
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Pick_Item takes nothing returns boolean
local item filtered = GetFilterItem()
local boolean isTargets = Targets_Item(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Action_Item takes nothing returns nothing
if(targetItem == null) then
set targetItem = GetEnumItem()
endif
endfunction
//----------------------------------------------------------------
function Perceive_Hero_Location takes AI_Base_Data ad, real tX, real tY, integer ct_index returns nothing
local real memoryReal1 = 0.0
local real memoryReal2 = 0.0
local integer memoryInteger1 = 0
local real perceive = 0.0
local real maxScore = 0.0
local boolean continue = false
local real x = 0.0
local real y = 0.0
local real uX = 0.0
local real uY = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local unit f = null
if(ad.s == STATE_HERO_AWARE_LOCATION) then
if(not IsUnitDead(ad.u)) then
if(Conqueror[0] != Guardian[0]) then
set continue = (ad.u != Conqueror[0])
else
set continue = true
endif
if(continue) then
set perceive = perceive + (Perceive_Score[Perceive_Level_Hero_Life(ad.u, ad.un)] * LIFE_WEIGHTAGE)
set maxScore = maxScore + Hero_Life_Mode(1) * LIFE_WEIGHTAGE
if((perceive * TOTAL_SCORE_ATTITUDE) / maxScore < AI_Player_Attitude[GetPlayerId(ad.p)][0]) then
set continue = false
else
set continue = true
endif
if(continue) then
if(ad.o == OBJECTIVE_KILL_UNITS) then
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set memoryInteger1 = 0
call GroupEnumUnitsInRange(all, x, y, PERCEIVE_DETECT_ENEMY_RADIUS, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, ad.p) and /*
*/(IsUnitVisible(f, ad.p)) and /*
*/(not (NeglectingUnits(f))) and /*
*/(IsUnitType(f, UNIT_TYPE_HERO)) and /*
*/(GetPlayerId(GetOwningPlayer(f)) < 8)) then
set memoryInteger1 = memoryInteger1 + 1
endif
endloop
set continue = (memoryInteger1 <= 0)
else
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set memoryInteger1 = 0
call GroupEnumUnitsInRange(all, x, y, PERCEIVE_DETECT_ENEMY_RADIUS, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, ad.p) and /*
*/(IsUnitVisible(f, ad.p)) and /*
*/(not (NeglectingUnits(f)))) then
set memoryInteger1 = memoryInteger1 + 1
endif
endloop
set continue = (memoryInteger1 <= 0)
endif
if(continue) then
set uX = GetUnitX(ad.u)
set uY = GetUnitY(ad.u)
set dx = uX - tX
set dy = uY - tY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance > KNOWLEDGE_LOCATION_NEAR) then
if(ad.ux != uX or ad.uy != uY) then
if(ad.o == OBJECTIVE_GET_VICTOR) then
if(IsLocationVisibleToPlayer(Location(tX, tY), ad.p)) then
set AI_Action_Unit = Conqueror[0]
set AI_Order = "stop"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_GET_VICTOR
else
set AI_Action_Location = Location(tX, tY)
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_NONE
endif
else
set AI_Action_Location = Location(tX, tY)
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_NONE
endif
else
if(ad.v[ct_index] > PERCEIVE_MAX_LEVEL_IMMOBILE) then
set memoryReal1 = GetRandomReal(0.0, 100.0)
set memoryReal2 = GetRandomReal(0.0, 360.0)
set uX = GetUnitX(ad.b) + memoryReal1 * Cos(memoryReal2)
set uY = GetUnitY(ad.b) + memoryReal1 * Sin(memoryReal2)
set AI_Action_Location = Location(uX, uY)
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_BOAT_RECALL
else
set AI_Action_Unit = ad.b
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_PERCEIVE
endif
endif
else
if(ad.o == OBJECTIVE_GET_VICTOR) then
set AI_Action_Unit = Conqueror[0]
set AI_Order = "stop"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_GET_VICTOR
else
set AI_Order = "stop"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_STOP
endif
endif
else
if(ad.o == OBJECTIVE_GET_VICTOR) then
set AI_Action_Unit = Conqueror[0]
set AI_Order = "stop"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_GET_VICTOR
else
set AI_Order = "stop"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_STOP
endif
endif
else
set AI_Action_Unit = ad.b
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_RUN
endif
else
if(RectContainsLoc(gg_rct_Temple_High_Center, Location(tX, tY))) then
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set dx = x - tX
set dy = y - tY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance > PERCEIVE_FOLLOW_DISTANCE) then
set AI_Action_Location = Location(tX, tY)
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_NONE
else
set AI_Order = "stop"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_STOP
endif
else
if(IsUnitInGroup(ad.u, Unit_Inside_Temple)) then
set AI_Order = "stop"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_STOP
else
set AI_Action_Location = GetRectCenter(gg_rct_Temple_High_Center)
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_NONE
endif
endif
endif
else
set AI_Action = ACTION_DEAD
endif
elseif(ad.s == STATE_HERO_RUN) then
if(not IsUnitDead(ad.u)) then
set uX = GetUnitX(ad.u)
set uY = GetUnitY(ad.u)
if(ad.ux != uX or ad.uy != uY) then
set AI_Action = ACTION_NONE
else
if(ad.v[ct_index] > PERCEIVE_MAX_LEVEL_IMMOBILE) then
set memoryReal1 = GetRandomReal(0.0, 100.0)
set memoryReal2 = GetRandomReal(0.0, 360.0)
set uX = uX + memoryReal1 * Cos(memoryReal2)
set uY = uY + memoryReal1 * Sin(memoryReal2)
set AI_Action_Location = Location(uX, uY)
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_BOAT_RECALL
else
set AI_Action = ACTION_PERCEIVE
endif
endif
else
set AI_Action = ACTION_DEAD
endif
elseif(ad.s == STATE_HERO_NEED_LOAD) then
if(not IsUnitDead(ad.u)) then
set uX = GetUnitX(ad.u)
set uY = GetUnitY (ad.u)
if(ad.ux != uX or ad.uy != uY) then
set AI_Action_Unit = ad.b
set AI_Order = "smart"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_NONE
else
if(ad.v[ct_index] > PERCEIVE_MAX_LEVEL_IMMOBILE) then
set memoryReal1 = GetRandomReal(0.0, 100.0)
set memoryReal2 = GetRandomReal(0.0, 360.0)
set uX = uX + memoryReal1 * Cos(memoryReal2)
set uY = uY + memoryReal1 * Sin(memoryReal2)
set AI_Action_Location = Location(uX, uY)
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_BOAT_RECALL
else
set AI_Action_Unit = ad.b
set AI_Order = "smart"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_PERCEIVE
endif
endif
else
set AI_Action = ACTION_DEAD
endif
elseif(ad.s == STATE_HERO_PULL) then
if(not IsUnitDead(ad.u)) then
set perceive = perceive + (Perceive_Score[Perceive_Level_Hero_Life(ad.u, ad.un)] * LIFE_WEIGHTAGE)
set maxScore = maxScore + Hero_Life_Mode(1) * LIFE_WEIGHTAGE
if((perceive * TOTAL_SCORE_ATTITUDE) / maxScore < AI_Player_Attitude[GetPlayerId(ad.p)][0]) then
set continue = false
else
set continue = true
endif
if(continue) then
set uX = GetUnitX(ad.u)
set uY = GetUnitY(ad.u)
set dx = uX - tX
set dy = uY - tY
set distance = SquareRoot(dx * dx + dy * dy)
if(distance > KNOWLEDGE_LOCATION_NEAR) then
if(ad.ux != uX or ad.uy != uY) then
set AI_Action = ACTION_NONE
else
if(ad.v[ct_index] > PERCEIVE_MAX_LEVEL_IMMOBILE) then
set memoryReal1 = GetRandomReal(0.0, 100.0)
set memoryReal2 = GetRandomReal(0.0, 360.0)
set uX = uX + memoryReal1 * Cos(memoryReal2)
set uY = uY + memoryReal1 * Sin(memoryReal2)
set AI_Action_Location = Location(uX, uY)
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_BOAT_RECALL
else
set AI_Action = ACTION_PERCEIVE
endif
endif
else
set AI_Order = "stop"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_STOP
endif
else
if(ad.u != Conqueror[0]) then
set AI_Action_Unit = ad.b
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_RUN
else
set AI_Order = "stop"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_STOP
endif
endif
else
set AI_Action = ACTION_DEAD
endif
elseif(ad.s == STATE_HERO_CAST) then
endif
set f = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//setting globals
set all = CreateGroup()
set bexpr = Condition(function Pick)
set loc = Location(0.0, 0.0)
set rct = null
set bexprItem = Condition(function Pick_Item)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope AIPerceiveHeroLife initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and /*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and /*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Item affected
private function Targets_Item takes item target returns boolean
return GetItemType(target) != ITEM_TYPE_PERMANENT and /*
*/IsItemVisible(target) and /*
*/target != null and /*
*/GetWidgetLife(target) > 0
endfunction
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private group all
private boolexpr bexpr
private rect rct
private location loc
private boolexpr bexprItem
private item targetItem
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Pick_Item takes nothing returns boolean
local item filtered = GetFilterItem()
local boolean isTargets = Targets_Item(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Action_Item takes nothing returns nothing
if(targetItem == null) then
set targetItem = GetEnumItem()
endif
endfunction
//----------------------------------------------------------------
function Perceive_Hero_Life takes AI_Base_Data ad, integer ct_index returns nothing
local real memoryReal1 = 0.0
local real perceive = 0.0
local real maxScore = 0.0
local real life = 0.0
local real maxLife = 0.0
if(ad.s == STATE_HERO_LOAD) then
set perceive = perceive + (Perceive_Score[Perceive_Level_Hero_Life(ad.u, ad.un)] * LIFE_WEIGHTAGE)
set maxScore = maxScore + Hero_Life_Mode(1) * LIFE_WEIGHTAGE
if((perceive * TOTAL_SCORE_ATTITUDE) / maxScore < AI_Player_Attitude[GetPlayerId(ad.p)][0]) then
set AI_Action = ACTION_NONE
else
set AI_Action = ACTION_UNLOAD_HERO
endif
elseif(ad.s == STATE_HERO_FARM) then
set life = GetUnitState(ad.u, UNIT_STATE_LIFE)
set maxLife = GetUnitState(ad.u, UNIT_STATE_MAX_LIFE)
if(life < ad.ul) then
set memoryReal1 = (life - ad.ul) / maxLife
if(maxLife > KNOWLEDGE_LIFE_ABSORB_DANGER) then
if(ad.v[ct_index] > PERCEIVE_MAX_LEVEL_DANGER) then
set AI_Action = ACTION_PULL
else
set AI_Action = ACTION_GO_FARM
endif
else
set AI_Action = ACTION_GO_FARM
endif
else
set AI_Action = ACTION_GO_FARM
endif
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//setting globals
set all = CreateGroup()
set bexpr = Condition(function Pick)
set loc = Location(0.0, 0.0)
set rct = null
set bexprItem = Condition(function Pick_Item)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope AIPerceiveHeroSkill initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and /*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and /*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Item affected
private function Targets_Item takes item target returns boolean
return GetItemType(target) != ITEM_TYPE_PERMANENT and /*
*/IsItemVisible(target) and /*
*/target != null and /*
*/GetWidgetLife(target) > 0
endfunction
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private group all
private boolexpr bexpr
private rect rct
private location loc
private boolexpr bexprItem
private item targetItem
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Pick_Item takes nothing returns boolean
local item filtered = GetFilterItem()
local boolean isTargets = Targets_Item(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Action_Item takes nothing returns nothing
if(targetItem == null) then
set targetItem = GetEnumItem()
endif
endfunction
//----------------------------------------------------------------
function Perceive_Hero_Skill takes AI_Base_Data ad, integer sIndex, integer sLevel, real sCooldown, integer sRequireLevel, integer ct_index returns nothing
local integer memoryInteger1 = 0
local integer memoryInteger2 = 0
local unit memoryUnit1 = null
local real perceive = 0.0
local real maxScore = 0.0
local boolean continue = false
local real x = 0.0
local real y = 0.0
local unit f = null
if(ad.s == STATE_HERO_NEED_READY) then
if(ad.usr) then
if(ad.v[ct_index] <= TOTAL_HERO_SKILL) then
if(sLevel > 0) then
if(AI_Ability_Order[ad.un][sIndex] != "") then
if(sCooldown <= 0.0) then
if(GetUnitState(ad.u, UNIT_STATE_MANA) >= GetHeroAbilityManaCost(ad.un, sIndex, sLevel)) then
if(AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_ULTIMATE_ACTIVATE or /*
*/AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_DEFENSE_ACTIVATE) then
if(GetUnitAbilityLevel(ad.u, AI_Ability_Buff[ad.un][sIndex]) > 0) then
set AI_Action_ID = sIndex
set AI_Order = AI_Ability_Order_Next[ad.un][sIndex]
set AI_Action = ACTION_CAST
else
set AI_Action = ACTION_PERCEIVE
endif
elseif(AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_ULTIMATE_TRANSFORM) then
if(GetUnitTypeId(ad.u) != ad.uid) then
set AI_Action_ID = sIndex
set AI_Order = AI_Ability_Order_Next[ad.un][sIndex]
set AI_Action = ACTION_CAST
else
set AI_Action = ACTION_PERCEIVE
endif
else
set AI_Action = ACTION_PERCEIVE
endif
else
set AI_Action = ACTION_PERCEIVE
endif
else
set AI_Action = ACTION_WAIT
endif
else
set AI_Action = ACTION_PERCEIVE
endif
else
set AI_Action = ACTION_PERCEIVE
endif
else
set AI_Action = ACTION_LOAD_HERO
endif
else
set AI_Action_Location = Location(GetUnitX(ad.b), GetUnitY(ad.b))
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_LOAD_HERO
endif
elseif(ad.s == STATE_HERO_READY) then
if(ad.o == OBJECTIVE_NEUTRAL or /*
*/ad.o == OBJECTIVE_KILL_UNITS or /*
*/ad.o == OBJECTIVE_KILL_HEROES or /*
*/ad.o == OBJECTIVE_GET_VICTOR or /*
*/ad.o == OBJECTIVE_KILL_ATOK or /*
*/ad.o == OBJECTIVE_RUN) then
set continue = true
set memoryInteger1 = TOTAL_HERO_SKILL - 1
set memoryInteger2 = -1
loop
exitwhen(memoryInteger1 < 0)
if(GetHeroLevel(ad.u) > ad.usrl[memoryInteger1] and /*
*/(AI_Ability_Type[ad.un][memoryInteger1] == ABILITY_TYPE_ULTIMATE or /*
*/AI_Ability_Type[ad.un][memoryInteger1] == ABILITY_TYPE_ULTIMATE_ACTIVATE or /*
*/AI_Ability_Type[ad.un][memoryInteger1] == ABILITY_TYPE_ULTIMATE_TRANSFORM)) then
set continue = false
set memoryInteger2 = memoryInteger1
endif
set memoryInteger1 = memoryInteger1 - 1
endloop
if(continue) then
set AI_Action_ID = OBJECTIVE_SEARCH
set AI_Action = ACTION_CHANGE_OBJECTIVE
else
set AI_Action_ID = AI_Ability_ID[ad.un][memoryInteger2]
set AI_Action_Perceive = memoryInteger2
set AI_Action = ACTION_LEARN
endif
elseif(ad.o == OBJECTIVE_SEARCH) then
if(ad.v[ct_index] <= TOTAL_HERO_SKILL) then
if(GetHeroLevel(ad.u) > sRequireLevel) then
if(sLevel < AI_Ability_Level[ad.un][ad.v[ct_index]]) then
if(ad.ut == HERO_ATTITUDE_TYPE_OFFENSE) then
if(AI_Ability_Type[ad.un][ad.v[ct_index]] == ABILITY_TYPE_OFFENSE) then
if(ad.im < 0) then
set AI_Action_ID = ad.v[ct_index]
set AI_Action_Perceive = ad.v[ct_index] + 1
set AI_Action = ACTION_REMEMBER
elseif(AI_Ability_Type_Score[ad.un][ad.im] < AI_Ability_Type_Score[ad.un][ad.v[ct_index]]) then
set AI_Action_ID = ad.v[ct_index]
set AI_Action_Perceive = ad.v[ct_index] + 1
set AI_Action = ACTION_REMEMBER
else
set AI_Action = ACTION_PERCEIVE
endif
else
set AI_Action = ACTION_PERCEIVE
endif
elseif(ad.ut == HERO_ATTITUDE_TYPE_DEFENSE) then
if(AI_Ability_Type[ad.un][ad.v[ct_index]] == ABILITY_TYPE_DEFENSE or /*
*/AI_Ability_Type[ad.un][ad.v[ct_index]] == ABILITY_TYPE_DEFENSE_ACTIVATE) then
if(ad.im < 0) then
set AI_Action_ID = ad.v[ct_index]
set AI_Action_Perceive = ad.v[ct_index] + 1
set AI_Action = ACTION_REMEMBER
elseif(AI_Ability_Type_Score[ad.un][ad.im] < AI_Ability_Type_Score[ad.un][ad.v[ct_index]]) then
set AI_Action_ID = ad.v[ct_index]
set AI_Action_Perceive = ad.v[ct_index] + 1
set AI_Action = ACTION_REMEMBER
else
set AI_Action = ACTION_PERCEIVE
endif
else
set AI_Action = ACTION_PERCEIVE
endif
else
set AI_Action = ACTION_PERCEIVE
endif
else
set AI_Action = ACTION_PERCEIVE
endif
else
set AI_Action = ACTION_PERCEIVE
endif
else
if(ad.im < 0) then
set AI_Action_ID = OBJECTIVE_TEST
set AI_Action = ACTION_CHANGE_OBJECTIVE
else
set AI_Action_ID = AI_Ability_ID[ad.un][ad.im]
set AI_Action_Perceive = ad.im
set AI_Action = ACTION_LEARN
endif
endif
elseif(ad.o == OBJECTIVE_TEST) then
if(ad.im < 0) then
set AI_Action_ID = GetRandomInt(0, TOTAL_HERO_SKILL-1)
set AI_Action_Perceive = AI_Action_ID
set AI_Action = ACTION_REPERCEIVE
else
if(GetHeroLevel(ad.u) > sRequireLevel) then
if(sLevel < AI_Ability_Level[ad.un][ad.v[ct_index]]) then
set AI_Action_ID = AI_Ability_ID[ad.un][ad.im]
set AI_Action_Perceive = ad.im
set AI_Action = ACTION_LEARN
else
set AI_Action_ID = -1
set AI_Action_Perceive = PERCEIVE_DEFAULT_VALUE
set AI_Action = ACTION_REMEMBER
endif
else
set AI_Action_ID = -1
set AI_Action_Perceive = PERCEIVE_DEFAULT_VALUE
set AI_Action = ACTION_REMEMBER
endif
endif
endif
elseif(ad.s == STATE_HERO_FARM) then
if(ad.v[ct_index] <= TOTAL_HERO_SKILL) then
if(sLevel > 0) then
if(AI_Ability_Order[ad.un][sIndex] != "") then
if(sCooldown <= 0.0) then
if(GetUnitState(ad.u, UNIT_STATE_MANA) >= GetHeroAbilityManaCost(ad.un, sIndex, sLevel)) then
set perceive = perceive + (Perceive_Score[Perceive_Level_Hero_Mana(ad.u, ad.un)] * LIFE_WEIGHTAGE)
set maxScore = maxScore + Hero_Mana_Mode(1) * LIFE_WEIGHTAGE
if((perceive * TOTAL_SCORE_ATTITUDE) / maxScore < AI_Player_Attitude[GetPlayerId(ad.p)][4]) then
set continue = false
else
set continue = true
endif
if(continue) then
if(AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_DEFENSE or /*
*/AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_DEFENSE_ACTIVATE or /*
*/AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_OFFENSE or /*
*/AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_MOBILE_OFFENSE) then
if(AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_DEFENSE_ACTIVATE) then
if(GetUnitAbilityLevel(ad.u, AI_Ability_Buff[ad.un][sIndex]) > 0) then
set AI_Action_ID = sIndex
set AI_Order = AI_Ability_Order[ad.un][sIndex]
set AI_Action = ACTION_CAST
else
set AI_Action = ACTION_COMBAT
endif
else
set AI_Action_ID = sIndex
set AI_Order = AI_Ability_Order[ad.un][sIndex]
set AI_Action = ACTION_CAST
endif
else
set AI_Action = ACTION_COMBAT
endif
else
set AI_Action = ACTION_PERCEIVE
endif
else
set AI_Action = ACTION_PERCEIVE
endif
else
set AI_Action = ACTION_COMBAT
endif
else
set AI_Action = ACTION_COMBAT
endif
else
set AI_Action = ACTION_COMBAT
endif
else
set AI_Action = ACTION_COMBAT
endif
elseif(ad.s == STATE_HERO_KILL) then
if(ad.v[ct_index] <= TOTAL_HERO_SKILL) then
if(sLevel > 0) then
if(AI_Ability_Order[ad.un][sIndex] != "") then
if(sCooldown <= 0.0) then
if(GetUnitState(ad.u, UNIT_STATE_MANA) >= GetHeroAbilityManaCost(ad.un, sIndex, sLevel)) then
set perceive = perceive + (Perceive_Score[Perceive_Level_Hero_Mana(ad.u, ad.un)] * LIFE_WEIGHTAGE)
set maxScore = maxScore + Hero_Mana_Mode(1) * LIFE_WEIGHTAGE
if((perceive * TOTAL_SCORE_ATTITUDE) / maxScore < AI_Player_Attitude[GetPlayerId(ad.p)][4]) then
set continue = false
else
set continue = true
endif
if(continue) then
if(AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_DEFENSE or /*
*/AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_DEFENSE_ACTIVATE or /*
*/AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_OFFENSE or /*
*/AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_MOBILE_OFFENSE or /*
*/AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_ULTIMATE or /*
*/AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_ULTIMATE_ACTIVATE or /*
*/AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_ULTIMATE_TRANSFORM) then
if(GamePhase != GAME_PHASE_END) then
if(AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_DEFENSE_ACTIVATE) then
if(GetUnitAbilityLevel(ad.u, AI_Ability_Buff[ad.un][sIndex]) > 0) then
set AI_Action_ID = sIndex
set AI_Order = AI_Ability_Order[ad.un][sIndex]
set AI_Action = ACTION_CAST
else
set AI_Action = ACTION_COMBAT
endif
else
set AI_Action_ID = sIndex
set AI_Order = AI_Ability_Order[ad.un][sIndex]
set AI_Action = ACTION_CAST
endif
else
if(AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_DEFENSE_ACTIVATE) then
if(GetUnitAbilityLevel(ad.u, AI_Ability_Buff[ad.un][sIndex]) > 0) then
set AI_Action_ID = sIndex
set AI_Order = AI_Ability_Order[ad.un][sIndex]
set AI_Action = ACTION_KILL_ATOK
else
set AI_Action = ACTION_COMBAT
endif
else
set AI_Action_ID = sIndex
set AI_Order = AI_Ability_Order[ad.un][sIndex]
set AI_Action = ACTION_KILL_ATOK
endif
endif
else
set AI_Action = ACTION_COMBAT
endif
else
set AI_Action = ACTION_PERCEIVE
endif
else
set AI_Action = ACTION_PERCEIVE
endif
else
set AI_Action = ACTION_COMBAT
endif
else
set AI_Action = ACTION_COMBAT
endif
else
set AI_Action = ACTION_COMBAT
endif
else
set AI_Action = ACTION_COMBAT
endif
elseif(ad.s == STATE_HERO_RUN) then
if(ad.v[ct_index] <= TOTAL_HERO_SKILL) then
if(sLevel > 0) then
if(AI_Ability_Order[ad.un][sIndex] != "") then
if(sCooldown <= 0.0) then
if(GetUnitState(ad.u, UNIT_STATE_MANA) >= GetHeroAbilityManaCost(ad.un, sIndex, sLevel)) then
if(AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_MOBILE or /*
*/AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_MOBILE_OFFENSE) then
set AI_Action_ID = sIndex
set AI_Order = AI_Ability_Order[ad.un][sIndex]
set AI_Action = ACTION_CAST
else
set AI_Action = ACTION_RUN
endif
else
set AI_Action = ACTION_PERCEIVE
endif
else
set AI_Action = ACTION_RUN
endif
else
set AI_Action = ACTION_RUN
endif
else
set AI_Action = ACTION_RUN
endif
else
set AI_Action = ACTION_RUN
endif
elseif(ad.s == STATE_HERO_CHASE) then
if(ad.v[ct_index] <= TOTAL_HERO_SKILL) then
if(sLevel > 0) then
if(AI_Ability_Order[ad.un][sIndex] != "") then
if(sCooldown <= 0.0) then
if(GetUnitState(ad.u, UNIT_STATE_MANA) >= GetHeroAbilityManaCost(ad.un, sIndex, sLevel)) then
if(AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_MOBILE or /*
*/AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_MOBILE_OFFENSE) then
set AI_Action_ID = sIndex
set AI_Order = AI_Ability_Order[ad.un][sIndex]
set AI_Action = ACTION_CAST
else
set AI_Action = ACTION_CHASE
endif
else
set AI_Action = ACTION_PERCEIVE
endif
else
set AI_Action = ACTION_PERCEIVE
endif
else
set AI_Action = ACTION_CHASE
endif
else
set AI_Action = ACTION_CHASE
endif
else
set AI_Action = ACTION_CHASE
endif
elseif(ad.s == STATE_HERO_CAST) then
if(GetHeroAbilityMode(ad.un, sIndex, sLevel) == KNOWLEDGE_ABILITY_MODE_SELF) then
if(ad.o == OBJECTIVE_NEUTRAL) then
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set memoryInteger1 = 0
call GroupEnumUnitsInRange(all, x, y, GetHeroAbilityDetectArea(ad.un, sIndex, sLevel), bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, ad.p) and /*
*/(IsUnitVisible(f, ad.p)) and /*
*/(not IsUnitType(f, UNIT_TYPE_HERO)) and /*
*/(not (NeglectingUnits(f)))) then
set memoryInteger1 = memoryInteger1 + 1
endif
endloop
if(memoryInteger1 >= KNOWLEDGE_DETECT_AMOUNT_UNITS) then
set AI_Action_Unit = ad.u
set AI_Order = AI_Ability_Order[ad.un][sIndex]
set AI_Order_Type = AI_Ability_Order_Type[ad.un][sIndex]
set AI_Action = ACTION_CAST
else
if(ad.v[ct_index] >= PERCEIVE_MAX_LEVEL_CASTING) then
set AI_Action = ACTION_NONE
else
set AI_Action = ACTION_PERCEIVE
endif
endif
elseif(ad.o == OBJECTIVE_KILL_UNITS) then
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set memoryInteger1 = 0
call GroupEnumUnitsInRange(all, x, y, GetHeroAbilityDetectArea(ad.un, sIndex, sLevel), bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, ad.p) and /*
*/(IsUnitVisible(f, ad.p)) and /*
*/(not IsUnitType(f, UNIT_TYPE_HERO)) and /*
*/(not (NeglectingUnits(f)))) then
set memoryInteger1 = memoryInteger1 + 1
endif
endloop
if(memoryInteger1 >= KNOWLEDGE_DETECT_AMOUNT_UNITS) then
set AI_Action_Unit = ad.u
set AI_Order = AI_Ability_Order[ad.un][sIndex]
set AI_Order_Type = AI_Ability_Order_Type[ad.un][sIndex]
set AI_Action = ACTION_CAST
else
if(ad.v[ct_index] >= PERCEIVE_MAX_LEVEL_CASTING) then
set AI_Action = ACTION_NONE
else
set AI_Action = ACTION_PERCEIVE
endif
endif
elseif(ad.o == OBJECTIVE_KILL_HEROES or /*
*/ad.o == OBJECTIVE_GET_VICTOR or /*
*/ad.o == OBJECTIVE_KILL_ATOK) then
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set memoryInteger1 = 0
call GroupEnumUnitsInRange(all, x, y, GetHeroAbilityDetectArea(ad.un, sIndex, sLevel), bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, ad.p) and /*
*/(IsUnitVisible(f, ad.p)) and /*
*/(IsUnitType(f, UNIT_TYPE_HERO)) and /*
*/(not (NeglectingUnits(f)))) then
if(ad.o == OBJECTIVE_KILL_ATOK) then
if(f == Atok) then
set memoryInteger1 = memoryInteger1 + 1
endif
else
if(ad.o == OBJECTIVE_KILL_HEROES) then
if(GetPlayerId(GetOwningPlayer(f)) < 8) then
set memoryInteger1 = memoryInteger1 + 1
endif
elseif(ad.o == OBJECTIVE_GET_VICTOR) then
//if(GetUnitTypeId(f) == KNOWLEDGE_REVENANT_WAKE) then
set memoryInteger1 = memoryInteger1 + 1
//endif
endif
endif
endif
endloop
if(memoryInteger1 >= KNOWLEDGE_DETECT_AMOUNT_HEROES) then
set AI_Action_Unit = ad.u
set AI_Order = AI_Ability_Order[ad.un][sIndex]
set AI_Order_Type = AI_Ability_Order_Type[ad.un][sIndex]
set AI_Action = ACTION_CAST
else
if(ad.v[ct_index] >= PERCEIVE_MAX_LEVEL_CASTING) then
set AI_Action = ACTION_NONE
else
set AI_Action = ACTION_PERCEIVE
endif
endif
elseif(ad.o == OBJECTIVE_RUN) then
set memoryUnit1 = ad.b
if(memoryUnit1 != null) then
set AI_Action_Unit = memoryUnit1
set AI_Order = AI_Ability_Order[ad.un][sIndex]
set AI_Order_Type = AI_Ability_Order_Type[ad.un][sIndex]
set AI_Action = ACTION_CAST
else
if(ad.v[ct_index] >= PERCEIVE_MAX_LEVEL_CASTING) then
set AI_Action = ACTION_NONE
else
set AI_Action = ACTION_PERCEIVE
endif
endif
else
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set memoryInteger1 = 0
call GroupEnumUnitsInRange(all, x, y, GetHeroAbilityDetectArea(ad.un, sIndex, sLevel), bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, ad.p) and /*
*/(IsUnitVisible(f, ad.p)) and /*
*/(not IsUnitType(f, UNIT_TYPE_HERO)) and /*
*/(not (NeglectingUnits(f)))) then
set memoryInteger1 = memoryInteger1 + 1
endif
endloop
if(memoryInteger1 >= KNOWLEDGE_DETECT_AMOUNT_UNITS) then
set AI_Action_Unit = ad.u
set AI_Order = AI_Ability_Order[ad.un][sIndex]
set AI_Order_Type = AI_Ability_Order_Type[ad.un][sIndex]
set AI_Action = ACTION_CAST
else
if(ad.v[ct_index] >= PERCEIVE_MAX_LEVEL_CASTING) then
set AI_Action = ACTION_NONE
else
set AI_Action = ACTION_PERCEIVE
endif
endif
endif
elseif(GetHeroAbilityMode(ad.un, sIndex, sLevel) == KNOWLEDGE_ABILITY_MODE_ALLY) then
if(ad.o == OBJECTIVE_NEUTRAL) then
set memoryUnit1 = ad.u
if(memoryUnit1 != null) then
set AI_Action_Unit = memoryUnit1
set AI_Order = AI_Ability_Order[ad.un][sIndex]
set AI_Order_Type = AI_Ability_Order_Type[ad.un][sIndex]
set AI_Action = ACTION_CAST
else
if(ad.v[ct_index] >= PERCEIVE_MAX_LEVEL_CASTING) then
set AI_Action = ACTION_NONE
else
set AI_Action = ACTION_PERCEIVE
endif
endif
elseif(ad.o == OBJECTIVE_RUN) then
set memoryUnit1 = ad.b
if(memoryUnit1 != null) then
set AI_Action_Unit = memoryUnit1
set AI_Order = AI_Ability_Order[ad.un][sIndex]
set AI_Order_Type = AI_Ability_Order_Type[ad.un][sIndex]
set AI_Action = ACTION_CAST
else
if(ad.v[ct_index] >= PERCEIVE_MAX_LEVEL_CASTING) then
set AI_Action = ACTION_NONE
else
set AI_Action = ACTION_PERCEIVE
endif
endif
else
set memoryUnit1 = ad.u
if(memoryUnit1 != null) then
set AI_Action_Unit = memoryUnit1
set AI_Action = ACTION_CAST
set AI_Order = AI_Ability_Order[ad.un][sIndex]
set AI_Order_Type = AI_Ability_Order_Type[ad.un][sIndex]
else
if(ad.v[ct_index] >= PERCEIVE_MAX_LEVEL_CASTING) then
set AI_Action = ACTION_NONE
else
set AI_Action = ACTION_PERCEIVE
endif
endif
endif
elseif(GetHeroAbilityMode(ad.un, sIndex, sLevel) == KNOWLEDGE_ABILITY_MODE_ENEMY) then
if(ad.o == OBJECTIVE_NEUTRAL) then
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set memoryInteger1 = 0
set memoryUnit1 = null
call GroupEnumUnitsInRange(all, x, y, GetHeroAbilityDetectArea(ad.un, sIndex, sLevel), bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, ad.p) and /*
*/(IsUnitVisible(f, ad.p)) and /*
*/(not IsUnitType(f, UNIT_TYPE_HERO)) and /*
*/(not (NeglectingUnits(f))) and /*
*/(not IsUnitType(f, UNIT_TYPE_MAGIC_IMMUNE))) then
set memoryInteger1 = memoryInteger1 + 1
if(memoryUnit1 == null) then
set memoryUnit1 = f
endif
endif
endloop
if(memoryInteger1 >= KNOWLEDGE_DETECT_AMOUNT_UNITS) then
set AI_Action_Unit = memoryUnit1
set AI_Order = AI_Ability_Order[ad.un][sIndex]
set AI_Order_Type = AI_Ability_Order_Type[ad.un][sIndex]
set AI_Action = ACTION_CAST
else
if(ad.v[ct_index] >= PERCEIVE_MAX_LEVEL_CASTING) then
set AI_Action = ACTION_NONE
else
set AI_Action = ACTION_PERCEIVE
endif
endif
elseif(ad.o == OBJECTIVE_KILL_UNITS) then
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set memoryInteger1 = 0
set memoryUnit1 = null
call GroupEnumUnitsInRange(all, x, y, GetHeroAbilityDetectArea(ad.un, sIndex, sLevel), bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, ad.p) and /*
*/(IsUnitVisible(f, ad.p)) and /*
*/(not IsUnitType(f, UNIT_TYPE_HERO)) and /*
*/(not (NeglectingUnits(f))) and /*
*/(not IsUnitType(f, UNIT_TYPE_MAGIC_IMMUNE))) then
set memoryInteger1 = memoryInteger1 + 1
if(memoryUnit1 == null) then
set memoryUnit1 = f
endif
endif
endloop
if(memoryInteger1 >= KNOWLEDGE_DETECT_AMOUNT_UNITS) then
set AI_Action_Unit = memoryUnit1
set AI_Order = AI_Ability_Order[ad.un][sIndex]
set AI_Order_Type = AI_Ability_Order_Type[ad.un][sIndex]
set AI_Action = ACTION_CAST
else
if(ad.v[ct_index] >= PERCEIVE_MAX_LEVEL_CASTING) then
set AI_Action = ACTION_NONE
else
set AI_Action = ACTION_PERCEIVE
endif
endif
elseif(ad.o == OBJECTIVE_KILL_HEROES or /*
*/ad.o == OBJECTIVE_GET_VICTOR or /*
*/ad.o == OBJECTIVE_KILL_ATOK) then
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set memoryInteger1 = 0
set memoryUnit1 = null
call GroupEnumUnitsInRange(all, x, y, GetHeroAbilityDetectArea(ad.un, sIndex, sLevel), bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, ad.p) and /*
*/(IsUnitVisible(f, ad.p)) and /*
*/(IsUnitType(f, UNIT_TYPE_HERO)) and /*
*/(not (NeglectingUnits(f))) and /*
*/(not IsUnitType(f, UNIT_TYPE_MAGIC_IMMUNE))) then
if(ad.o == OBJECTIVE_KILL_ATOK) then
if(f == Atok) then
set memoryInteger1 = memoryInteger1 + 1
if(memoryUnit1 == null) then
set memoryUnit1 = f
endif
endif
else
if(ad.o == OBJECTIVE_KILL_HEROES) then
if(GetPlayerId(GetOwningPlayer(f)) < 8) then
set memoryInteger1 = memoryInteger1 + 1
if(memoryUnit1 == null) then
set memoryUnit1 = f
endif
endif
elseif(ad.o == OBJECTIVE_GET_VICTOR) then
//if(GetUnitTypeId(f) == KNOWLEDGE_REVENANT_WAKE) then
set memoryInteger1 = memoryInteger1 + 1
if(memoryUnit1 == null) then
set memoryUnit1 = f
endif
//endif
endif
endif
endif
endloop
if(memoryInteger1 >= KNOWLEDGE_DETECT_AMOUNT_HEROES) then
set AI_Action_Unit = memoryUnit1
set AI_Order = AI_Ability_Order[ad.un][sIndex]
set AI_Order_Type = AI_Ability_Order_Type[ad.un][sIndex]
set AI_Action = ACTION_CAST
else
if(ad.v[ct_index] >= PERCEIVE_MAX_LEVEL_CASTING) then
set AI_Action = ACTION_NONE
else
set AI_Action = ACTION_PERCEIVE
endif
endif
else
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
set memoryInteger1 = 0
call GroupEnumUnitsInRange(all, x, y, GetHeroAbilityDetectArea(ad.un, sIndex, sLevel), bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, ad.p) and /*
*/(IsUnitVisible(f, ad.p)) and /*
*/(not (NeglectingUnits(f))) and /*
*/(not IsUnitType(f, UNIT_TYPE_MAGIC_IMMUNE))) then
set memoryInteger1 = memoryInteger1 + 1
if(memoryUnit1 == null) then
set memoryUnit1 = f
endif
endif
endloop
if(memoryInteger1 >= KNOWLEDGE_DETECT_AMOUNT_UNITS) then
set AI_Action_Unit = memoryUnit1
set AI_Order = AI_Ability_Order[ad.un][sIndex]
set AI_Order_Type = AI_Ability_Order_Type[ad.un][sIndex]
set AI_Action = ACTION_CAST
else
if(ad.v[ct_index] >= PERCEIVE_MAX_LEVEL_CASTING) then
set AI_Action = ACTION_NONE
else
set AI_Action = ACTION_PERCEIVE
endif
endif
endif
endif
elseif(ad.s == STATE_GET_VICTOR) then
if(ad.v[ct_index] <= TOTAL_HERO_SKILL) then
if(sLevel > 0) then
if(AI_Ability_Order[ad.un][sIndex] != "") then
if(sCooldown <= 0.0) then
if(GetUnitState(ad.u, UNIT_STATE_MANA) >= GetHeroAbilityManaCost(ad.un, sIndex, sLevel)) then
set perceive = perceive + (Perceive_Score[Perceive_Level_Hero_Mana(ad.u, ad.un)] * LIFE_WEIGHTAGE)
set maxScore = maxScore + Hero_Mana_Mode(1) * LIFE_WEIGHTAGE
if((perceive * TOTAL_SCORE_ATTITUDE) / maxScore < AI_Player_Attitude[GetPlayerId(ad.p)][4]) then
set continue = false
else
set continue = true
endif
if(continue) then
if(AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_DEFENSE or /*
*/AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_DEFENSE_ACTIVATE or /*
*/AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_OFFENSE or /*
*/AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_MOBILE_OFFENSE or /*
*/AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_ULTIMATE or /*
*/AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_ULTIMATE_ACTIVATE or /*
*/AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_ULTIMATE_TRANSFORM) then
if(AI_Ability_Type[ad.un][sIndex] == ABILITY_TYPE_DEFENSE_ACTIVATE) then
if(GetUnitAbilityLevel(ad.u, AI_Ability_Buff[ad.un][sIndex]) > 0) then
set AI_Action_ID = sIndex
set AI_Order = AI_Ability_Order[ad.un][sIndex]
set AI_Action = ACTION_CAST
else
set AI_Action = ACTION_COMBAT
endif
else
set AI_Action_ID = sIndex
set AI_Order = AI_Ability_Order[ad.un][sIndex]
set AI_Action = ACTION_CAST
endif
else
set AI_Action = ACTION_COMBAT
endif
else
set AI_Action = ACTION_PERCEIVE
endif
else
set AI_Action = ACTION_PERCEIVE
endif
else
set AI_Action = ACTION_COMBAT
endif
else
set AI_Action = ACTION_COMBAT
endif
else
set AI_Action = ACTION_COMBAT
endif
else
set AI_Action = ACTION_COMBAT
endif
endif
set memoryUnit1 = null
set f = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//setting globals
set all = CreateGroup()
set bexpr = Condition(function Pick)
set loc = Location(0.0, 0.0)
set rct = null
set bexprItem = Condition(function Pick_Item)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope AIPerceiveBoat initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and /*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and /*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Item affected
private function Targets_Item takes item target returns boolean
return GetItemType(target) != ITEM_TYPE_PERMANENT and /*
*/IsItemVisible(target) and /*
*/target != null and /*
*/GetWidgetLife(target) > 0
endfunction
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private group all
private boolexpr bexpr
private rect rct
private location loc
private boolexpr bexprItem
private item targetItem
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Pick_Item takes nothing returns boolean
local item filtered = GetFilterItem()
local boolean isTargets = Targets_Item(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Action_Item takes nothing returns nothing
if(targetItem == null) then
set targetItem = GetEnumItem()
endif
endfunction
//----------------------------------------------------------------
function Perceive_Boat takes AI_Base_Data ad, integer ct_index returns nothing
local unit memoryUnit1 = null
local integer memoryInteger1 = 0
local real x = 0.0
local real y = 0.0
local real dx = 0.0
local real dy = 0.0
local real distance = 0.0
local unit f = null
if(ad.s == STATE_INTRO) then
if(ad.b == null) then
set memoryUnit1 = Boat[GetPlayerId(ad.p)]
if(memoryUnit1 != null) then
set AI_Action_Unit = memoryUnit1
set AI_Action = ACTION_FIND_OBJECT
else
set AI_Action = ACTION_WAIT
endif
elseif(ad.v[ct_index] <= 3) then
set AI_Action_Location = Location(GetRectCenterX(AI_Boat_Location[GetPlayerId(ad.p)]), GetRectCenterY(AI_Boat_Location[GetPlayerId(ad.p)]))
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_BOAT_MOVE
elseif(ad.v[ct_index] <= 4) then
set AI_Action_Location = Location(GetRectCenterX(AI_Boat_Location[GetPlayerId(ad.p)]), GetRectCenterY(AI_Boat_Location[GetPlayerId(ad.p)]))
set AI_Action = ACTION_ASSIGN_PREFERRED_LOCATION
elseif(ad.v[ct_index] <= 5) then
set AI_Order = "holdposition"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_BOAT_STOP
else
set AI_Action = ACTION_INIT
endif
elseif(ad.s == STATE_PICK_HERO) then
if(ad.b == null) then
set memoryUnit1 = Boat[GetPlayerId(ad.p)]
if(memoryUnit1 != null) then
set AI_Action_Unit = memoryUnit1
set AI_Action_Location = Location(GetRectCenterX(AI_Boat_Location[GetPlayerId(ad.p)]), GetRectCenterY(AI_Boat_Location[GetPlayerId(ad.p)]))
set AI_Order = "holdposition"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_FIND_OBJECT
else
set AI_Action = ACTION_WAIT
endif
else
set AI_Action = ACTION_INIT
endif
elseif(ad.s == STATE_HERO_AWARE_UNIT) then
set AI_Action_Perceive = PERCEIVE_DEFAULT_VALUE
set AI_Order = "renew"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_BOAT_RECALL
elseif(ad.s == STATE_HERO_AWARE_LOCATION) then
set AI_Action_Perceive = PERCEIVE_DEFAULT_VALUE
set AI_Order = "renew"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_BOAT_RECALL
elseif(ad.s == STATE_HERO_RUN) then
set AI_Action_Perceive = PERCEIVE_DEFAULT_VALUE
set AI_Order = "renew"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_BOAT_RECALL
elseif(ad.s == STATE_HERO_NEED_LOAD) then
if(ct_index == 1) then
set AI_Action_Unit = ad.u
set AI_Order = "load"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_LOAD_HERO
elseif(ct_index > 10) then
set AI_Action_Perceive = PERCEIVE_DEFAULT_VALUE
set AI_Order = "renew"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_BOAT_RECALL
endif
elseif(ad.s == STATE_HERO_LOAD) then
set AI_Action_Unit = ad.u
set AI_Order = "load"
set AI_Order_Type = ACTION_ORDER_TYPE_TARGET
set AI_Action = ACTION_LOAD_HERO
elseif(ad.s == STATE_HERO_UNLOAD) then
if(ad.v[ct_index] <= 0) then
set x = GetUnitX(ad.b)
set y = GetUnitY(ad.b)
set memoryInteger1 = 0
call GroupEnumUnitsInRange(all, x, y, PERCEIVE_REPOSITIONING_DETECT_ENEMY_HERO_RADIUS, bexpr)
loop
set f = FirstOfGroup(all)
exitwhen(f == null)
call GroupRemoveUnit(all, f)
if(IsUnitEnemy(f, ad.p) and /*
*/(IsUnitType(f, UNIT_TYPE_HERO))) then
if((GetPlayerId(GetOwningPlayer(f)) < 8)) then
set memoryInteger1 = memoryInteger1 + 1
endif
endif
endloop
if(memoryInteger1 >= KNOWLEDGE_REPOSITIONING_AMOUNT_HEROES) then
set AI_Action_Location = Location(GetRectCenterX(AI_Boat_Location[GetPlayerId(ad.p)]), GetRectCenterY(AI_Boat_Location[GetPlayerId(ad.p)]))
//if(RectContainsUnit(gg_rct_AI_Boat_Recover_Top, ad.b) or /*
//*/RectContainsUnit(gg_rct_AI_Boat_Recover_Bottom, ad.b)) then
//set AI_Action_Location = Location(GetRectCenterX(AI_Boat_Location[GetPlayerId(ad.p)]), GetRectCenterY(AI_Boat_Location[GetPlayerId(ad.p)]))
//else
//if(GetRandomInt(0, 1) == 0) then
//set AI_Action_Location = Location(GetRectCenterX(gg_rct_AI_Boat_Recover_Top), GetRectCenterY(gg_rct_AI_Boat_Recover_Top))
//else
//set AI_Action_Location = Location(GetRectCenterX(gg_rct_AI_Boat_Recover_Bottom), GetRectCenterY(gg_rct_AI_Boat_Recover_Bottom))
//endif
//endif
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_REMEMBER
else
set AI_Action_Location = ad.l
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_PERCEIVE
endif
elseif(ad.v[ct_index] <= 3) then
set AI_Action_Location = ad.l
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_BOAT_MOVE
elseif(ad.v[ct_index] <= 4) then
set x = GetUnitX(ad.b)
set y = GetUnitY(ad.b)
set dx = x - GetLocationX(ad.l)
set dy = y - GetLocationY(ad.l)
set distance = SquareRoot(dx * dx + dy * dy)
if(distance < KNOWLEDGE_LOCATION_NEAR) then
set AI_Action_Location = ad.l
set AI_Order = "unload"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_UNLOAD_HERO
else
set AI_Action_Location = ad.l
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action_Perceive = ad.v[ct_index] - 1
set AI_Action = ACTION_REPERCEIVE
endif
elseif(ad.v[ct_index] <= 5) then
set AI_Order = "holdposition"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_BOAT_STOP
endif
elseif(ad.s == STATE_HERO_PULL) then
set AI_Action_Perceive = PERCEIVE_DEFAULT_VALUE
set AI_Order = "renew"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_BOAT_RECALL
else
if(ad.b != null) then
set x = GetLocationX(ad.l)
set y = GetLocationY(ad.l)
set dx = GetUnitX(ad.b) - x
set dy = GetUnitY(ad.b) - y
set distance = SquareRoot(dx * dx + dy * dy)
if(distance > KNOWLEDGE_BOAT_LOCATION_NEAR) then
set AI_Action_Location = ad.l
set AI_Order = "move"
set AI_Order_Type = ACTION_ORDER_TYPE_POINT
set AI_Action = ACTION_BOAT_MOVE
else
set AI_Order = "holdposition"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_BOAT_STOP
endif
else
endif
endif
set memoryUnit1 = null
set f = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//setting globals
set all = CreateGroup()
set bexpr = Condition(function Pick)
set loc = Location(0.0, 0.0)
set rct = null
set bexprItem = Condition(function Pick_Item)
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope AIPerceiveRune initializer Init
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
//Unit affected
private function Targets takes unit target returns boolean
return (not IsUnitDead(target)) and /*
*/(IsUnitType(target, UNIT_TYPE_DEAD) == false) and /*
*/(GetUnitAbilityLevel(target, 'Avul') <= 0)
endfunction
//Item affected
private function Targets_Item takes item target returns boolean
return GetItemType(target) != ITEM_TYPE_PERMANENT and /*
*/IsItemVisible(target) and /*
*/target != null and /*
*/GetWidgetLife(target) > 0
endfunction
//----------------------------------------------------------------
//-------------------------SETUP START----------------------------
//----------------------------------------------------------------
globals
private group all
private boolexpr bexpr
private rect rct
private location loc
private boolexpr bexprItem
private item targetItem
endglobals
//----------------------------------------------------------------
private function Pick takes nothing returns boolean
local unit filtered = GetFilterUnit()
local boolean isTargets = Targets(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Pick_Item takes nothing returns boolean
local item filtered = GetFilterItem()
local boolean isTargets = Targets_Item(filtered)
set filtered = null
return isTargets
endfunction
//----------------------------------------------------------------
private function Action_Item takes nothing returns nothing
if(targetItem == null) then
set targetItem = GetEnumItem()
endif
endfunction
//----------------------------------------------------------------
function Perceive_Rune takes AI_Base_Data ad, integer ct_index returns nothing
local integer memoryInteger1 = 0
local boolean memoryBoolean1 = false
local boolean continue = false
if(ad.s == STATE_INTRO) then
if(ad.n == null) then
set AI_Action_Unit = Rune[GetPlayerId(ad.p)]
set AI_Action = ACTION_FIND_OBJECT
else
set AI_Action = ACTION_PICK_HERO
endif
elseif(ad.s == STATE_PICK_HERO) then
set AI_Order = "stomp"
set AI_Order_Type = ACTION_ORDER_TYPE_IMMEDIATE
set AI_Action = ACTION_PICK_HERO
//elseif(ad.s == STATE_HERO_NEED_FARM) then
//set continue = false
//if(IsLocationVisibleToPlayer(GetRectCenter(AI_Glyph_Fortification_Location[ad.v[ct_index]]), ad.p)) then
//if(ad.v[ct_index] == 0) then
//if(Rune_Top_Right != null) then
//set continue = true
//set memoryBoolean1 = true
//endif
//elseif(ad.v[ct_index] == 1) then
//if(Rune_Top_Right != null) then
//set continue = true
//set memoryBoolean1 = true
//endif
//endif
//endif
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
//setting globals
set all = CreateGroup()
set bexpr = Condition(function Pick)
set loc = Location(0.0, 0.0)
set rct = null
set bexprItem = Condition(function Pick_Item)
set Perceive_Score[0] = 0
set Perceive_Score[1] = 1
set Perceive_Score[2] = 2
set Perceive_Score[3] = 3
set Perceive_Score[4] = 4
set Perceive_Score[5] = 5
set Perceive_Score[6] = 6
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
globals
constant integer STATE_INTRO = 0
constant integer STATE_PICK_HERO = 1
constant integer STATE_HERO_INIT = 2
constant integer STATE_HERO_NEED_READY = 3
constant integer STATE_HERO_AWARE_UNIT = 4
constant integer STATE_HERO_AWARE_LOCATION = 5
constant integer STATE_HERO_READY = 6
constant integer STATE_HERO_NEED_FARM = 7
constant integer STATE_HERO_FARM = 8
constant integer STATE_HERO_DEAD = 9
constant integer STATE_HERO_RUN = 10
constant integer STATE_HERO_NEED_LOAD = 11
constant integer STATE_HERO_LOAD = 12
constant integer STATE_HERO_UNLOAD = 13
constant integer STATE_HERO_CARE = 14
constant integer STATE_HERO_KILL = 15
constant integer STATE_HERO_CHASE = 16
constant integer STATE_HERO_PULL = 17
constant integer STATE_HERO_CAST = 18
constant integer STATE_GET_VICTOR = 19
constant integer STATE_HERO_NEED_KILL = 20
constant real RESPOND_INTRO = 1.0
constant real RESPOND_PICK_HERO = 1.0
constant real RESPOND_HERO_INIT = 2.0
constant real RESPOND_HERO_NEED_READY = 0.5
constant real RESPOND_HERO_AWARE_UNIT = 0.1
constant real RESPOND_HERO_AWARE_LOCATION = 0.1
constant real RESPOND_HERO_READY = 0.1
constant real RESPOND_HERO_NEED_FARM = 0.1
constant real RESPOND_HERO_FARM = 0.1
constant real RESPOND_HERO_DEAD = 1.0
constant real RESPOND_HERO_RUN = 0.5
constant real RESPOND_HERO_NEED_LOAD = 0.1
constant real RESPOND_HERO_LOAD = 1.0
constant real RESPOND_HERO_UNLOAD = 1.0
constant real RESPOND_HERO_CARE = 0.1
constant real RESPOND_HERO_KILL = 0.1
constant real RESPOND_HERO_CHASE = 0.1
constant real RESPOND_HERO_PULL = 0.5
constant real RESPOND_HERO_CAST = 0.5
constant real RESPOND_GET_VICTOR = 0.1
constant real RESPOND_HERO_NEED_KILL = 0.1
constant real DURATION_INTRO = 60.0
constant real DURATION_PICK_HERO = 60.0
constant real DURATION_HERO_INIT = 60.0
constant real DURATION_HERO_NEED_READY = 30.0
constant real DURATION_HERO_AWARE_UNIT = 60.0
constant real DURATION_HERO_AWARE_LOCATION = 60.0
constant real DURATION_HERO_READY = 60.0
constant real DURATION_HERO_NEED_FARM = 30.0
constant real DURATION_HERO_FARM = 30.0
constant real DURATION_HERO_DEAD = 60.0
constant real DURATION_HERO_RUN = 60.0
constant real DURATION_HERO_NEED_LOAD = 60.0
constant real DURATION_HERO_LOAD = 10.0
constant real DURATION_HERO_UNLOAD = 50.0
constant real DURATION_HERO_CARE = 60.0
constant real DURATION_HERO_KILL = 60.0
constant real DURATION_HERO_CHASE = 60.0
constant real DURATION_HERO_PULL = 30.0
constant real DURATION_HERO_CAST = 30.0
constant real DURATION_GET_VICTOR = 60.0
constant real DURATION_HERO_NEED_KILL = 30.0
constant integer OBJECTIVE_NEUTRAL = 0
constant integer OBJECTIVE_KILL_UNITS = 1
constant integer OBJECTIVE_RUN = 2
constant integer OBJECTIVE_KILL_HEROES = 3
constant integer OBJECTIVE_GET_VICTOR = 4
constant integer OBJECTIVE_SEARCH = 5
constant integer OBJECTIVE_CHOOSE = 6
constant integer OBJECTIVE_TEST = 7
constant integer OBJECTIVE_KILL_ATOK = 8
endglobals
//TESH.scrollpos=36
//TESH.alwaysfold=0
globals
integer AI_Action_ID = 0
integer AI_Action_Perceive = 0
unit AI_Action_Unit = null
item AI_Action_Item = null
destructable AI_Action_Destructable = null
location AI_Action_Location = null
string AI_Order = ""
integer AI_Action = 0
integer AI_Order_Type = 0
string AI_Text = ""
integer AI_Action_Text = 0
integer AI_Text_Type = 0
constant integer ACTION_NONE = 0
constant integer ACTION_PICK_HERO = 1
constant integer ACTION_WAIT = 2
constant integer ACTION_INIT = 3
constant integer ACTION_TO_LOCATION = 4
constant integer ACTION_STOP = 5
constant integer ACTION_GO_FARM = 6
constant integer ACTION_COMBAT = 7
constant integer ACTION_DEAD = 8
constant integer ACTION_PERCEIVE = 9
constant integer ACTION_GET_READY = 10
constant integer ACTION_RUN = 11
constant integer ACTION_TO_BOAT = 12
constant integer ACTION_LOAD_HERO = 13
constant integer ACTION_UNLOAD_HERO = 14
constant integer ACTION_BOAT_RECALL = 15
constant integer ACTION_CARE = 16
constant integer ACTION_KILL = 17
constant integer ACTION_CHASE = 18
constant integer ACTION_PULL = 19
constant integer ACTION_LEARN = 20
constant integer ACTION_CHANGE_TARGET = 21
constant integer ACTION_CAST = 22
constant integer ACTION_BUY_ITEM = 23
constant integer ACTION_GET_VICTOR = 24
constant integer ACTION_FIND_OBJECT = 25
constant integer ACTION_ASSIGN_PREFERRED_LOCATION = 26
constant integer ACTION_BOAT_STOP = 27
constant integer ACTION_CHANGE_OBJECTIVE = 28
constant integer ACTION_REPERCEIVE = 29
constant integer ACTION_REMEMBER = 30
constant integer ACTION_DROP_ITEM = 31
constant integer ACTION_SELL_ITEM = 32
constant integer ACTION_TAKE_ITEM = 33
constant integer ACTION_GO_KILL = 34
constant integer ACTION_BOAT_MOVE = 35
constant integer ACTION_KILL_ATOK = 36
constant integer ACTION_TEXT_NONE = 0
constant integer ACTION_TEXT_ALL = 1
constant integer ACTION_ORDER_TYPE_UNKNOWN = -1
constant integer ACTION_ORDER_TYPE_IMMEDIATE = 0
constant integer ACTION_ORDER_TYPE_POINT = 1
constant integer ACTION_ORDER_TYPE_TARGET = 2
endglobals
scope AIAction initializer Init
//----------------------------------------------------------------
function Clear_Action takes nothing returns nothing
set AI_Action_ID = 0
set AI_Action_Perceive = 0
set AI_Action_Unit = null
set AI_Action_Item = null
set AI_Action_Destructable = null
set AI_Action_Location = null
set AI_Order = ""
set AI_Order_Type = 0
set AI_Action = ACTION_NONE
set AI_Text = ""
set AI_Action_Text = ACTION_TEXT_NONE
set AI_Text_Type = TEXT_TYPE_UNKNOWN
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
endfunction
endscope
//TESH.scrollpos=120
//TESH.alwaysfold=0
struct AI_Base_Data
player p //Player ai
integer array pt[10] //Player text type
unit n //Controlling rune
boolean array er[4] //Rune restoration
boolean array gf[2] //Glyph fortification
unit u //Controlling unit
integer uid //Unit type id
integer un //Unit index
integer ut //Unit attitude type
real ux //X of unit
real uy //Y of unit
real ul //Unit life
integer array us[5] //Ability of unit
real array uscd[5] //Ability cooldown of unit
integer array usrl[5] //Ability required level of unit
boolean usr //Ability require refresh at boat
integer ui //Unit item index
unit b //Controlling boat
location l //Location preference
integer s //State
real r //Respond time
integer array v[3] //Perceive level
real d //Duration max
integer o //Objective
integer i //Points
integer im //Integer memory of learning spell
//Actions main
integer cid //Action id
unit cu //Action unit
item ci //Action item
destructable cd //Action destructable
location cl //Action location
string co //Action order
integer ct //Action order type
integer cm //Action mode
real cx //Action x
real cy //Action y
integer cv //Action perceive
string ctx //Action text
//Actions other
integer coid //Action id
unit cou //Action unit
item coi //Action item
destructable cod //Action destructable
location col //Action location
string coo //Action order
integer cot //Action order type
integer com //Action mode
real cox //Action x
real coy //Action y
integer cov //Action perceive
string cotx //Action text
method onDestroy takes nothing returns nothing
set p = null
set n = null
set b = null
if(l != null) then
call RemoveLocation(l)
set l = null
endif
set cu = null
set ci = null
set cd = null
if(cl != null) then
call RemoveLocation(cl)
set cl = null
endif
set co = null
set ctx = null
set cou = null
set coi = null
set cod = null
if(col != null) then
call RemoveLocation(col)
set col = null
endif
set coo = null
set cotx = null
endmethod
endstruct
globals
constant integer AI_TOTAL = 7
constant real AI_INTERVAL = 0.05
constant integer TOTAL_AI_MAX_NAME = 5
trigger AIBirthTrg = CreateTrigger()
trigger AIResetTrg = CreateTrigger()
AI_Base_Data array AI_Data[AI_TOTAL]
integer TotalAIData = 0
timer TimerAIData = CreateTimer()
integer array AI_Player_Attitude[8][4]
integer TOTAL_SCORE_ATTITUDE = 100
//0 - life
//1 - attack range
//2 - safe
//3 - offense
//4 - spammer
integer TOTAL_PERCEIVE_LEVEL = 3
group AI_Heroes = CreateGroup()
string array AI_Player_Name[TOTAL_AI_HERO][TOTAL_AI_MAX_NAME]
integer array AI_Player_Name_Used[TOTAL_AI_HERO]
endglobals
scope AIBase initializer Init
//----------------------------------------------------------------
function AI_Rename takes player p, unit u returns nothing
local integer pId = GetPlayerId(p)
local integer uId = GetHeroIndex(u)
local string newName = ""
local integer row = -1
local multiboarditem mbItem = null
if(AI_Player_Name_Used[uId] < TOTAL_AI_MAX_NAME) then
set newName = AI_Player_Name[uId][AI_Player_Name_Used[uId]] + " " + I2S(pId+1)
set AI_Player_Name_Used[uId] = AI_Player_Name_Used[uId] + 1
else
set AI_Player_Name_Used[uId] = 0
set newName = AI_Player_Name[uId][AI_Player_Name_Used[uId]] + " " + I2S(pId+1)
endif
call SetPlayerName(p, newName)
set Player_Name[pId] = Player_Colors[pId] + newName + " (" + GetUnitName(u) + ")|r"
set row = LoadInteger(Info_Ht, pId, MULTIBOARD_ROW_KEY)
if(row != 0) then
set mbItem = MultiboardGetItem(MultiB, row, MULTIBOARD_PLAYER_NAME)
call MultiboardSetItemValue(mbItem, Player_Name[pId])
endif
set mbItem = null
set newName = null
endfunction
//----------------------------------------------------------------
function Remember_Text takes AI_Base_Data ad, integer textType returns nothing
set ad.pt[0] = textType
endfunction
//----------------------------------------------------------------
private function AI_Reset_Actions takes nothing returns nothing
local integer i = 0
local integer j = 0
local AI_Base_Data ad
loop
exitwhen(i >= TotalAIData)
set ad = AI_Data[i]
set ad.s = STATE_HERO_READY
set ad.r = RESPOND_HERO_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_READY
set ad.o = OBJECTIVE_NEUTRAL
set i = i + 1
endloop
endfunction
//----------------------------------------------------------------
private function Attacking_Actions takes nothing returns nothing
local unit attacker = GetAttacker()
local integer i = 0
local AI_Base_Data ad
loop
exitwhen(i >= TotalAIData)
set ad = AI_Data[i]
if(ad.u == attacker) then
endif
set i = i + 1
endloop
set attacker = null
endfunction
//----------------------------------------------------------------
private function Attacking_Conditions takes nothing returns boolean
return IsUnitInGroup(GetAttacker(), AI_Heroes)
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
local integer i = 0
local integer j = 0
local trigger AttackingTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(AttackingTrg, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(AttackingTrg, Condition(function Attacking_Conditions))
call TriggerAddAction(AttackingTrg, function Attacking_Actions)
set i = 0
loop
exitwhen(i >= 8)
set AI_Player_Attitude[i][0] = 50
set AI_Player_Attitude[i][1] = 50
set AI_Player_Attitude[i][2] = 80
set AI_Player_Attitude[i][3] = 100
set AI_Player_Attitude[i][4] = 50
set i = i + 1
endloop
set i = 0
loop
exitwhen(i >= TOTAL_AI_HERO)
set j = 0
loop
exitwhen(j >= TOTAL_AI_MAX_NAME)
set AI_Player_Name[i][j] = "AI" + I2S(i)
set j = j + 1
endloop
set AI_Player_Name_Used[i] = 0
set i = i + 1
endloop
set AI_Player_Name[20][0] = "Aether"
set AI_Player_Name[15][0] = "Laiev"
set AI_Player_Name[24][0] = "Dpslp16"
set AI_Player_Name[25][0] = "Espers"
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope AIBaseIntro initializer Init
//----------------------------------------------------------------
function Base_Intro takes AI_Base_Data ad returns nothing
local integer j = 0
if(ad.r >= 0.0) then
set ad.r = ad.r - AI_INTERVAL
set ad.d = ad.d - AI_INTERVAL
else
call Perceive(ad)
if(AI_Action == ACTION_PICK_HERO) then
set ad.cm = AI_Action
call Perceive_Rune(ad, 1)
if(AI_Action == ACTION_FIND_OBJECT) then
set ad.cou = AI_Action_Unit
set ad.com = AI_Action
set ad.n = ad.cou
set ad.r = RESPOND_INTRO
elseif(AI_Action == ACTION_PICK_HERO) then
set ad.com = AI_Action
set ad.s = STATE_PICK_HERO
set ad.r = RESPOND_PICK_HERO
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = 1
set j = j + 1
endloop
set ad.d = DURATION_PICK_HERO
set ad.o = OBJECTIVE_NEUTRAL
elseif(AI_Action == ACTION_WAIT) then
set ad.com = AI_Action
set ad.r = RESPOND_INTRO
elseif(AI_Action == ACTION_NONE) then
set ad.com = AI_Action
set ad.r = RESPOND_INTRO
endif
elseif(AI_Action == ACTION_WAIT) then
set ad.cm = AI_Action
call Perceive_Boat(ad, 1)
if(AI_Action == ACTION_FIND_OBJECT) then
set ad.cou = AI_Action_Unit
set ad.com = AI_Action
set ad.b = ad.cou
set ad.r = RESPOND_INTRO
elseif(AI_Action == ACTION_BOAT_MOVE) then
set ad.col = AI_Action_Location
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
set ad.v[1] = ad.v[1] + 1
set ad.r = RESPOND_INTRO
if(ad.cot == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.b, ad.co, GetLocationX(ad.col), GetLocationY(ad.col))
endif
elseif(AI_Action == ACTION_ASSIGN_PREFERRED_LOCATION) then
set ad.col = AI_Action_Location
set ad.com = AI_Action
set ad.l = ad.col
set ad.v[1] = ad.v[1] + 1
set ad.r = RESPOND_INTRO
elseif(AI_Action == ACTION_BOAT_STOP) then
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
set ad.v[1] = ad.v[1] + 1
set ad.r = RESPOND_INTRO
if(ad.cot == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.coo)
endif
elseif(AI_Action == ACTION_INIT) then
set ad.com = AI_Action
set ad.s = STATE_HERO_INIT
set ad.r = RESPOND_HERO_INIT
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_INIT
set ad.o = OBJECTIVE_NEUTRAL
elseif(AI_Action == ACTION_NONE) then
set ad.com = AI_Action
set ad.r = RESPOND_INTRO
endif
endif
call Clear_Action()
endif
if(ad.d <= 0.0) then
set ad.s = STATE_INTRO
set ad.r = RESPOND_INTRO
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_INTRO
set ad.o = OBJECTIVE_NEUTRAL
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope AIBasePickHero initializer Init
//----------------------------------------------------------------
function Base_Pick_Hero takes AI_Base_Data ad returns nothing
local integer j = 0
if(ad.r >= 0.0) then
set ad.r = ad.r - AI_INTERVAL
set ad.d = ad.d - AI_INTERVAL
else
call Perceive_Hero(ad, 0)
if(AI_Action == ACTION_PICK_HERO) then
set ad.cm = AI_Action
call Perceive_Rune(ad, 1)
if(AI_Action == ACTION_PICK_HERO) then
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
if(ad.cot == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.n, ad.coo)
endif
elseif(AI_Action == ACTION_NONE) then
set ad.cm = AI_Action
set ad.r = RESPOND_PICK_HERO
endif
call Clear_Action()
call Perceive_Boat(ad, 1)
if(AI_Action == ACTION_FIND_OBJECT) then
set ad.cou = AI_Action_Unit
set ad.col = AI_Action_Location
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
set ad.v[1] = ad.v[1] + 1
set ad.b = AI_Action_Unit
set ad.l = AI_Action_Location
set ad.s = STATE_HERO_INIT
set ad.r = RESPOND_HERO_INIT
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_INIT
set ad.o = OBJECTIVE_NEUTRAL
if(ad.cot == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.coo)
endif
elseif(AI_Action == ACTION_WAIT) then
set ad.com = AI_Action
set ad.r = RESPOND_PICK_HERO
elseif(AI_Action == ACTION_NONE) then
set ad.com = AI_Action
set ad.r = RESPOND_PICK_HERO
endif
elseif(AI_Action == ACTION_GET_READY) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_NEED_READY
set ad.r = RESPOND_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = STATE_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
elseif(AI_Action == ACTION_PERCEIVE) then
set ad.cm = AI_Action
set ad.v[0] = ad.v[0] + 1
set ad.r = RESPOND_PICK_HERO
elseif(AI_Action == ACTION_NONE) then
set ad.cm = AI_Action
set ad.r = RESPOND_PICK_HERO
endif
call Clear_Action()
endif
if(ad.d <= 0.0) then
set ad.s = STATE_PICK_HERO
set ad.r = RESPOND_PICK_HERO
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_PICK_HERO
set ad.o = OBJECTIVE_NEUTRAL
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
endfunction
endscope
//TESH.scrollpos=109
//TESH.alwaysfold=0
scope AIBaseHeroInit initializer Init
//----------------------------------------------------------------
function Base_Hero_Init takes AI_Base_Data ad returns nothing
local integer j = 0
if(ad.r >= 0.0) then
set ad.r = ad.r - AI_INTERVAL
set ad.d = ad.d - AI_INTERVAL
else
call Perceive_Hero(ad, 0)
if(AI_Action == ACTION_PICK_HERO) then
set ad.cm = AI_Action
set ad.u = GetHero(ad.p)
set ad.uid = GetUnitTypeId(ad.u)
set ad.un = GetHeroIndex(ad.u)
set ad.ux = GetUnitX(ad.u)
set ad.uy = GetUnitY(ad.u)
set ad.ul = GetUnitState(ad.u, UNIT_STATE_LIFE)
set j = 0
loop
exitwhen(j >= TOTAL_HERO_SKILL)
set ad.us[j] = 0
set ad.uscd[j] = 0.0
set ad.usrl[j] = AI_Ability_Level_Required[ad.un][j]
set j = j + 1
endloop
call GroupAddUnit(AI_Heroes, ad.u)
call AI_Rename(ad.p, ad.u)
set ad.s = STATE_PICK_HERO
set ad.r = RESPOND_PICK_HERO
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_PICK_HERO
set ad.o = OBJECTIVE_NEUTRAL
elseif(AI_Action == ACTION_INIT) then
set ad.cm = AI_Action
set ad.u = GetHero(ad.p)
set ad.uid = GetUnitTypeId(ad.u)
set ad.un = GetHeroIndex(ad.u)
set ad.ux = GetUnitX(ad.u)
set ad.uy = GetUnitY(ad.u)
set ad.ul = GetUnitState(ad.u, UNIT_STATE_LIFE)
set j = 0
loop
exitwhen(j >= TOTAL_HERO_SKILL)
set ad.us[j] = 0
set ad.uscd[j] = 0.0
set ad.usrl[j] = AI_Ability_Level_Required[ad.un][j]
set j = j + 1
endloop
call GroupAddUnit(AI_Heroes, ad.u)
call AI_Rename(ad.p, ad.u)
set ad.s = STATE_HERO_NEED_READY
set ad.r = RESPOND_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
elseif(AI_Action == ACTION_WAIT) then
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_INIT
elseif(AI_Action == ACTION_GET_READY) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_NEED_READY
set ad.r = RESPOND_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
elseif(AI_Action == ACTION_NONE) then
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_INIT
endif
call Clear_Action()
call Perceive_Boat(ad, 0)
if(AI_Action == ACTION_BOAT_MOVE) then
set ad.col = AI_Action_Location
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
if(ad.cot == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.b, ad.coo, GetLocationX(ad.col), GetLocationY(ad.col))
endif
elseif(AI_Action == ACTION_BOAT_STOP) then
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
if(ad.cot == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.coo)
endif
endif
call Clear_Action()
endif
if(ad.d <= 0.0) then
set ad.s = STATE_HERO_INIT
set ad.r = RESPOND_HERO_INIT
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_INIT
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
endfunction
endscope
//TESH.scrollpos=12
//TESH.alwaysfold=0
scope AIBaseHeroNeedReady initializer Init
//----------------------------------------------------------------
function Base_Hero_Need_Ready takes AI_Base_Data ad returns nothing
local integer j = 0
if(ad.r >= 0.0) then
set ad.r = ad.r - AI_INTERVAL
set ad.d = ad.d - AI_INTERVAL
else
call Perceive_Hero(ad, 0)
if(AI_Action == ACTION_TO_LOCATION) then
set ad.cl = AI_Action_Location
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_AWARE_LOCATION
set ad.r = RESPOND_HERO_AWARE_LOCATION
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_AWARE_LOCATION
set ad.o = OBJECTIVE_NEUTRAL
if(ad.ct == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.u, ad.co, GetLocationX(ad.cl), GetLocationY(ad.cl))
endif
elseif(AI_Action == ACTION_DEAD) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_DEAD
set ad.r = RESPOND_HERO_DEAD
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_DEAD
set ad.o = OBJECTIVE_NEUTRAL
elseif(AI_Action == ACTION_RUN) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_RUN
set ad.r = RESPOND_HERO_RUN
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_RUN
set ad.o = OBJECTIVE_NEUTRAL
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_GET_READY) then
set ad.cm = AI_Action
call Perceive_Hero_Skill(ad, ad.v[1], ad.us[ad.v[1]], ad.uscd[ad.v[1]], ad.usrl[ad.v[1]], 1)
if(AI_Action == ACTION_GET_READY) then
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_READY
set ad.r = RESPOND_HERO_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_READY
set ad.o = OBJECTIVE_NEUTRAL
if(ad.ct == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.u, ad.co)
endif
elseif(AI_Action == ACTION_PERCEIVE) then
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_RUN
set ad.v[1] = ad.v[1] + 1
elseif(AI_Action == ACTION_WAIT) then
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_RUN
elseif(AI_Action == ACTION_CAST) then
set ad.cid = AI_Action_ID
set ad.co = AI_Order
set ad.cm = AI_Action
set ad.s = STATE_HERO_CAST
set ad.r = RESPOND_HERO_CAST
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_CAST
set ad.o = OBJECTIVE_RUN
endif
elseif(AI_Action == ACTION_UNLOAD_HERO) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_UNLOAD
set ad.r = RESPOND_HERO_UNLOAD
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_UNLOAD
set ad.o = OBJECTIVE_NEUTRAL
elseif(AI_Action == ACTION_NONE) then
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_NEED_READY
endif
call Clear_Action()
call Perceive_Boat(ad, 0)
if(AI_Action == ACTION_BOAT_MOVE) then
set ad.col = AI_Action_Location
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
if(ad.cot == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.b, ad.coo, GetLocationX(ad.col), GetLocationY(ad.col))
endif
elseif(AI_Action == ACTION_BOAT_STOP) then
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
if(ad.cot == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.coo)
endif
endif
call Clear_Action()
endif
if(ad.d <= 0.0) then
set ad.s = STATE_HERO_INIT
set ad.r = RESPOND_HERO_INIT
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_INIT
set ad.o = OBJECTIVE_NEUTRAL
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope AIBaseHeroAwareUnit initializer Init
//----------------------------------------------------------------
function Base_Hero_Aware_Unit takes AI_Base_Data ad returns nothing
local integer j = 0
if(ad.r >= 0.0) then
set ad.r = ad.r - AI_INTERVAL
set ad.d = ad.d - AI_INTERVAL
else
call Perceive_Hero_Target(ad, ad.cu, 0)
if(AI_Action == ACTION_STOP) then
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_READY
set ad.r = RESPOND_HERO_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_READY
if(ad.ct == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.u, ad.co)
endif
elseif(AI_Action == ACTION_DEAD) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_DEAD
set ad.r = RESPOND_HERO_DEAD
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_DEAD
elseif(AI_Action == ACTION_NONE) then
set ad.cu = AI_Action_Unit
set ad.ct = AI_Order_Type
set ad.co = AI_Order
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_AWARE_UNIT
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_PERCEIVE) then
set ad.cu = AI_Action_Unit
set ad.ct = AI_Order_Type
set ad.co = AI_Order
set ad.cm = AI_Action
set ad.v[1] = ad.v[1] + 1
set ad.r = RESPOND_HERO_AWARE_UNIT
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_BOAT_RECALL) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cv = AI_Action_Perceive
set ad.cm = AI_Action
set ad.v[0] = ad.cv
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
call Clear_Action()
call Perceive_Boat(ad, 1)
if(AI_Action == ACTION_BOAT_RECALL) then
set ad.cov = AI_Action_Perceive
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
set ad.v[1] = ad.cov
if(ad.cot == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.coo)
endif
endif
elseif(AI_Action == ACTION_RUN) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_RUN
set ad.r = RESPOND_HERO_RUN
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_RUN
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
endif
call Clear_Action()
endif
if(ad.d <= 0.0) then
set ad.s = STATE_HERO_NEED_READY
set ad.r = RESPOND_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope AIBaseHeroAwareLocation initializer Init
//----------------------------------------------------------------
function Base_Hero_Aware_Location takes AI_Base_Data ad returns nothing
local integer j = 0
if(ad.r >= 0.0) then
set ad.r = ad.r - AI_INTERVAL
set ad.d = ad.d - AI_INTERVAL
else
call Perceive_Hero_Location(ad, GetLocationX(ad.cl), GetLocationY(ad.cl), 0)
if(AI_Action == ACTION_STOP) then
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_READY
set ad.r = RESPOND_HERO_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_READY
if(ad.ct == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.co)
endif
elseif(AI_Action == ACTION_GET_VICTOR) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_GET_VICTOR
set ad.r = RESPOND_GET_VICTOR
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_GET_VICTOR
set ad.o = OBJECTIVE_GET_VICTOR
if(ad.ct == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.co)
endif
elseif(AI_Action == ACTION_RUN) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_RUN
set ad.r = RESPOND_HERO_RUN
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_RUN
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueImmediateOrder(ad.u, ad.co)
endif
elseif(AI_Action == ACTION_PERCEIVE) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.v[0] = ad.v[0] + 1
set ad.r = RESPOND_HERO_AWARE_LOCATION
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
elseif(ad.ct == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.u, ad.co, GetLocationX(ad.cl), GetLocationY(ad.cl))
endif
elseif(AI_Action == ACTION_BOAT_RECALL) then
set ad.cl = AI_Action_Location
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
elseif(ad.ct == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.u, ad.co, GetLocationX(ad.cl), GetLocationY(ad.cl))
endif
call Clear_Action()
call Perceive_Boat(ad, 1)
if(AI_Action == ACTION_BOAT_RECALL) then
set ad.cov = AI_Action_Perceive
set ad.coo = AI_Order
set ad.cot = ACTION_ORDER_TYPE_IMMEDIATE
set ad.com = AI_Action
set ad.v[1] = ad.cov
if(ad.cot == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.coo)
endif
endif
elseif(AI_Action == ACTION_NONE) then
set ad.cl = AI_Action_Location
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_AWARE_LOCATION
if(ad.ct == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.u, ad.co, GetLocationX(ad.cl), GetLocationY(ad.cl))
endif
elseif(AI_Action == ACTION_DEAD) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_DEAD
set ad.r = RESPOND_HERO_DEAD
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_DEAD
endif
call Clear_Action()
endif
if(ad.d <= 0.0) then
set ad.s = STATE_HERO_NEED_READY
set ad.r = RESPOND_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
endfunction
endscope
//TESH.scrollpos=210
//TESH.alwaysfold=0
scope AIBaseHeroReady initializer Init
//----------------------------------------------------------------
function Base_Hero_Ready takes AI_Base_Data ad returns nothing
local integer j = 0
local item t = null
local boolean cleanMemory = false
if(ad.r >= 0.0) then
set ad.r = ad.r - AI_INTERVAL
set ad.d = ad.d - AI_INTERVAL
else
call Perceive_Hero(ad, 0)
if(AI_Action == ACTION_GO_FARM) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_NEED_FARM
set ad.r = RESPOND_HERO_NEED_FARM
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_FARM
set ad.o = OBJECTIVE_KILL_UNITS
elseif(AI_Action == ACTION_LEARN) then
set ad.cm = AI_Action
call Perceive_Hero_Skill(ad, ad.v[1], ad.us[ad.v[1]], ad.uscd[ad.v[1]], ad.usrl[ad.v[1]], 1)
if(AI_Action == ACTION_LEARN) then
set ad.cid = AI_Action_ID
set ad.cm = AI_Action
set ad.cv = AI_Action_Perceive
set ad.v[1] = ad.cv
set ad.us[ad.v[1]] = ad.us[ad.v[1]] + 1
set ad.usrl[ad.v[1]] = ad.usrl[ad.v[1]] + AI_Ability_Learn_Skip[ad.un][ad.v[1]]
call SelectHeroSkill(ad.u, ad.cid)
if(not ad.usr) then
set ad.usr = IsHeroAbilityRequireRefresh(ad.un, ad.v[1])
endif
set cleanMemory = true
elseif(AI_Action == ACTION_PERCEIVE) then
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_READY
set ad.v[1] = ad.v[1] + 1
elseif(AI_Action == ACTION_CHANGE_OBJECTIVE) then
set ad.cid = AI_Action_ID
set ad.cm = AI_Action
set ad.o = ad.cid
set ad.r = RESPOND_HERO_READY
set ad.im = -1
elseif(AI_Action == ACTION_REPERCEIVE) then
set ad.cid = AI_Action_ID
set ad.cv = AI_Action_Perceive
set ad.cm = AI_Action
set ad.v[1] = ad.cv
set ad.r = RESPOND_HERO_READY
set ad.im = ad.cid
elseif(AI_Action == ACTION_REMEMBER) then
set ad.cid = AI_Action_ID
set ad.cm = AI_Action
set ad.cv = AI_Action_Perceive
set ad.r = RESPOND_HERO_READY
set ad.v[1] = ad.cv
set ad.im = ad.cid
elseif(AI_Action == ACTION_NONE) then
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_READY
endif
elseif(AI_Action == ACTION_NONE) then
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_READY
elseif(AI_Action == ACTION_BUY_ITEM) then
set ad.cm = AI_Action
set ad.cid = AI_Action_ID
call UnitAddItemById(ad.u, ad.cid)
call SetPlayerState(ad.p, PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(ad.p, PLAYER_STATE_RESOURCE_GOLD) - GetItemCostById(ad.cid))
set ad.i = ad.i + GetItemPoints(ad.un, ad.ut, ad.ui)
set ad.cid = 0
set ad.ui = ad.ui + 1
set ad.r = RESPOND_HERO_READY
elseif(AI_Action == ACTION_SELL_ITEM) then
set ad.cid = AI_Action_ID
set ad.cm = AI_Action
set t = UnitItemInSlot(ad.u, ad.cid)
call UnitDropItemTarget(ad.u, t, ad.b)
set ad.r = RESPOND_HERO_READY
elseif(AI_Action == ACTION_DROP_ITEM) then
set ad.cid = AI_Action_ID
set ad.cm = AI_Action
set t = UnitItemInSlot(ad.u, ad.cid)
call UnitDropItemPoint(ad.u, t, GetUnitX(ad.u), GetUnitY(ad.u))
set ad.r = RESPOND_HERO_READY
elseif(AI_Action == ACTION_GO_KILL) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_NEED_KILL
set ad.r = RESPOND_HERO_NEED_KILL
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_KILL
set ad.o = OBJECTIVE_KILL_HEROES
elseif(AI_Action == ACTION_GET_VICTOR) then
set ad.cl = AI_Action_Location
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_AWARE_LOCATION
set ad.r = RESPOND_HERO_AWARE_LOCATION
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_AWARE_LOCATION
set ad.o = OBJECTIVE_GET_VICTOR
if(ad.ct == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.u, ad.co, GetLocationX(ad.cl), GetLocationY(ad.cl))
endif
elseif(AI_Action == ACTION_TO_LOCATION) then
set ad.cl = AI_Action_Location
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_AWARE_LOCATION
set ad.r = RESPOND_HERO_AWARE_LOCATION
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_AWARE_LOCATION
set ad.o = OBJECTIVE_NEUTRAL
if(ad.ct == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.u, ad.co, GetLocationX(ad.cl), GetLocationY(ad.cl))
endif
elseif(AI_Action == ACTION_DEAD) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_DEAD
set ad.r = RESPOND_HERO_DEAD
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_DEAD
set ad.o = OBJECTIVE_NEUTRAL
elseif(AI_Action == ACTION_STOP) then
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_READY
if(ad.ct == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.co)
endif
call Communication(ad)
if(AI_Action_Text == ACTION_TEXT_ALL) then
call Remember_Text(ad, AI_Text_Type)
call Communicate_All(ad.p, AI_Text)
endif
elseif(AI_Action == ACTION_KILL_ATOK) then
set ad.s = STATE_HERO_NEED_KILL
set ad.r = RESPOND_HERO_NEED_KILL
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_KILL
set ad.o = OBJECTIVE_KILL_ATOK
endif
call Clear_Action()
call Communication(ad)
if(AI_Action_Text == ACTION_TEXT_ALL) then
call Remember_Text(ad, AI_Text_Type)
call Communicate_All(ad.p, AI_Text)
endif
endif
if(ad.d <= 0.0) then
set ad.s = STATE_HERO_NEED_READY
set ad.r = RESPOND_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
endif
//clean
if(cleanMemory) then
set ad.im = -1
endif
set t = null
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
endfunction
endscope
//TESH.scrollpos=137
//TESH.alwaysfold=0
scope AIBaseHeroNeedFarm initializer Init
//----------------------------------------------------------------
function Base_Hero_Need_Farm takes AI_Base_Data ad returns nothing
local integer j = 0
if(ad.r >= 0.0) then
set ad.r = ad.r - AI_INTERVAL
set ad.d = ad.d - AI_INTERVAL
else
call Perceive_Hero(ad, 0)
if(AI_Action == ACTION_COMBAT) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_FARM
set ad.r = RESPOND_HERO_FARM
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_FARM
set ad.o = OBJECTIVE_KILL_UNITS
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_RUN) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_RUN
set ad.r = RESPOND_HERO_RUN
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_RUN
set ad.o = OBJECTIVE_KILL_UNITS
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_DEAD) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_DEAD
set ad.r = RESPOND_HERO_DEAD
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_DEAD
set ad.o = OBJECTIVE_NEUTRAL
elseif(AI_Action == ACTION_PERCEIVE) then
set ad.cm = AI_Action
set ad.v[0] = ad.v[0] + 1
set ad.r = RESPOND_HERO_NEED_FARM
elseif(AI_Action == ACTION_GO_FARM) then
set ad.cl = AI_Action_Location
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_NEED_FARM
set ad.v[0] = 0
if(ad.ct == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrderLoc(ad.u, ad.co, ad.cl)
endif
elseif(AI_Action == ACTION_CARE) then
set ad.co = AI_Order
set ad.cm = AI_Action
set ad.s = STATE_HERO_CARE
set ad.r = RESPOND_HERO_CARE
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_CARE
set ad.o = OBJECTIVE_KILL_UNITS
if(ad.ct == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.u, ad.co)
endif
elseif(AI_Action == ACTION_GET_READY) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_NEED_READY
set ad.r = RESPOND_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
elseif(AI_Action == ACTION_TAKE_ITEM) then
set ad.ci = AI_Action_Item
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_NEED_FARM
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.ci)
endif
elseif(AI_Action == ACTION_NONE) then
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_NEED_FARM
set ad.v[0] = 0
endif
call Clear_Action()
call Perceive_Boat(ad, 0)
if(AI_Action == ACTION_BOAT_MOVE) then
set ad.col = AI_Action_Location
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
if(ad.cot == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.b, ad.coo, GetLocationX(ad.col), GetLocationY(ad.col))
endif
elseif(AI_Action == ACTION_BOAT_STOP) then
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
if(ad.cot == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.coo)
endif
endif
call Clear_Action()
endif
if(ad.d <= 0.0) then
set ad.s = STATE_HERO_NEED_READY
set ad.r = RESPOND_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
endfunction
endscope
//TESH.scrollpos=201
//TESH.alwaysfold=0
scope AIBaseHeroFarm initializer Init
//----------------------------------------------------------------
function Base_Hero_Farm takes AI_Base_Data ad returns nothing
local integer j = 0
if(ad.r >= 0.0) then
set ad.r = ad.r - AI_INTERVAL
set ad.d = ad.d - AI_INTERVAL
else
call Perceive_Hero_Target(ad, ad.cu, 0)
if(AI_Action == ACTION_COMBAT) then
set ad.cu = AI_Action_Unit
set ad.cv = AI_Action_Perceive
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.v[1] = GetRandomInt(0, TOTAL_HERO_SKILL - 1)
call Perceive_Hero_Skill(ad, ad.v[1], ad.us[ad.v[1]], ad.uscd[ad.v[1]], ad.usrl[ad.v[1]], 1)
if(AI_Action == ACTION_COMBAT) then
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_FARM
set ad.v[1] = ad.v[1] + 1
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_CAST) then
set ad.cid = AI_Action_ID
set ad.co = AI_Order
set ad.cm = AI_Action
set ad.s = STATE_HERO_CAST
set ad.r = RESPOND_HERO_CAST
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_CAST
set ad.o = OBJECTIVE_KILL_UNITS
elseif(AI_Action == ACTION_PERCEIVE) then
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_FARM
set ad.v[1] = ad.v[1] + 1
endif
elseif(AI_Action == ACTION_RUN) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_RUN
set ad.r = RESPOND_HERO_RUN
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_RUN
set ad.o = OBJECTIVE_NEUTRAL
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_GO_FARM) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_NEED_FARM
set ad.r = RESPOND_HERO_NEED_FARM
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_FARM
set ad.o = OBJECTIVE_NEUTRAL
elseif(AI_Action == ACTION_CHANGE_TARGET) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_FARM
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_CARE) then
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_CARE
set ad.r = RESPOND_HERO_CARE
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_CARE
set ad.o = OBJECTIVE_NEUTRAL
if(ad.ct == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.u, ad.co)
endif
elseif(AI_Action == ACTION_PULL) then //Not used
call Perceive_Hero_Life(ad, 1)
if(AI_Action == ACTION_PULL) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_PULL
set ad.r = RESPOND_HERO_PULL
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_PULL
set ad.o = OBJECTIVE_KILL_UNITS
elseif(AI_Action == ACTION_COMBAT) then
set ad.r = RESPOND_HERO_FARM
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_PERCEIVE) then
set ad.r = RESPOND_HERO_FARM
set ad.v[1] = ad.v[1] + 1
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
endif
elseif(AI_Action == ACTION_TO_LOCATION) then
set ad.cl = AI_Action_Location
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_AWARE_LOCATION
set ad.r = RESPOND_HERO_AWARE_LOCATION
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_AWARE_LOCATION
if(ad.ct == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.u, ad.co, GetLocationX(ad.cl), GetLocationY(ad.cl))
endif
elseif(AI_Action == ACTION_TAKE_ITEM) then
set ad.ci = AI_Action_Item
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_FARM
call BJDebugMsg(GetItemName(ad.ci))
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.ci)
endif
elseif(AI_Action == ACTION_DEAD) then
set ad.s = STATE_HERO_DEAD
set ad.r = RESPOND_HERO_DEAD
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_DEAD
set ad.o = OBJECTIVE_NEUTRAL
endif
call Clear_Action()
call Perceive_Boat(ad, 0)
if(AI_Action == ACTION_BOAT_MOVE) then
set ad.col = AI_Action_Location
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
if(ad.cot == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.b, ad.coo, GetLocationX(ad.col), GetLocationY(ad.col))
endif
elseif(AI_Action == ACTION_BOAT_STOP) then
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
if(ad.cot == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.coo)
endif
endif
call Clear_Action()
endif
if(ad.d <= 0.0) then
set ad.s = STATE_HERO_NEED_READY
set ad.r = RESPOND_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope AIBaseHeroDead initializer Init
//----------------------------------------------------------------
function Base_Hero_Dead takes AI_Base_Data ad returns nothing
local integer j = 0
if(ad.r >= 0.0) then
set ad.r = ad.r - AI_INTERVAL
set ad.d = ad.d - AI_INTERVAL
else
call Perceive_Hero(ad, 0)
if(AI_Action == ACTION_GET_READY) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_NEED_READY
set ad.r = RESPOND_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
endif
call Clear_Action()
call Perceive_Boat(ad, 0)
if(AI_Action == ACTION_BOAT_MOVE) then
set ad.col = AI_Action_Location
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
if(ad.cot == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.b, ad.coo, GetLocationX(ad.col), GetLocationY(ad.col))
endif
elseif(AI_Action == ACTION_BOAT_STOP) then
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
if(ad.cot == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.coo)
endif
endif
call Clear_Action()
endif
if(ad.d <= 0.0) then
set ad.s = STATE_HERO_NEED_READY
set ad.r = RESPOND_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
endfunction
endscope
//TESH.scrollpos=231
//TESH.alwaysfold=0
scope AIBaseHeroRun initializer Init
//----------------------------------------------------------------
function Base_Hero_Run takes AI_Base_Data ad returns nothing
local integer j = 0
if(ad.r >= 0.0) then
set ad.r = ad.r - AI_INTERVAL
set ad.d = ad.d - AI_INTERVAL
else
call Perceive_Hero_Target(ad, ad.cu, 0)
if(AI_Action == ACTION_TO_BOAT) then
//call BJDebugMsg("To Boat")
set ad.cl = AI_Action_Location
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_NEED_LOAD
set ad.r = RESPOND_HERO_NEED_LOAD
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_LOAD
set ad.o = OBJECTIVE_NEUTRAL
if(ad.ct == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.u, ad.co, GetLocationX(ad.cl), GetLocationY(ad.cl))
endif
elseif(AI_Action == ACTION_RUN) then
//call BJDebugMsg("Run")
set ad.cl = AI_Action_Location
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
call Perceive_Hero_Location(ad, GetUnitX(ad.cu), GetUnitY(ad.cu), 1)
if(AI_Action == ACTION_NONE) then
//call BJDebugMsg("Run None")
set ad.cm = AI_Action
call Perceive_Hero_Skill(ad, ad.v[2], ad.us[ad.v[2]], ad.uscd[ad.v[2]], ad.usrl[ad.v[2]], 2)
if(AI_Action == ACTION_RUN) then
//call BJDebugMsg("Run None Run")
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_RUN
set ad.v[2] = ad.v[2] + 1
if(ad.ct == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.u, ad.co, GetLocationX(ad.cl), GetLocationY(ad.cl))
elseif(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_PERCEIVE) then
//call BJDebugMsg("Run None Perceive")
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_RUN
set ad.v[2] = ad.v[2] + 1
if(ad.ct == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.u, ad.co, GetUnitX(ad.cu), GetUnitY(ad.cu))
endif
elseif(AI_Action == ACTION_CAST) then
//call BJDebugMsg("Run None Cast")
set ad.cm = AI_Action
set ad.cid = AI_Action_ID
set ad.co = AI_Order
set ad.cm = AI_Action
set ad.s = STATE_HERO_CAST
set ad.r = RESPOND_HERO_CAST
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_CAST
set ad.o = OBJECTIVE_RUN
endif
elseif(AI_Action == ACTION_PERCEIVE) then
//call BJDebugMsg("Run Perceive")
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_RUN
set ad.v[1] = ad.v[1] + 1
if(ad.ct == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.u, ad.co, GetUnitX(ad.cu), GetUnitY(ad.cu))
endif
elseif(AI_Action == ACTION_BOAT_RECALL) then
//call BJDebugMsg("Run Boat Recall")
set ad.cl = AI_Action_Location
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_NEED_READY
set ad.s = STATE_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
elseif(ad.ct == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.u, ad.co, GetLocationX(ad.cl), GetLocationY(ad.cl))
endif
call Clear_Action()
call Perceive_Boat(ad, 2)
if(AI_Action == ACTION_BOAT_RECALL) then
set ad.cov = AI_Action_Perceive
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
set ad.v[2] = ad.cov
if(ad.cot == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.coo)
endif
endif
endif
elseif(AI_Action == ACTION_GET_READY) then
//call BJDebugMsg("Get Ready")
set ad.cm = AI_Action
set ad.s = STATE_HERO_READY
set ad.r = RESPOND_HERO_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_READY
set ad.o = OBJECTIVE_NEUTRAL
elseif(AI_Action == ACTION_KILL) then
//call BJDebugMsg("Kill")
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_KILL
set ad.r = RESPOND_HERO_KILL
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_KILL
set ad.o = OBJECTIVE_KILL_HEROES
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_PERCEIVE) then
//call BJDebugMsg("Perceive")
set ad.cm = AI_Action
set ad.v[0] = ad.v[0] + 1
set ad.r = RESPOND_HERO_RUN
elseif(AI_Action == ACTION_STOP) then
//call BJDebugMsg("Stop")
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_READY
set ad.r = RESPOND_HERO_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_READY
set ad.o = OBJECTIVE_NEUTRAL
if(ad.ct == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.u, ad.co)
endif
elseif(AI_Action == ACTION_TAKE_ITEM) then
//call BJDebugMsg("Take Item")
set ad.ci = AI_Action_Item
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_RUN
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.ci)
endif
elseif(AI_Action == ACTION_DEAD) then
//call BJDebugMsg("Dead")
set ad.cm = AI_Action
set ad.s = STATE_HERO_DEAD
set ad.r = RESPOND_HERO_DEAD
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_DEAD
set ad.o = OBJECTIVE_NEUTRAL
endif
call Clear_Action()
endif
if(ad.d <= 0.0) then
set ad.s = STATE_HERO_NEED_READY
set ad.r = RESPOND_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope AIBaseHeroNeedLoad initializer Init
//----------------------------------------------------------------
function Base_Hero_Need_Load takes AI_Base_Data ad returns nothing
local integer j = 0
if(ad.r >= 0.0) then
set ad.r = ad.r - AI_INTERVAL
set ad.d = ad.d - AI_INTERVAL
else
call Perceive_Hero_Target(ad, ad.b, 0)
if(AI_Action == ACTION_LOAD_HERO) then
set ad.cu = AI_Action_Unit
set ad.cl = AI_Action_Location
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
if(ad.ct == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.cu, ad.co)
elseif(ad.ct == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.cu, ad.co, GetLocationX(ad.cl), GetLocationY(ad.cl))
elseif(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
call Clear_Action()
call Perceive_Boat(ad, 1)
if(AI_Action == ACTION_LOAD_HERO) then
set ad.cou = AI_Action_Unit
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
set ad.v[1] = ad.v[1] + 1
if(ad.cot == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.b, ad.coo, ad.cou)
endif
elseif(AI_Action == ACTION_BOAT_RECALL) then
set ad.cov = AI_Action_Perceive
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
set ad.v[2] = ad.cov
if(ad.cot == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.coo)
endif
endif
elseif(AI_Action == ACTION_TO_BOAT) then
set ad.cm = AI_Action
call Perceive_Hero_Location(ad, GetUnitX(ad.cu), GetUnitY(ad.cu), 1)
if(AI_Action == ACTION_NONE) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_NEED_LOAD
if(ad.ct == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.u, ad.co, GetUnitX(ad.cu), GetUnitY(ad.cu))
elseif(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_PERCEIVE) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_NEED_LOAD
set ad.v[1] = ad.v[1] + 1
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_BOAT_RECALL) then
set ad.cl = AI_Action_Location
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_NEED_READY
set ad.s = STATE_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
elseif(ad.ct == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.u, ad.co, GetLocationX(ad.cl), GetLocationY(ad.cl))
endif
call Clear_Action()
call Perceive_Boat(ad, 2)
if(AI_Action == ACTION_BOAT_RECALL) then
set ad.cov = AI_Action_Perceive
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
set ad.v[2] = ad.cov
if(ad.cot == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.coo)
endif
endif
endif
elseif(AI_Action == ACTION_PERCEIVE) then
set ad.cm = AI_Action
set ad.v[0] = ad.v[0] + 1
set ad.r = RESPOND_HERO_NEED_LOAD
elseif(AI_Action == ACTION_NONE) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_LOAD
set ad.r = RESPOND_HERO_LOAD
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_LOAD
set ad.o = OBJECTIVE_NEUTRAL
elseif(AI_Action == ACTION_DEAD) then
set ad.s = STATE_HERO_DEAD
set ad.r = RESPOND_HERO_DEAD
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_DEAD
set ad.o = OBJECTIVE_NEUTRAL
endif
call Clear_Action()
endif
if(ad.d <= 0.0) then
set ad.s = STATE_HERO_NEED_READY
set ad.r = RESPOND_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
endfunction
endscope
//TESH.scrollpos=21
//TESH.alwaysfold=0
scope AIBaseHeroLoad initializer Init
//----------------------------------------------------------------
function Base_Hero_Load takes AI_Base_Data ad returns nothing
local integer j = 0
if(ad.r >= 0.0) then
set ad.r = ad.r - AI_INTERVAL
set ad.d = ad.d - AI_INTERVAL
else
call Perceive_Hero(ad, 0)
if(AI_Action == ACTION_LOAD_HERO) then
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_LOAD
if(ad.ct == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.u, ad.co)
endif
call Clear_Action()
call Perceive_Boat(ad, 1)
if(AI_Action == ACTION_LOAD_HERO) then
set ad.cou = AI_Action_Unit
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
if(ad.cot == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.b, ad.coo, ad.cou)
endif
endif
elseif(AI_Action == ACTION_NONE) then
set ad.cm = AI_Action
call Perceive_Hero_Life(ad, 1)
if(AI_Action == ACTION_UNLOAD_HERO) then
set ad.co = AI_Order
set ad.cm = AI_Action
set ad.s = STATE_HERO_UNLOAD
set ad.r = RESPOND_HERO_UNLOAD
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_UNLOAD
set ad.o = OBJECTIVE_NEUTRAL
elseif(AI_Action == ACTION_NONE) then
set ad.r = RESPOND_HERO_LOAD
endif
elseif(AI_Action == ACTION_DEAD) then
set ad.s = STATE_HERO_DEAD
set ad.r = RESPOND_HERO_DEAD
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_DEAD
set ad.o = OBJECTIVE_NEUTRAL
endif
call Clear_Action()
endif
if(ad.d <= 0.0) then
set ad.s = STATE_HERO_NEED_LOAD
set ad.r = RESPOND_HERO_NEED_LOAD
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_LOAD
set ad.o = OBJECTIVE_NEUTRAL
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope AIBaseHeroUnload initializer Init
//----------------------------------------------------------------
function Base_Hero_Unload takes AI_Base_Data ad returns nothing
local integer j = 0
if(ad.r >= 0.0) then
set ad.r = ad.r - AI_INTERVAL
set ad.d = ad.d - AI_INTERVAL
else
call Perceive_Hero(ad, 0)
if(AI_Action == ACTION_GET_READY) then
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_NEED_READY
set ad.r = RESPOND_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
if(ad.ct == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.u, ad.co)
endif
elseif(AI_Action == ACTION_NONE) then
set ad.cl = AI_Action_Location
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_UNLOAD
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
elseif(ad.ct == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.u, ad.co, GetLocationX(ad.cl), GetLocationY(ad.cl))
endif
call Clear_Action()
call Perceive_Boat(ad, 1)
if(AI_Action == ACTION_UNLOAD_HERO) then
set ad.col = AI_Action_Location
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
set ad.v[1] = ad.v[1] + 1
if(ad.cot == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.b, ad.coo, GetLocationX(ad.col), GetLocationY(ad.col))
elseif(ad.cot == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.coo)
endif
elseif(AI_Action == ACTION_BOAT_MOVE) then
set ad.col = AI_Action_Location
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
set ad.v[1] = ad.v[1] + 1
if(ad.cot == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.b, ad.coo, GetLocationX(ad.col), GetLocationY(ad.col))
elseif(ad.cot == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.coo)
endif
elseif(AI_Action == ACTION_REMEMBER) then
set ad.col = AI_Action_Location
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
set ad.l = ad.col
set ad.v[1] = ad.v[1] + 1
if(ad.cot == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.b, ad.coo, GetLocationX(ad.col), GetLocationY(ad.col))
elseif(ad.cot == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.coo)
endif
elseif(AI_Action == ACTION_PERCEIVE) then
set ad.col = AI_Action_Location
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
set ad.v[1] = ad.v[1] + 1
if(ad.cot == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.b, ad.coo, GetLocationX(ad.col), GetLocationY(ad.col))
elseif(ad.cot == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.coo)
endif
elseif(AI_Action == ACTION_REPERCEIVE) then
set ad.col = AI_Action_Location
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.cov = AI_Action_Perceive
set ad.com = AI_Action
set ad.v[1] = ad.cov
if(ad.cot == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.b, ad.coo, GetLocationX(ad.col), GetLocationY(ad.col))
elseif(ad.cot == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.coo)
endif
endif
elseif(AI_Action == ACTION_STOP) then
set ad.cm = AI_Action
set ad.v[0] = ad.v[0] + 1
call Clear_Action()
call Perceive_Boat(ad, 1)
if(AI_Action == ACTION_BOAT_STOP) then
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
set ad.v[1] = ad.v[1] + 1
if(ad.cot == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.coo)
endif
endif
elseif(AI_Action == ACTION_DEAD) then
set ad.s = STATE_HERO_DEAD
set ad.r = RESPOND_HERO_DEAD
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_DEAD
set ad.o = OBJECTIVE_NEUTRAL
endif
call Clear_Action()
endif
if(ad.d <= 0.0) then
set ad.s = STATE_HERO_LOAD
set ad.r = RESPOND_HERO_LOAD
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_LOAD
set ad.o = OBJECTIVE_NEUTRAL
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope AIBaseHeroCare initializer Init
//----------------------------------------------------------------
function Base_Hero_Care takes AI_Base_Data ad returns nothing
local integer j = 0
if(ad.r >= 0.0) then
set ad.r = ad.r - AI_INTERVAL
set ad.d = ad.d - AI_INTERVAL
else
call Perceive_Hero(ad, 0)
if(AI_Action == ACTION_KILL) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_KILL
set ad.r = RESPOND_HERO_KILL
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_KILL
set ad.o = OBJECTIVE_KILL_HEROES
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_RUN) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_RUN
set ad.r = RESPOND_HERO_RUN
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_RUN
set ad.o = OBJECTIVE_RUN
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_PERCEIVE) then
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_CARE
set ad.v[0] = ad.v[0] + 1
if(ad.ct == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.u, ad.co)
endif
elseif(AI_Action == ACTION_GET_READY) then
set ad.cl = AI_Action_Location
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_NEED_READY
set ad.r = RESPOND_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
if(ad.ct == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.u, ad.co, GetLocationX(ad.cl), GetLocationY(ad.cl))
endif
elseif(AI_Action == ACTION_DEAD) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_DEAD
set ad.r = RESPOND_HERO_DEAD
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_DEAD
set ad.o = OBJECTIVE_NEUTRAL
endif
call Clear_Action()
call Perceive_Boat(ad, 0)
if(AI_Action == ACTION_BOAT_MOVE) then
set ad.col = AI_Action_Location
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
if(ad.cot == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.b, ad.coo, GetLocationX(ad.col), GetLocationY(ad.col))
endif
elseif(AI_Action == ACTION_BOAT_STOP) then
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
if(ad.cot == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.coo)
endif
endif
call Clear_Action()
endif
if(ad.d <= 0.0) then
set ad.s = STATE_HERO_NEED_READY
set ad.r = RESPOND_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope AIBaseHeroKill initializer Init
//----------------------------------------------------------------
function Base_Hero_Kill takes AI_Base_Data ad returns nothing
local integer j = 0
if(ad.r >= 0.0) then
set ad.r = ad.r - AI_INTERVAL
set ad.d = ad.d - AI_INTERVAL
else
call Perceive_Hero_Target(ad, ad.cu, 0)
if(AI_Action == ACTION_COMBAT) then
set ad.cu = AI_Action_Unit
set ad.cv = AI_Action_Perceive
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.v[0] = ad.cv
set ad.v[1] = GetRandomInt(0, TOTAL_HERO_SKILL - 1)
call Perceive_Hero_Skill(ad, ad.v[1], ad.us[ad.v[1]], ad.uscd[ad.v[1]], ad.usrl[ad.v[1]], 1)
if(AI_Action == ACTION_COMBAT) then
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_KILL
set ad.v[1] = ad.v[1] + 1
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_CAST) then
set ad.cid = AI_Action_ID
set ad.co = AI_Order
set ad.cm = AI_Action
set ad.s = STATE_HERO_CAST
set ad.r = RESPOND_HERO_CAST
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_CAST
//set ad.o = OBJECTIVE_KILL_HEROES
elseif(AI_Action == ACTION_KILL_ATOK) then
set ad.cid = AI_Action_ID
set ad.co = AI_Order
set ad.cm = AI_Action
set ad.s = STATE_HERO_CAST
set ad.r = RESPOND_HERO_CAST
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_CAST
set ad.o = OBJECTIVE_KILL_ATOK
elseif(AI_Action == ACTION_PERCEIVE) then
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_KILL
set ad.v[1] = ad.v[1] + 1
endif
elseif(AI_Action == ACTION_CHANGE_TARGET) then
set ad.cv = AI_Action_Perceive
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.v[0] = ad.cv
set ad.r = RESPOND_HERO_KILL
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_CHASE) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.cm = AI_Action
set ad.s = STATE_HERO_CHASE
set ad.r = RESPOND_HERO_CHASE
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_CHASE
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_RUN) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_RUN
set ad.r = RESPOND_HERO_RUN
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_RUN
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_GET_READY) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_NEED_READY
set ad.r = RESPOND_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
elseif(AI_Action == ACTION_WAIT) then
set ad.cm = AI_Action
set ad.v[0] = ad.v[0] + 1
set ad.r = RESPOND_HERO_KILL
elseif(AI_Action == ACTION_TO_LOCATION) then
set ad.cl = AI_Action_Location
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_AWARE_LOCATION
set ad.r = RESPOND_HERO_AWARE_LOCATION
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_AWARE_LOCATION
if(ad.ct == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.u, ad.co, GetLocationX(ad.cl), GetLocationY(ad.cl))
endif
elseif(AI_Action == ACTION_TAKE_ITEM) then
set ad.ci = AI_Action_Item
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_KILL
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.ci)
endif
elseif(AI_Action == ACTION_DEAD) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_DEAD
set ad.r = RESPOND_HERO_DEAD
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_DEAD
set ad.o = OBJECTIVE_NEUTRAL
endif
call Clear_Action()
call Perceive_Boat(ad, 0)
if(AI_Action == ACTION_BOAT_MOVE) then
set ad.col = AI_Action_Location
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
if(ad.cot == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.b, ad.coo, GetLocationX(ad.col), GetLocationY(ad.col))
endif
elseif(AI_Action == ACTION_BOAT_STOP) then
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
if(ad.cot == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.coo)
endif
endif
call Clear_Action()
endif
if(ad.d <= 0.0) then
set ad.s = STATE_HERO_NEED_READY
set ad.r = RESPOND_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope AIBaseHeroChase initializer Init
//----------------------------------------------------------------
function Base_Hero_Chase takes AI_Base_Data ad returns nothing
local integer j = 0
if(ad.r >= 0.0) then
set ad.r = ad.r - AI_INTERVAL
set ad.d = ad.d - AI_INTERVAL
else
call Perceive_Hero_Target(ad, ad.cu, 0)
if(AI_Action == ACTION_COMBAT) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_KILL
set ad.r = RESPOND_HERO_KILL
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_KILL
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_CHASE) then
set ad.cm = AI_Action
call Perceive_Hero_Skill(ad, ad.v[1], ad.us[ad.v[1]], ad.uscd[ad.v[1]], ad.usrl[ad.v[1]], 1)
if(AI_Action == ACTION_CHASE) then
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_CHASE
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_CAST) then
set ad.cid = AI_Action_ID
set ad.co = AI_Order
set ad.cm = AI_Action
set ad.s = STATE_HERO_CAST
set ad.r = RESPOND_HERO_CAST
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_CAST
elseif(AI_Action == ACTION_PERCEIVE) then
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_CHASE
set ad.v[1] = ad.v[1] + 1
endif
elseif(AI_Action == ACTION_GET_VICTOR) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_GET_VICTOR
set ad.r = RESPOND_GET_VICTOR
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_GET_VICTOR
set ad.o = OBJECTIVE_GET_VICTOR
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_RUN) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_RUN
set ad.r = RESPOND_HERO_RUN
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_RUN
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_GET_READY) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_NEED_READY
set ad.r = RESPOND_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
elseif(AI_Action == ACTION_PERCEIVE) then
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_CHASE
set ad.v[0] = ad.v[0] + 1
elseif(AI_Action == ACTION_TO_LOCATION) then
set ad.cl = AI_Action_Location
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_AWARE_LOCATION
set ad.r = RESPOND_HERO_AWARE_LOCATION
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_AWARE_LOCATION
if(ad.ct == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.u, ad.co, GetLocationX(ad.cl), GetLocationY(ad.cl))
endif
elseif(AI_Action == ACTION_DEAD) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_DEAD
set ad.r = RESPOND_HERO_DEAD
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_DEAD
set ad.o = OBJECTIVE_NEUTRAL
elseif(AI_Action == ACTION_NONE) then
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_CHASE
endif
call Clear_Action()
call Perceive_Boat(ad, 0)
if(AI_Action == ACTION_BOAT_MOVE) then
set ad.col = AI_Action_Location
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
if(ad.cot == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.b, ad.coo, GetLocationX(ad.col), GetLocationY(ad.col))
endif
elseif(AI_Action == ACTION_BOAT_STOP) then
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
if(ad.cot == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.coo)
endif
endif
call Clear_Action()
endif
if(ad.d <= 0.0) then
set ad.s = STATE_HERO_NEED_READY
set ad.r = RESPOND_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope AIBaseHeroPull initializer Init
//----------------------------------------------------------------
function Base_Hero_Pull takes AI_Base_Data ad returns nothing
local integer j = 0
if(ad.r >= 0.0) then
set ad.r = ad.r - AI_INTERVAL
set ad.d = ad.d - AI_INTERVAL
else
call Perceive_Hero_Target(ad, ad.cu, 0)
if(AI_Action == ACTION_STOP) then
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_READY
set ad.r = RESPOND_HERO_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_READY
if(ad.ct == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.u, ad.co)
endif
elseif(AI_Action == ACTION_DEAD) then
set ad.s = STATE_HERO_DEAD
set ad.r = RESPOND_HERO_DEAD
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_DEAD
set ad.o = OBJECTIVE_NEUTRAL
elseif(AI_Action == ACTION_PULL) then
set ad.cm = AI_Action
call Perceive_Hero_Location(ad, GetUnitX(ad.cu), GetUnitY(ad.cu), 1)
if(AI_Action == ACTION_NONE) then
set ad.r = RESPOND_HERO_AWARE_UNIT
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_STOP) then
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_READY
set ad.r = RESPOND_HERO_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_READY
if(ad.ct == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.u, ad.co)
endif
elseif(AI_Action == ACTION_RUN) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_RUN
set ad.r = RESPOND_HERO_RUN
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_RUN
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_PERCEIVE) then
set ad.cm = AI_Action
set ad.v[1] = ad.v[1] + 1
set ad.r = RESPOND_HERO_AWARE_UNIT
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_BOAT_RECALL) then
set ad.cl = AI_Action_Location
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_NEED_READY
set ad.s = STATE_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.b)
elseif(ad.ct == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.u, ad.co, GetLocationX(ad.cl), GetLocationY(ad.cl))
endif
call Clear_Action()
call Perceive_Boat(ad, 2)
if(AI_Action == ACTION_BOAT_RECALL) then
set ad.cov = AI_Action_Perceive
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
set ad.v[2] = ad.cov
if(ad.cot == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.coo)
endif
endif
elseif(AI_Action == ACTION_DEAD) then
set ad.s = STATE_HERO_DEAD
set ad.r = RESPOND_HERO_DEAD
set ad.v[1] = 0
set ad.d = DURATION_HERO_DEAD
set ad.o = OBJECTIVE_NEUTRAL
endif
elseif(AI_Action == ACTION_RUN) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_RUN
set ad.r = RESPOND_HERO_RUN
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_RUN
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_TO_LOCATION) then
set ad.cl = AI_Action_Location
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_AWARE_LOCATION
set ad.r = RESPOND_HERO_AWARE_LOCATION
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_AWARE_LOCATION
if(ad.ct == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.u, ad.co, GetLocationX(ad.cl), GetLocationY(ad.cl))
endif
endif
call Clear_Action()
endif
if(ad.d <= 0.0) then
set ad.s = STATE_HERO_NEED_READY
set ad.r = RESPOND_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope AIBaseHeroCast initializer Init
//----------------------------------------------------------------
function Base_Hero_Cast takes AI_Base_Data ad returns nothing
local integer j = 0
local boolean b = false
if(ad.r >= 0.0) then
set ad.r = ad.r - AI_INTERVAL
set ad.d = ad.d - AI_INTERVAL
else
call Perceive_Hero(ad, 0)
if(AI_Action == ACTION_STOP) then
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
if(ad.o == OBJECTIVE_GET_VICTOR) then
set ad.s = STATE_GET_VICTOR
set ad.r = RESPOND_GET_VICTOR
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_GET_VICTOR
elseif(ad.o == OBJECTIVE_KILL_HEROES) then
set ad.s = STATE_HERO_KILL
set ad.r = RESPOND_HERO_KILL
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_KILL
else
set ad.s = STATE_HERO_READY
set ad.r = RESPOND_HERO_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_READY
endif
if(ad.ct == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.u, ad.co)
endif
elseif(AI_Action == ACTION_GET_VICTOR) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_GET_VICTOR
set ad.r = RESPOND_GET_VICTOR
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_GET_VICTOR
set ad.o = OBJECTIVE_GET_VICTOR
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_GO_KILL) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_NEED_KILL
set ad.r = RESPOND_HERO_NEED_KILL
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_KILL
elseif(AI_Action == ACTION_GO_FARM) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_NEED_FARM
set ad.r = RESPOND_HERO_NEED_FARM
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_FARM
elseif(AI_Action == ACTION_PERCEIVE) then
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_CAST
set ad.v[0] = ad.v[0] + 1
elseif(AI_Action == ACTION_DEAD) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_DEAD
set ad.r = RESPOND_HERO_DEAD
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_DEAD
set ad.o = OBJECTIVE_NEUTRAL
elseif(AI_Action == ACTION_CAST) then
set ad.cm = AI_Action
call Perceive_Hero_Skill(ad, ad.cid, ad.us[ad.cid], ad.uscd[ad.cid], ad.usrl[ad.cid], 1)
if(AI_Action == ACTION_CAST) then
if(ad.cu != null) then
set ad.cu = ad.cu
else
set ad.cu = AI_Action_Unit
endif
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set b = false
if(ad.ct == ACTION_ORDER_TYPE_IMMEDIATE) then
set b = IssueImmediateOrder(ad.u, ad.co)
elseif(ad.ct == ACTION_ORDER_TYPE_TARGET) then
if(GetHeroAbilityMode(ad.un, ad.cid, ad.us[ad.cid]) == KNOWLEDGE_ABILITY_MODE_SELF) then
set b = IssueTargetOrder(ad.u, ad.co, ad.u)
elseif(GetHeroAbilityMode(ad.un, ad.cid, ad.us[ad.cid]) == KNOWLEDGE_ABILITY_MODE_ENEMY or /*
*/GetHeroAbilityMode(ad.un, ad.cid, ad.us[ad.cid]) == KNOWLEDGE_ABILITY_MODE_ALLY) then
set b = IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(ad.ct == ACTION_ORDER_TYPE_POINT) then
set ad.cx = GetUnitX(ad.cu)
set ad.cy = GetUnitY(ad.cu)
set b = IssuePointOrder(ad.u, ad.co, ad.cx, ad.cy)
endif
if(b) then
set ad.uscd[ad.cid] = GetHeroAbilityCooldown(ad.un, ad.cid, ad.us[ad.cid])
set ad.r = RESPOND_HERO_CAST
set ad.v[0] = PERCEIVE_MAX_LEVEL_CAST_EFFECT - GetHeroAbilityPerceive(ad.un, ad.cid, ad.us[ad.cid])
else
set ad.r = RESPOND_HERO_CAST
set ad.v[0] = PERCEIVE_DEFAULT_VALUE
endif
elseif(AI_Action == ACTION_PERCEIVE) then
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_CAST
set ad.v[1] = ad.v[1] + 1
elseif(AI_Action == ACTION_NONE) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_READY
set ad.r = RESPOND_HERO_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_READY
endif
elseif(AI_Action == ACTION_NONE) then
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_CAST
endif
call Clear_Action()
call Perceive_Boat(ad, 0)
if(AI_Action == ACTION_BOAT_MOVE) then
set ad.col = AI_Action_Location
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
if(ad.cot == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.b, ad.coo, GetLocationX(ad.col), GetLocationY(ad.col))
endif
elseif(AI_Action == ACTION_BOAT_STOP) then
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
if(ad.cot == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.coo)
endif
endif
call Clear_Action()
endif
if(ad.d <= 0.0) then
set ad.s = STATE_HERO_NEED_READY
set ad.r = RESPOND_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
endfunction
endscope
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope AIBaseGetVictor initializer Init
//----------------------------------------------------------------
function Base_Get_Victor takes AI_Base_Data ad returns nothing
local integer j = 0
if(ad.r >= 0.0) then
set ad.r = ad.r - AI_INTERVAL
set ad.d = ad.d - AI_INTERVAL
else
call Perceive_Hero_Target(ad, ad.cu, 0)
if(AI_Action == ACTION_COMBAT) then
set ad.cu = AI_Action_Unit
set ad.cv = AI_Action_Perceive
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.v[0] = ad.cv
set ad.v[1] = GetRandomInt(0, TOTAL_HERO_SKILL - 1)
call Perceive_Hero_Skill(ad, ad.v[1], ad.us[ad.v[1]], ad.uscd[ad.v[1]], ad.usrl[ad.v[1]], 1)
if(AI_Action == ACTION_COMBAT) then
set ad.cm = AI_Action
set ad.r = RESPOND_GET_VICTOR
set ad.v[1] = ad.v[1] + 1
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_CAST) then
set ad.cid = AI_Action_ID
set ad.co = AI_Order
set ad.cm = AI_Action
set ad.s = STATE_HERO_CAST
set ad.r = RESPOND_HERO_CAST
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_CAST
set ad.o = OBJECTIVE_GET_VICTOR
elseif(AI_Action == ACTION_PERCEIVE) then
set ad.cm = AI_Action
set ad.r = RESPOND_GET_VICTOR
set ad.v[1] = ad.v[1] + 1
endif
elseif(AI_Action == ACTION_CHANGE_TARGET) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_KILL
set ad.r = RESPOND_HERO_KILL
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_KILL
set ad.o = OBJECTIVE_GET_VICTOR
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_CHASE) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.cm = AI_Action
set ad.s = STATE_HERO_CHASE
set ad.r = RESPOND_HERO_CHASE
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_CHASE
set ad.o = OBJECTIVE_GET_VICTOR
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_RUN) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_RUN
set ad.r = RESPOND_HERO_RUN
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_RUN
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_GET_READY) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_NEED_READY
set ad.r = RESPOND_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
elseif(AI_Action == ACTION_WAIT) then
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_KILL
set ad.v[0] = ad.v[0] + 1
elseif(AI_Action == ACTION_KILL) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_NEED_KILL
set ad.r = RESPOND_HERO_NEED_KILL
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_KILL
elseif(AI_Action == ACTION_TO_LOCATION) then
set ad.cl = AI_Action_Location
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_AWARE_LOCATION
set ad.r = RESPOND_HERO_AWARE_LOCATION
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_AWARE_LOCATION
if(ad.ct == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.u, ad.co, GetLocationX(ad.cl), GetLocationY(ad.cl))
endif
elseif(AI_Action == ACTION_DEAD) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_DEAD
set ad.r = RESPOND_HERO_DEAD
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_DEAD
set ad.o = OBJECTIVE_NEUTRAL
endif
call Clear_Action()
call Perceive_Boat(ad, 0)
if(AI_Action == ACTION_BOAT_MOVE) then
set ad.col = AI_Action_Location
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
if(ad.cot == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.b, ad.coo, GetLocationX(ad.col), GetLocationY(ad.col))
endif
elseif(AI_Action == ACTION_BOAT_STOP) then
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
if(ad.cot == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.coo)
endif
endif
call Clear_Action()
endif
if(ad.d <= 0.0) then
set ad.s = STATE_HERO_NEED_READY
set ad.r = RESPOND_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
endfunction
endscope
//TESH.scrollpos=27
//TESH.alwaysfold=0
scope AIBaseHeroNeedKill initializer Init
//----------------------------------------------------------------
function Base_Hero_Need_Kill takes AI_Base_Data ad returns nothing
local integer j = 0
if(ad.r >= 0.0) then
set ad.r = ad.r - AI_INTERVAL
set ad.d = ad.d - AI_INTERVAL
else
call Perceive_Hero(ad, 0)
if(AI_Action == ACTION_COMBAT) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_KILL
set ad.r = RESPOND_HERO_KILL
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_KILL
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_RUN) then
set ad.cu = AI_Action_Unit
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_RUN
set ad.r = RESPOND_HERO_RUN
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_RUN
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.cu)
endif
elseif(AI_Action == ACTION_DEAD) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_DEAD
set ad.r = RESPOND_HERO_DEAD
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_DEAD
set ad.o = OBJECTIVE_NEUTRAL
elseif(AI_Action == ACTION_PERCEIVE) then
set ad.cm = AI_Action
set ad.v[0] = ad.v[0] + 1
set ad.r = RESPOND_HERO_NEED_KILL
elseif(AI_Action == ACTION_KILL) then
set ad.cl = AI_Action_Location
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_NEED_KILL
set ad.v[0] = 0
if(ad.ct == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrderLoc(ad.u, ad.co, ad.cl)
endif
elseif(AI_Action == ACTION_GET_READY) then
set ad.cm = AI_Action
set ad.s = STATE_HERO_NEED_READY
set ad.r = RESPOND_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
elseif(AI_Action == ACTION_NONE) then
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_NEED_KILL
set ad.v[0] = 0
elseif(AI_Action == ACTION_TO_LOCATION) then
set ad.cl = AI_Action_Location
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.s = STATE_HERO_AWARE_LOCATION
set ad.r = RESPOND_HERO_AWARE_LOCATION
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_AWARE_LOCATION
if(ad.ct == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.u, ad.co, GetLocationX(ad.cl), GetLocationY(ad.cl))
endif
elseif(AI_Action == ACTION_TAKE_ITEM) then
set ad.ci = AI_Action_Item
set ad.co = AI_Order
set ad.ct = AI_Order_Type
set ad.cm = AI_Action
set ad.r = RESPOND_HERO_NEED_KILL
if(ad.ct == ACTION_ORDER_TYPE_TARGET) then
call IssueTargetOrder(ad.u, ad.co, ad.ci)
endif
endif
call Clear_Action()
call Perceive_Boat(ad, 0)
if(AI_Action == ACTION_BOAT_MOVE) then
set ad.col = AI_Action_Location
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
if(ad.cot == ACTION_ORDER_TYPE_POINT) then
call IssuePointOrder(ad.b, ad.coo, GetLocationX(ad.col), GetLocationY(ad.col))
endif
elseif(AI_Action == ACTION_BOAT_STOP) then
set ad.coo = AI_Order
set ad.cot = AI_Order_Type
set ad.com = AI_Action
if(ad.cot == ACTION_ORDER_TYPE_IMMEDIATE) then
call IssueImmediateOrder(ad.b, ad.coo)
endif
endif
call Clear_Action()
endif
if(ad.d <= 0.0) then
set ad.s = STATE_HERO_NEED_READY
set ad.r = RESPOND_HERO_NEED_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_NEED_READY
set ad.o = OBJECTIVE_NEUTRAL
endif
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
endfunction
endscope
//TESH.scrollpos=180
//TESH.alwaysfold=0
scope AIBaseEngine initializer Init
//----------------------------------------------------------------
private function AI_Actions_Execute takes nothing returns nothing
local AI_Base_Data ad
local integer i = 0
local integer j = 0
local real x = 0.0
local real y = 0.0
local integer id = 0
local boolean updateHeroPosition = false
local boolean updateHeroLife = false
loop
exitwhen(i >= TotalAIData)
set ad = AI_Data[i]
if(ad.u == null) then
//call BJDebugMsg(GetPlayerName(ad.p) + " " + I2S(ad.s) + " " + I2S(ad.i))
else
//call BJDebugMsg(GetPlayerName(ad.p) + " " + GetUnitName(ad.u) + " " + I2S(ad.s) + " " + I2S(ad.i))
endif
set updateHeroPosition = false
set updateHeroLife = false
if(ad.s == STATE_INTRO) then
call Base_Intro(ad)
elseif(ad.s == STATE_PICK_HERO) then
call Base_Pick_Hero(ad)
elseif(ad.s == STATE_HERO_INIT) then
call Base_Hero_Init(ad)
elseif(ad.s == STATE_HERO_NEED_READY) then
call Base_Hero_Need_Ready(ad)
elseif(ad.s == STATE_HERO_AWARE_UNIT) then
call Base_Hero_Aware_Unit(ad)
set updateHeroPosition = true
elseif(ad.s == STATE_HERO_AWARE_LOCATION) then
call Base_Hero_Aware_Location(ad)
set updateHeroPosition = true
elseif(ad.s == STATE_HERO_READY) then
call Base_Hero_Ready(ad)
elseif(ad.s == STATE_HERO_NEED_FARM) then
call Base_Hero_Need_Farm(ad)
elseif(ad.s == STATE_HERO_FARM) then
call Base_Hero_Farm(ad)
set updateHeroLife = true
elseif(ad.s == STATE_HERO_DEAD) then
call Base_Hero_Dead(ad)
elseif(ad.s == STATE_HERO_RUN) then
call Base_Hero_Run(ad)
set updateHeroPosition = true
elseif(ad.s == STATE_HERO_NEED_LOAD) then
call Base_Hero_Need_Load(ad)
elseif(ad.s == STATE_HERO_LOAD) then
call Base_Hero_Load(ad)
set updateHeroLife = true
elseif(ad.s == STATE_HERO_UNLOAD) then
call Base_Hero_Unload(ad)
elseif(ad.s == STATE_HERO_CARE) then
call Base_Hero_Care(ad)
elseif(ad.s == STATE_HERO_KILL) then
call Base_Hero_Kill(ad)
elseif(ad.s == STATE_HERO_CHASE) then
call Base_Hero_Chase(ad)
elseif(ad.s == STATE_HERO_PULL) then
call Base_Hero_Pull(ad)
set updateHeroPosition = true
elseif(ad.s == STATE_HERO_CAST) then
call Base_Hero_Cast(ad)
elseif(ad.s == STATE_GET_VICTOR) then
call Base_Get_Victor(ad)
elseif(ad.s == STATE_HERO_NEED_KILL) then
call Base_Hero_Need_Kill(ad)
endif
//update
if(ad.u != null) then
if(updateHeroPosition) then
set x = GetUnitX(ad.u)
set y = GetUnitY(ad.u)
if(ad.ux != x or ad.uy != y) then
set ad.ux = x
set ad.uy = y
endif
endif
if(updateHeroLife) then
set ad.ul = GetUnitState(ad.u, UNIT_STATE_LIFE)
endif
set j = 0
loop
exitwhen(j >= TOTAL_HERO_SKILL)
if(ad.uscd[j] > 0) then
set ad.uscd[j] = ad.uscd[j] - AI_INTERVAL
endif
set j = j + 1
endloop
endif
set i = i + 1
endloop
endfunction
//----------------------------------------------------------------
private function AI_Birth_Actions takes nothing returns nothing
local integer i = 0
local integer j = 0
local player p = null
local AI_Base_Data ad
loop
exitwhen(i >= 8)
set p = Player(i)
if(GetPlayerController(p) == MAP_CONTROL_COMPUTER) then
call RemoveAllGuardPositions(p)
call ForceAddPlayer(Players, p)
if(GetPlayerId(p) < 4) then
call ForceAddPlayer(Players_Luminous, p)
set Players_Luminous_Count = Players_Luminous_Count + 1
elseif(GetPlayerId(p) < 8) then
call ForceAddPlayer(Players_Overcast, p)
set Players_Overcast_Count = Players_Overcast_Count + 1
endif
set ad = AI_Base_Data.create()
set ad.p = p
set j = 0
loop
exitwhen(j >= TOTAL_TEXT_TYPE_MEMORY)
set ad.pt[j] = TEXT_TYPE_UNKNOWN
set j = j + 1
endloop
set ad.n = null
set j = 0
loop
exitwhen(j >= TOTAL_LOCATION_RUNE_RESTORATION)
set ad.er[j] = false
set j = j + 1
endloop
set j = 0
loop
exitwhen(j >= TOTAL_LOCATION_GLYPH)
set ad.gf[j] = false
set j = j + 1
endloop
set ad.u = null
set ad.uid = 0
set ad.un = -1
set ad.ut = GetRandomInt(0, 1)
set ad.ux = 0.0
set ad.uy = 0.0
set ad.ul = 0.0
set ad.ui = 0
set j = 0
loop
exitwhen(j >= TOTAL_HERO_SKILL)
set ad.us[j] = 0
set ad.uscd[j] = 0.0
set ad.usrl[j] = 0
set j = j + 1
endloop
set ad.usr = false
set ad.b = null
set ad.l = Location(0.0, 0.0)
set ad.s = STATE_INTRO
set ad.r = RESPOND_INTRO
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_INTRO
set ad.o = OBJECTIVE_NEUTRAL
set ad.i = 0
set ad.im = -1
set ad.cid = 0
set ad.cu = null
set ad.ci = null
set ad.cd = null
set ad.cl = null
set ad.co = ""
set ad.ct = 0
set ad.cm = ACTION_NONE
set ad.cx = 0.0
set ad.cy = 0.0
set ad.cv = 0
set ad.coid = 0
set ad.cou = null
set ad.coi = null
set ad.cod = null
set ad.col = null
set ad.coo = ""
set ad.cot = 0
set ad.com = ACTION_NONE
set ad.cox = 0.0
set ad.coy = 0.0
set ad.cov = 0
if(TotalAIData <= 0) then
call TimerStart(TimerAIData, AI_INTERVAL, true, function AI_Actions_Execute)
endif
set TotalAIData = TotalAIData + 1
set AI_Data[TotalAIData - 1] = ad
endif
set i = i + 1
endloop
set p = null
endfunction
//----------------------------------------------------------------
private function AI_Reset_Actions takes nothing returns nothing
local integer i = 0
local integer j = 0
local AI_Base_Data ad
loop
exitwhen(i >= TotalAIData)
set ad = AI_Data[i]
set ad.s = STATE_HERO_READY
set ad.r = RESPOND_HERO_READY
set j = 0
loop
exitwhen(j >= TOTAL_PERCEIVE_LEVEL)
set ad.v[j] = PERCEIVE_DEFAULT_VALUE
set j = j + 1
endloop
set ad.d = DURATION_HERO_READY
set ad.o = OBJECTIVE_NEUTRAL
set i = i + 1
endloop
endfunction
//----------------------------------------------------------------
private function Init takes nothing returns nothing
call TriggerAddAction(AIBirthTrg, function AI_Birth_Actions)
call TriggerAddAction(AIResetTrg, function AI_Reset_Actions)
endfunction
endscope