//TESH.scrollpos=0
//TESH.alwaysfold=0
function EnemyTroops takes nothing returns boolean
return IsUnitEnemy( GetFilterUnit(), ConvertedPlayer( udg_AI_PlayerNumber ) ) and IsUnitAliveBJ( GetFilterUnit() ) //and GetConvertedPlayerId(GetOwningPlayer(GetFilterUnit())) < 6
endfunction
// ********************************************************************
// checks if the unit type is a captain of the batalion
// returns array index defined in initialization, otherwise returns 0
function IsCaptain takes integer captain returns integer
local integer i = 1
loop
if ( captain == udg_BattalionCaptain[i] ) then
return i
endif
exitwhen i > udg_NrTypes
set i = i + 1
endloop
return 0
endfunction
// ********************************************************************
// returns captain unit of the batalion
function GetCaptain takes group batalion returns unit
local unit captain
local group tempgroup = CreateGroup()
call GroupAddGroup(batalion,tempgroup)
loop
set captain = FirstOfGroup(tempgroup)
exitwhen LoadInteger(udg_hashtable, GetHandleId(captain), 1) == 1 // or captain == null
call GroupRemoveUnit( tempgroup, captain )
endloop
call DestroyGroup(tempgroup)
set tempgroup = null
return captain
endfunction
// ********************************************************************
// checks if batalion has all his units
function IsComplete takes unit captain returns boolean
local integer battallionIndex = LoadInteger(udg_hashtable, GetHandleId(captain), 0)
if ( battallionIndex == 0 ) then
return true
endif
if ( CountUnitsInGroup( udg_Battallion[battallionIndex] ) == udg_BattalionSize[IsCaptain(GetUnitTypeId( captain ))] +1 ) then
return true
else
return false
endif
endfunction
// ********************************************************************
// checks if AI attack group units are close enough
function CloseTogether takes group batalion, location waypoint returns boolean
local real Xpos
local real Ypos
local real minX = 100000.0
local real minY = 100000.0
local real maxX = -100000.0
local real maxY = -100000.0
local unit wanderer
local unit enemy
local group tempgroup = CreateGroup()
local group enemies = CreateGroup()
local boolean nearbyenemies = false
local boolean close = true
call GroupAddGroup(batalion,tempgroup)
loop
set wanderer = FirstOfGroup(tempgroup)
exitwhen wanderer == null
if ( GetUnitX(wanderer) < minX ) then
set minX = GetUnitX(wanderer)
endif
if ( GetUnitY(wanderer) < minY ) then
set minY = GetUnitY(wanderer)
endif
if ( GetUnitX(wanderer) > maxX ) then
set maxX = GetUnitX(wanderer)
endif
if ( GetUnitY(wanderer) > maxY ) then
set maxY = GetUnitY(wanderer)
endif
call GroupRemoveUnit( tempgroup, wanderer )
endloop
call GroupAddGroup(batalion,tempgroup)
loop
set wanderer = FirstOfGroup(tempgroup)
exitwhen wanderer == null
set Xpos = GetUnitX(wanderer) - GetLocationX(waypoint)
set Ypos = GetUnitY(wanderer) - GetLocationY(waypoint)
if ( SquareRoot( Xpos*Xpos + Ypos*Ypos ) >= 200 + 100*CountUnitsInGroup( batalion ) ) then
set close = false
set udg_AI_PlayerNumber = GetConvertedPlayerId( GetOwningPlayer(wanderer) )
call GroupEnumUnitsInRange( enemies, GetUnitX(wanderer), GetUnitY(wanderer), 1000.0, Condition(function EnemyTroops))
if ( CountUnitsInGroup( enemies ) > 0 ) then
set nearbyenemies = true
set enemy = GroupPickRandomUnit(enemies)
call GroupPointOrder( batalion, "attack", GetUnitX(enemy), GetUnitY(enemy))
endif
endif
call GroupRemoveUnit( tempgroup, wanderer )
endloop
if not ( nearbyenemies ) then
call GroupPointOrderLoc( batalion, "attack", waypoint )
endif
set wanderer = null
call DestroyGroup(tempgroup)
set tempgroup = null
return close
endfunction
function IsEnemyTownhall takes nothing returns boolean
return ( IsUnitType(GetFilterUnit(), UNIT_TYPE_TOWNHALL) == true and IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()), udg_AI_Player_Copy) == true and IsUnitAliveBJ(GetFilterUnit()) == true )
endfunction
function IsTower takes nothing returns boolean
return GetUnitTypeId(GetFilterUnit()) == 'h003' or GetUnitTypeId(GetFilterUnit()) == 'n011' or GetUnitTypeId(GetFilterUnit()) == 'n007' or GetUnitTypeId(GetFilterUnit()) == 'h00S'
endfunction
// ********************************************************************
// calculates strength of a group of units for AI purposes
// returns a very subjective coefficent representing strength
function OverallStrength takes group units returns integer
local unit tempunit
local integer strength = 0
local group tempgroup = CreateGroup()
call GroupAddGroup(units, tempgroup)
loop
set tempunit = FirstOfGroup(tempgroup)
call GroupRemoveUnit(tempgroup, tempunit)
exitwhen tempunit == null
if ( LoadInteger(udg_hashtable, GetHandleId(tempunit), 1) == 1) then
set strength = strength + CountUnitsInGroup( udg_Battallion[LoadInteger(udg_hashtable, GetHandleId(tempunit), 0)]) * GetUnitLevel(tempunit)
else
set strength = strength + GetUnitLevel(tempunit)
endif
endloop
call DestroyGroup(tempgroup)
set tempgroup = null
return strength
endfunction
// ********************************************************************
// sets the AI's next target
// returns the nearest enemy hall with beatable strength
function MinDistanceHall takes unit origin, real strength returns unit
local group halls = CreateGroup()
local group tempgroup = CreateGroup()
local integer playernumber = GetConvertedPlayerId( GetOwningPlayer(origin))
local integer enemies
local integer allies
local unit hall = null
local unit tempunit
local real Xpos
local real Ypos
local real distance = 10000000.00
set udg_AI_Player_Copy = GetOwningPlayer(origin)
set udg_AI_PlayerNumber = playernumber
call GroupEnumUnitsInRect( halls, GetPlayableMapRect(), Condition(function IsEnemyTownhall) )
loop
set tempunit = FirstOfGroup(halls)
call GroupRemoveUnit(halls,tempunit)
call GroupEnumUnitsInRange(tempgroup, GetUnitX(tempunit), GetUnitY(tempunit), 1000., Condition(function EnemyTroops))
set enemies = OverallStrength( tempgroup )
call GroupEnumUnitsInRange(tempgroup, GetUnitX(tempunit), GetUnitY(tempunit), 1000., Condition(function IsTower))
set enemies = enemies + 5*CountUnitsInGroup(tempgroup)
set allies = OverallStrength(udg_AI_AttackGroup[playernumber])
exitwhen tempunit == null
set Xpos = GetUnitX(tempunit) - GetUnitX(origin)
set Ypos = GetUnitY(tempunit) - GetUnitY(origin)
if ( SquareRoot(Xpos*Xpos + Ypos*Ypos) < distance ) then
set distance = SquareRoot(Xpos*Xpos + Ypos*Ypos)
set hall = tempunit
endif
endloop
call DestroyGroup(halls)
call DestroyGroup(tempgroup)
set halls = null
set tempgroup = null
return hall
endfunction
function EnumBuildings takes nothing returns boolean
return ( IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == true and GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) > 0 )
endfunction
function Training takes nothing returns boolean
return ( GetOwningPlayer( GetFilterUnit()) == udg_AI_Player_Copy and not IsUnitInGroup( GetFilterUnit(), udg_AI_TrainingBuildings ) )
endfunction
// ********************************************************************
// executes build command for AI
function Build takes integer building, unit hall, integer number returns nothing
local group townbuildings
local group buildingtype
local real angle = GetRandomReal(0, 2*bj_PI)
local real x = GetUnitX(hall) + 600.0 * Cos(angle)
local real y = GetUnitY(hall) + 600.0 * Sin(angle)
local real Xpos
local real Ypos
local integer inrange
local integer filteredunits
local integer builder
local player owner = GetOwningPlayer( hall )
if ( udg_check == true or GetUnitState(hall, UNIT_STATE_LIFE) <= 0 ) then
return
endif
set townbuildings = CreateGroup()
call GroupEnumUnitsInRange( townbuildings, GetUnitX( hall ), GetUnitY( hall ), 1000.00, Condition(function EnumBuildings))
set inrange = CountUnitsInGroup( townbuildings )
set buildingtype = GetUnitsOfPlayerAndTypeId(udg_AI_Player_Copy,building)
call GroupRemoveGroup( buildingtype, townbuildings)
set filteredunits = CountUnitsInGroup( townbuildings )
if ( inrange - filteredunits >= number) then //stevilo zgradb zraven - stevilo zgradb zraven brez tega tipa
call DestroyGroup( townbuildings )
call DestroyGroup( buildingtype )
else
set bj_lastCreatedUnit = CreateUnit( udg_AI_Player_Copy, building, x, y, bj_UNIT_FACING)
set Xpos = GetUnitX(bj_lastCreatedUnit)
set Ypos = GetUnitX(bj_lastCreatedUnit)
set Xpos = Xpos - x
set Ypos = Ypos - y
call RemoveUnit(bj_lastCreatedUnit)
if ( GetPlayerRace(owner) == RACE_HUMAN ) then
set builder = 'e00B'
elseif ( GetPlayerRace(owner) == RACE_ORC ) then
set builder = 'e00E'
elseif ( GetPlayerRace(owner) == RACE_UNDEAD ) then
set builder = 'e00C'
elseif ( GetPlayerRace(owner) == RACE_NIGHTELF ) then
set builder = 'e00D'
endif
set bj_lastCreatedUnit = CreateUnit( udg_AI_Player_Copy, builder, x, y, bj_UNIT_FACING)
call IssueBuildOrderById( bj_lastCreatedUnit, building, x, y )
call DestroyGroup( townbuildings )
call DestroyGroup( buildingtype )
set townbuildings = null
set buildingtype = null
set udg_check = true
endif
endfunction
// ********************************************************************
// executes train command for AI
function Train takes integer men, integer factory, integer number returns nothing
local group tempgroup = GetUnitsOfPlayerAndTypeId(udg_AI_Player_Copy,men)
local unit factory1
local integer alive = CountUnitsInGroup( tempgroup )
local integer training = LoadIntegerBJ(GetConvertedPlayerId(udg_AI_Player_Copy), men, udg_hashtable)
if ( udg_check == true ) then
return
endif
call DestroyGroup( tempgroup )
set tempgroup = GetUnitsOfPlayerAndTypeId(udg_AI_Player_Copy,factory)
call GroupRemoveGroup( udg_AI_TrainingBuildings, tempgroup )
if (alive + training >= number) then
call DestroyGroup( tempgroup )
else
set factory1 = GroupPickRandomUnit( tempgroup )
call IssueTrainOrderByIdBJ( factory1, men )
call DestroyGroup( tempgroup )
set tempgroup = null
set udg_check = true
endif
endfunction
function UnitDead takes nothing returns boolean
return (IsUnitDeadBJ(GetFilterUnit()) == true)
endfunction
function HideUnits takes nothing returns nothing
call SetUnitOwner( GetEnumUnit(), ConvertedPlayer( GetConvertedPlayerId(GetOwningPlayer(GetEnumUnit())) + udg_TranslatePlayerNumber ), false )
endfunction
function ShowUnits takes nothing returns nothing
call SetUnitOwner( GetEnumUnit(), ConvertedPlayer( GetConvertedPlayerId(GetOwningPlayer(GetEnumUnit())) - udg_TranslatePlayerNumber ), true )
endfunction
// ********************************************************************
// creates attack group for AI
// returns whether the listed units are avalaible
function Assemble takes integer playernumber, integer first, integer second, integer third, integer fourth, integer fifth, integer sixth, integer seventh, integer eighth returns boolean
local integer i = 0
local integer array unittypes
local integer array races
local group tempgroup = CreateGroup()
local group deadunits = GetUnitsOfPlayerMatching(ConvertedPlayer(playernumber), Condition(function UnitDead) )
local group oftypes
set unittypes[0] = first
set unittypes[1] = second
set unittypes[2] = third
set unittypes[3] = fourth
set unittypes[4] = fifth
set unittypes[5] = sixth
set unittypes[6] = seventh
set unittypes[7] = eighth
if ( GetPlayerRace(Player(playernumber-1)) == RACE_HUMAN ) then
set races[0] = udg_AI_HumanUnits[0]
set races[1] = udg_AI_HumanUnits[1]
set races[2] = udg_AI_HumanUnits[2]
set races[3] = udg_AI_HumanUnits[3]
set races[4] = udg_AI_HumanUnits[4]
set races[5] = udg_AI_HumanUnits[5]
set races[6] = udg_AI_HumanUnits[6]
set races[7] = udg_AI_HumanUnits[7]
elseif ( GetPlayerRace(Player(playernumber-1)) == RACE_ORC ) then
set races[0] = udg_AI_VampireUnits[0]
set races[1] = udg_AI_VampireUnits[1]
set races[2] = udg_AI_VampireUnits[2]
set races[3] = udg_AI_VampireUnits[3]
set races[4] = udg_AI_VampireUnits[4]
set races[5] = udg_AI_VampireUnits[5]
set races[6] = udg_AI_VampireUnits[6]
set races[7] = udg_AI_VampireUnits[7]
elseif ( GetPlayerRace(Player(playernumber-1)) == RACE_UNDEAD ) then
set races[0] = udg_AI_DrowUnits[0]
set races[1] = udg_AI_DrowUnits[1]
set races[2] = udg_AI_DrowUnits[2]
set races[3] = udg_AI_DrowUnits[3]
set races[4] = udg_AI_DrowUnits[4]
set races[5] = udg_AI_DrowUnits[5]
set races[6] = udg_AI_DrowUnits[6]
set races[7] = udg_AI_DrowUnits[7]
elseif ( GetPlayerRace(Player(playernumber-1)) == RACE_NIGHTELF ) then
set races[0] = udg_AI_ElfUnits[0]
set races[1] = udg_AI_ElfUnits[1]
set races[2] = udg_AI_ElfUnits[2]
set races[3] = udg_AI_ElfUnits[3]
set races[4] = udg_AI_ElfUnits[4]
set races[5] = udg_AI_ElfUnits[5]
set races[6] = udg_AI_ElfUnits[6]
set races[7] = udg_AI_ElfUnits[7]
endif
call GroupClear( udg_AI_AttackGroup[playernumber] )
call ForGroup( deadunits, function HideUnits )
loop
exitwhen ( i > 7 )
set oftypes = GetUnitsOfPlayerAndTypeId( ConvertedPlayer(playernumber), races[i] )
set tempgroup = GetRandomSubGroup( unittypes[i], oftypes )
if ( CountUnitsInGroup( tempgroup ) >= unittypes[i] ) then
call GroupAddGroup( tempgroup, udg_AI_AttackGroup[playernumber] )
call GroupRemoveGroup( tempgroup, udg_AI_Defenders[playernumber] )
else
call GroupAddGroup( udg_AI_AttackGroup[playernumber], udg_AI_Defenders[playernumber] )
return false
endif
set i = i + 1
endloop
call ForGroup( deadunits, function ShowUnits )
//call BJDebugMsg("gathering troops")
call DestroyGroup(tempgroup)
call DestroyGroup(deadunits)
call DestroyGroup(oftypes)
return true
endfunction
function GetOrderAbility takes integer batalionOrder, integer caster returns integer
local integer i = 1
loop
exitwhen i == 30
if ( batalionOrder == udg_BattalionSpellOrderID[i] and caster == udg_BattalionSpellCaster[i] ) then
return i
endif
set i = i + 1
endloop
return 0
endfunction
function GetBatalionAbility takes integer batalionSpell returns integer
local integer i = 1
loop
exitwhen i == 30
if ( batalionSpell == udg_BattalionSpellAbility[i] ) then
return i
endif
set i = i + 1
endloop
return 0
endfunction
Name | Type | is_array | initial_value |
AI_AttackDestination | location | Yes | |
AI_AttackGroup | group | Yes | |
AI_Captain | unit | Yes | |
AI_Defenders | group | Yes | |
AI_DefendingGroup | group | Yes | |
AI_DrowUnits | unitcode | Yes | |
AI_Dummy | unit | Yes | |
AI_ElfUnits | unitcode | Yes | |
AI_Factory | unit | No | |
AI_Hero | group | Yes | |
AI_HumanUnits | unitcode | Yes | |
AI_Movement | group | Yes | |
AI_Player | player | Yes | |
AI_Player_Copy | player | No | |
AI_PlayerNumber | integer | No | 2 |
AI_ProductionBuilding | unitcode | Yes | |
AI_TooStrong | group | Yes | |
AI_Townhall | unit | Yes | |
AI_TownHall | location | Yes | |
AI_TrainingBuildings | group | No | |
AI_VampireUnits | unitcode | Yes | |
AI_Wave | integer | Yes | |
AI_Waypoints | location | Yes | |
AllUnits | group | No | |
Ang_WingedWitches_Copy | quest | No | |
angle | real | No | |
Arden | unit | No | |
BatalionHash_Beast | integer | No | 9 |
BatalionHash_Crew | integer | No | 8 |
BatalionHash_Guards | integer | No | 6 |
BatalionHash_Order | integer | No | 2 |
BatalionHash_Summonable | integer | No | 7 |
BatalionHash_TargetUnit | integer | No | 5 |
BatalionHash_TargetX | integer | No | 3 |
BatalionHash_TargetY | integer | No | 4 |
BattalionCaptain | unitcode | Yes | |
BattalionGoldCost | integer | Yes | |
BattalionManaCost | real | Yes | |
BattalionPowerCost | integer | Yes | |
BattalionSize | integer | Yes | |
BattalionSpellAbility | abilcode | Yes | |
BattalionSpellCaster | unitcode | Yes | |
BattalionSpellOrderID | integer | Yes | |
BattalionSpellOrderString | string | Yes | |
BattalionTimer | real | Yes | |
BattalionTroop | unitcode | Yes | |
Battallion | group | Yes | |
BattallionCount | integer | No | |
BattallionIndex | integer | No | |
BattallionLimit | integer | No | 200 |
BattallionQueued | group | No | |
BattallionRegroup | real | No | 600.00 |
BlinkStrike | real | No | |
Build_Birth | group | No | |
Build_Hall | unit | Yes | |
Build_HallType | unitcode | Yes | |
Build_Players | force | No | |
Build_Structure | unitcode | Yes | |
Build_TreeType | unitcode | Yes | |
Build_WaitTimer | timer | Yes | |
BuildDB_Avalaible | abilcode | Yes | |
BuildDB_Builders | unitcode | Yes | |
BuildDB_Buildings | unitcode | Yes | |
BuildDB_Cost | integer | Yes | |
BuildDB_Item | abilcode | Yes | |
BuildDB_Limit | integer | Yes | |
BuildDB_Requirements | unitcode | Yes | |
BuildDB_Unavalaible | abilcode | Yes | |
caster | unit | No | |
check | boolean | No | |
CurrentCamera | camerasetup | No | |
DialogBox | dialog | Yes | |
DialogButtons | button | Yes | |
DummyBuilder | unitcode | No | |
EssenceofUnlifeHealth | real | No | |
FakeUnits | group | No | |
FanofKnivesGroup | group | No | |
flyingheight | real | Yes | |
FoK_hashtable | hashtable | No | |
handle | integer | No | |
hashtable | hashtable | No | |
Message | integer | No | |
NrTypes | integer | No | 80 |
ownerplayer | player | No | |
Players | force | No | |
point1 | location | No | |
point2 | location | No | |
point3 | location | No | |
RZ_EssenceAmount | integer | Yes | |
Selected1 | group | Yes | |
Status | integer | Yes | |
Summon | integer | No | 6 |
target | unit | No | |
TempCommander | unit | No | |
TempGroiup | group | No | |
TempHero | unit | No | |
Tempint | integer | No | |
TempLoc00 | location | No | |
TempLoc01 | location | No | |
TempLoc02 | location | No | |
Tempplayer | player | No | |
TempPoint | location | No | |
Temppoint | location | No | |
Temppoint01 | location | No | |
TempRealX | real | No | |
Tempunit | unit | No | |
testint | integer | No | |
timer | real | No | |
tolerateddistance | real | No | 100.00 |
TranslatePlayerNumber | integer | No | 5 |
Unittype | unitcode | No |
//TESH.scrollpos=18
//TESH.alwaysfold=0
function Selection takes nothing returns boolean
return ( IsUnitSelected(GetFilterUnit(), GetOwningPlayer(GetOrderedUnit())) == true )
endfunction
function Trig_Move_to_point_Compy_Conditions takes nothing returns boolean
if ( IsUnitType(GetOrderedUnit(), UNIT_TYPE_STRUCTURE) == false ) then
if ( GetIssuedOrderId() == 851971 or GetIssuedOrderId() == 851986 or GetIssuedOrderId() == 851983 ) then
//call BJDebugMsg(OrderId2String( GetIssuedOrderId() ))
return true
endif
endif
return false
endfunction
function Trig_Move_to_point_Compy_Actions takes nothing returns nothing
local real orderX = GetOrderPointX()
local real orderY = GetOrderPointY()
local integer order = GetIssuedOrderId()
local integer counter = 0
local integer counter1 = 0
local integer counter2 = 0
local integer index
local integer min
local real Xpos
local real Ypos
local real XposUnit
local real YposUnit
local real minX = 100000.0
local real minY = 100000.0
local real maxX = -100000.0
local real maxY = -100000.0
local real angle
local unit wanderer
local unit array units
local unit array swap
local group tempgroup = CreateGroup()
if ( GetPlayerController(GetOwningPlayer(GetOrderedUnit())) == MAP_CONTROL_USER ) then
set tempgroup = GetUnitsOfPlayerMatching(GetOwningPlayer(GetOrderedUnit()), Condition(function Selection))
endif
if ( IsUnitGroupEmptyBJ(udg_AI_Movement[GetConvertedPlayerId(GetOwningPlayer(GetOrderedUnit()))]) == false ) then
call GroupAddGroup( udg_AI_Movement[GetConvertedPlayerId(GetOwningPlayer(GetOrderedUnit()))], tempgroup)
endif
if ( CountUnitsInGroup(tempgroup) < 2 ) then
call DestroyGroup(tempgroup)
call GroupClear(udg_AI_Movement[GetConvertedPlayerId(GetOwningPlayer(GetOrderedUnit()))])
call EnableTrigger( GetTriggeringTrigger() )
return
endif
loop
set wanderer = FirstOfGroup(tempgroup)
exitwhen wanderer == null
if ( GetUnitX(wanderer) < minX ) then
set minX = GetUnitX(wanderer)
endif
if ( GetUnitY(wanderer) < minY ) then
set minY = GetUnitY(wanderer)
endif
if ( GetUnitX(wanderer) > maxX ) then
set maxX = GetUnitX(wanderer)
endif
if ( GetUnitY(wanderer) > maxY ) then
set maxY = GetUnitY(wanderer)
endif
call GroupRemoveUnit( tempgroup, wanderer )
set Xpos = minX + (maxX - minX )/2
set Ypos = minY + (maxY - minY )/2
endloop
if ( GetPlayerController(GetOwningPlayer(GetOrderedUnit())) == MAP_CONTROL_USER ) then
set tempgroup = GetUnitsOfPlayerMatching(GetOwningPlayer(GetOrderedUnit()), Condition(function Selection))
endif
if ( IsUnitGroupEmptyBJ(udg_AI_Movement[GetConvertedPlayerId(GetOwningPlayer(GetOrderedUnit()))]) == false ) then
call GroupAddGroup( udg_AI_Movement[GetConvertedPlayerId(GetOwningPlayer(GetOrderedUnit()))], tempgroup)
endif
call GroupClear(udg_AI_Movement[GetConvertedPlayerId(GetOwningPlayer(GetOrderedUnit()))])
loop
set wanderer = FirstOfGroup(tempgroup)
exitwhen wanderer == null
set units[counter] = wanderer
call GroupRemoveUnit( tempgroup, wanderer )
set counter = counter + 1
endloop
if not (minX <= orderX and orderX <= maxX and minY <= orderY and orderY <= maxY) or GetPlayerController(GetOwningPlayer(GetOrderedUnit())) == MAP_CONTROL_COMPUTER then
set angle = Atan2(orderY - Ypos, orderX - Xpos)
//call BJDebugMsg(I2S(counter))
//sort of
//call BJDebugMsg("start sorting")
loop
exitwhen counter1 >= counter
set counter2 = counter1
set index = counter1
set min = GetUnitPointValue( units[counter1] )
loop
exitwhen counter2 >= counter
if GetUnitPointValue( units[counter2] ) < min then
set min = GetUnitPointValue( units[counter2] )
set index = counter2
endif
//call BJDebugMsg("counting")
set counter2 = counter2 + 1
endloop
//call BJDebugMsg("preswap")
//call BJDebugMsg(I2S(GetUnitPointValue( units[0] )))
set wanderer = units[index]
//call BJDebugMsg(I2S(GetUnitPointValue( wanderer )))
//set units[index] = null
set units[index] = units[counter1]
//set units[counter1] = null
set units[counter1] = wanderer
set counter1 = counter1 + 1
// call BJDebugMsg("swap")
//call BJDebugMsg(I2S(GetUnitPointValue( units[0] )))
endloop
//if ( RAbsBJ(Sin(Deg2Rad(GetUnitFacing( FirstOfGroup(tempgroup)))) - Sin(angle)) > 1 ) then
// call BJDebugMsg(R2S(RAbsBJ(Deg2Rad(GetUnitFacing( FirstOfGroup(tempgroup))))))
// call BJDebugMsg("switching")
// set tempgroup = InvertGroup( tempgroup )
//endif
if (counter == 2 ) then
call DisableTrigger( GetTriggeringTrigger() )
call TriggerWaitForSound(null, 0)
set wanderer = units[0]
set XposUnit = orderX + 000.0*(Cos(angle)) + 150.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY + 000.0*(Sin(angle)) + 150.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[1]
set XposUnit = orderX + 000.0*(Cos(angle)) + 150.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY + 000.0*(Sin(angle)) + 150.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call EnableTrigger( GetTriggeringTrigger() )
elseif (counter == 4 ) then
call DisableTrigger( GetTriggeringTrigger() )
call TriggerWaitForSound(null, 0)
set wanderer = units[0]
set XposUnit = orderX + 100.0*(Cos(angle)) + 150.0*(Cos(angle -3.14159265/2))
set YposUnit = orderY + 100.0*(Sin(angle)) + 150.0*(Sin(angle -3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[1]
set XposUnit = orderX + 100.0*(Cos(angle)) + 150.0*(Cos(angle+ 3.14159265/2))
set YposUnit = orderY + 100.0*(Sin(angle)) + 150.0*(Sin(angle+ 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[2]
set XposUnit = orderX - 100.0*(Cos(angle)) + 150.0*(Cos(angle -3.14159265/2))
set YposUnit = orderY - 100.0*(Sin(angle)) + 150.0*(Sin(angle -3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[3]
set XposUnit = orderX - 100.0*(Cos(angle)) + 150.0*(Cos(angle+ 3.14159265/2))
set YposUnit = orderY - 100.0*(Sin(angle)) + 150.0*(Sin(angle+ 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call EnableTrigger( GetTriggeringTrigger() )
elseif (counter == 3 ) then
call DisableTrigger( GetTriggeringTrigger() )
call TriggerWaitForSound(null, 0)
set wanderer = units[0]
set XposUnit = orderX + 100.0*(Cos(angle)) + 150.0*(Cos(angle+ -3.14159265/2))
set YposUnit = orderY + 100.0*(Sin(angle)) + 150.0*(Sin(angle+ -3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[1]
set XposUnit = orderX + 100.0*(Cos(angle)) + 150.0*(Cos(angle+ 3.14159265/2))
set YposUnit = orderY + 100.0*(Sin(angle)) + 150.0*(Sin(angle+ 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[2]
set XposUnit = orderX - 100.0*(Cos(angle))
set YposUnit = orderY - 100.0*(Sin(angle))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call EnableTrigger( GetTriggeringTrigger() )
elseif (counter == 5 ) then
call DisableTrigger( GetTriggeringTrigger() )
call TriggerWaitForSound(null, 0)
set wanderer = units[0]
set XposUnit = orderX + 100.0*(Cos(angle)) + 300.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY + 100.0*(Sin(angle)) + 300.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[1]
set XposUnit = orderX + 100.0*(Cos(angle))
set YposUnit = orderY + 100.0*(Sin(angle))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[2]
set XposUnit = orderX + 100.0*(Cos(angle)) + 300.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY + 100.0*(Sin(angle)) + 300.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[3]
set XposUnit = orderX - 100.0*(Cos(angle)) + 150.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY - 100.0*(Sin(angle)) + 150.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[4]
set XposUnit = orderX - 100.0*(Cos(angle)) + 150.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY - 100.0*(Sin(angle)) + 150.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call EnableTrigger( GetTriggeringTrigger() )
elseif (counter == 6 ) then
call DisableTrigger( GetTriggeringTrigger() )
call TriggerWaitForSound(null, 0)
set wanderer = units[0]
set XposUnit = orderX + 100.0*(Cos(angle)) + 300.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY + 100.0*(Sin(angle)) + 200.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[1]
set XposUnit = orderX + 100.0*(Cos(angle))
set YposUnit = orderY + 100.0*(Sin(angle))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[2]
set XposUnit = orderX + 100.0*(Cos(angle)) + 300.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY + 100.0*(Sin(angle)) + 300.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[3]
set XposUnit = orderX - 100.0*(Cos(angle)) + 300.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY - 100.0*(Sin(angle)) + 300.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[4]
set XposUnit = orderX - 100.0*(Cos(angle))
set YposUnit = orderY - 100.0*(Sin(angle))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[5]
set XposUnit = orderX - 100.0*(Cos(angle)) + 300.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY - 100.0*(Sin(angle)) + 300.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call EnableTrigger( GetTriggeringTrigger() )
elseif (counter == 7 ) then
call DisableTrigger( GetTriggeringTrigger() )
call TriggerWaitForSound(null, 0)
set wanderer = units[0]
set XposUnit = orderX + 200.0*(Cos(angle)) + 300.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY + 200.0*(Sin(angle)) + 300.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[1]
set XposUnit = orderX + 200.0*(Cos(angle))
set YposUnit = orderY + 200.0*(Sin(angle))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[2]
set XposUnit = orderX + 100.0*(Cos(angle)) + 300.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY + 100.0*(Sin(angle)) + 300.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[3]
set XposUnit = orderX - 00.0*(Cos(angle)) + 300.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY - 00.0*(Sin(angle)) + 300.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[4]
set XposUnit = orderX - 00.0*(Cos(angle))
set YposUnit = orderY - 00.0*(Sin(angle))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[5]
set XposUnit = orderX - 00.0*(Cos(angle)) + 300.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY - 00.0*(Sin(angle)) + 300.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[6]
set XposUnit = orderX - 200.0*(Cos(angle))
set YposUnit = orderY - 200.0*(Sin(angle))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call EnableTrigger( GetTriggeringTrigger() )
elseif (counter == 8 ) then
call DisableTrigger( GetTriggeringTrigger() )
call TriggerWaitForSound(null, 0)
set wanderer = units[0]
set XposUnit = orderX + 200.0*(Cos(angle)) + 300.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY + 200.0*(Sin(angle)) + 300.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[1]
set XposUnit = orderX + 200.0*(Cos(angle))
set YposUnit = orderY + 200.0*(Sin(angle))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[2]
set XposUnit = orderX + 200.0*(Cos(angle)) + 300.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY + 200.0*(Sin(angle)) + 300.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[3]
set XposUnit = orderX - 00.0*(Cos(angle)) + 300.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY - 00.0*(Sin(angle)) + 300.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[4]
set XposUnit = orderX - 00.0*(Cos(angle))
set YposUnit = orderY - 00.0*(Sin(angle))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[5]
set XposUnit = orderX - 00.0*(Cos(angle)) + 300.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY - 00.0*(Sin(angle)) + 300.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[6]
set XposUnit = orderX - 200.0*(Cos(angle)) + 150.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY - 200.0*(Sin(angle)) + 150.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[7]
set XposUnit = orderX - 200.0*(Cos(angle)) + 150.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY - 200.0*(Sin(angle)) + 150.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call EnableTrigger( GetTriggeringTrigger() )
elseif (counter == 9 ) then
call DisableTrigger( GetTriggeringTrigger() )
call TriggerWaitForSound(null, 0)
set wanderer = units[0]
set XposUnit = orderX + 200.0*(Cos(angle)) + 300.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY + 200.0*(Sin(angle)) + 300.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[1]
set XposUnit = orderX + 200.0*(Cos(angle))
set YposUnit = orderY + 200.0*(Sin(angle))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[2]
set XposUnit = orderX + 200.0*(Cos(angle)) + 300.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY + 200.0*(Sin(angle)) + 300.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[3]
set XposUnit = orderX - 00.0*(Cos(angle)) + 300.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY - 00.0*(Sin(angle)) + 300.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[4]
set XposUnit = orderX - 00.0*(Cos(angle))
set YposUnit = orderY - 00.0*(Sin(angle))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[5]
set XposUnit = orderX - 00.0*(Cos(angle)) + 300.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY - 00.0*(Sin(angle)) + 300.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[6]
set XposUnit = orderX - 200.0*(Cos(angle)) + 300.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY - 200.0*(Sin(angle)) + 300.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[7]
set XposUnit = orderX - 200.0*(Cos(angle))
set YposUnit = orderY - 200.0*(Sin(angle))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[8]
set XposUnit = orderX - 200.0*(Cos(angle)) + 300.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY - 200.0*(Sin(angle)) + 300.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call EnableTrigger( GetTriggeringTrigger() )
elseif (counter == 10 ) then
call DisableTrigger( GetTriggeringTrigger() )
call TriggerWaitForSound(null, 0)
set wanderer = units[0]
set XposUnit = orderX + 200.0*(Cos(angle)) + 450.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY + 200.0*(Sin(angle)) + 450.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[1]
set XposUnit = orderX + 200.0*(Cos(angle)) + 150.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY + 200.0*(Sin(angle)) + 150.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[2]
set XposUnit = orderX + 200.0*(Cos(angle)) + 150.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY + 200.0*(Sin(angle)) + 150.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[3]
set XposUnit = orderX + 200.0*(Cos(angle)) + 450.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY + 200.0*(Sin(angle)) + 450.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[4]
set XposUnit = orderX - 00.0*(Cos(angle)) + 450.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY - 00.0*(Sin(angle)) + 450.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[5]
set XposUnit = orderX - 00.0*(Cos(angle)) + 150.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY - 00.0*(Sin(angle)) + 150.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[6]
set XposUnit = orderX - 00.0*(Cos(angle)) + 150.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY - 00.0*(Sin(angle)) + 150.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[7]
set XposUnit = orderX - 00.0*(Cos(angle)) + 450.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY - 00.0*(Sin(angle)) + 450.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[8]
set XposUnit = orderX - 200.0*(Cos(angle)) + 150.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY - 200.0*(Sin(angle)) + 150.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[9]
set XposUnit = orderX - 200.0*(Cos(angle)) + 150.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY - 200.0*(Sin(angle)) + 150.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call EnableTrigger( GetTriggeringTrigger() )
elseif (counter == 11 ) then
call DisableTrigger( GetTriggeringTrigger() )
call TriggerWaitForSound(null, 0)
set wanderer = units[0]
set XposUnit = orderX + 200.0*(Cos(angle)) + 450.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY + 200.0*(Sin(angle)) + 450.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[1]
set XposUnit = orderX + 200.0*(Cos(angle)) + 150.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY + 200.0*(Sin(angle)) + 150.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[2]
set XposUnit = orderX + 200.0*(Cos(angle)) + 150.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY + 200.0*(Sin(angle)) + 150.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[3]
set XposUnit = orderX + 200.0*(Cos(angle)) + 450.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY + 200.0*(Sin(angle)) + 450.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[4]
set XposUnit = orderX - 00.0*(Cos(angle)) + 450.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY - 00.0*(Sin(angle)) + 450.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[5]
set XposUnit = orderX - 00.0*(Cos(angle)) + 150.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY - 00.0*(Sin(angle)) + 150.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[6]
set XposUnit = orderX - 00.0*(Cos(angle)) + 150.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY - 00.0*(Sin(angle)) + 150.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[7]
set XposUnit = orderX - 00.0*(Cos(angle)) + 450.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY - 00.0*(Sin(angle)) + 450.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[8]
set XposUnit = orderX - 200.0*(Cos(angle)) + 300.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY - 200.0*(Sin(angle)) + 300.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[9]
set XposUnit = orderX - 200.0*(Cos(angle))
set YposUnit = orderY - 200.0*(Sin(angle))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[10]
set XposUnit = orderX - 200.0*(Cos(angle)) + 300.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY - 200.0*(Sin(angle)) + 300.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call EnableTrigger( GetTriggeringTrigger() )
elseif (counter == 12 ) then
call DisableTrigger( GetTriggeringTrigger() )
call TriggerWaitForSound(null, 0)
set wanderer = units[0]
set XposUnit = orderX + 200.0*(Cos(angle)) + 450.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY + 200.0*(Sin(angle)) + 450.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[1]
set XposUnit = orderX + 200.0*(Cos(angle)) + 150.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY + 200.0*(Sin(angle)) + 150.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[2]
set XposUnit = orderX + 200.0*(Cos(angle)) + 150.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY + 200.0*(Sin(angle)) + 150.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[3]
set XposUnit = orderX + 200.0*(Cos(angle)) + 450.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY + 200.0*(Sin(angle)) + 450.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[4]
set XposUnit = orderX - 00.0*(Cos(angle)) + 450.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY - 00.0*(Sin(angle)) + 450.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[5]
set XposUnit = orderX - 00.0*(Cos(angle)) + 150.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY - 00.0*(Sin(angle)) + 100.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[6]
set XposUnit = orderX - 00.0*(Cos(angle)) + 150.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY - 00.0*(Sin(angle)) + 150.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[7]
set XposUnit = orderX - 00.0*(Cos(angle)) + 450.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY - 00.0*(Sin(angle)) + 450.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[8]
set XposUnit = orderX - 200.0*(Cos(angle)) + 450.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY - 200.0*(Sin(angle)) + 450.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[9]
set XposUnit = orderX - 200.0*(Cos(angle)) + 150.0*(Cos(angle - 3.14159265/2))
set YposUnit = orderY - 200.0*(Sin(angle)) + 150.0*(Sin(angle - 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[10]
set XposUnit = orderX - 200.0*(Cos(angle)) + 150.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY - 200.0*(Sin(angle)) + 150.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call TriggerWaitForSound(null, 0)
set wanderer = units[11]
set XposUnit = orderX - 200.0*(Cos(angle)) + 450.0*(Cos(angle + 3.14159265/2))
set YposUnit = orderY - 200.0*(Sin(angle)) + 450.0*(Sin(angle + 3.14159265/2))
call IssuePointOrderById( wanderer, order, XposUnit, YposUnit )
call EnableTrigger( GetTriggeringTrigger() )
endif
endif
set wanderer = null
//call GroupClear(udg_AI_Movement[GetConvertedPlayerId(GetOwningPlayer(GetOrderedUnit()))])
call DestroyGroup(tempgroup)
endfunction
//===========================================================================
function InitTrig_Move_to_point_Compy takes nothing returns nothing
set gg_trg_Move_to_point_Compy = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Move_to_point_Compy, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER )
call TriggerAddCondition( gg_trg_Move_to_point_Compy, Condition(function Trig_Move_to_point_Compy_Conditions) )
call TriggerAddAction( gg_trg_Move_to_point_Compy, function Trig_Move_to_point_Compy_Actions )
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_Regroup_Actions takes nothing returns nothing
local real Xpos
local real Ypos
local integer order
local integer i = 1
local unit wanderer
local unit commander
local unit target
local group batalion = CreateGroup()
loop
exitwhen i > udg_BattallionCount
if ( not ( IsUnitGroupEmptyBJ( udg_Battallion[i] ) ) ) then
set commander = GetCaptain(udg_Battallion[i])
call GroupAddGroup( udg_Battallion[i], batalion )
loop
set wanderer = FirstOfGroup(batalion)
exitwhen (wanderer == null)
set Xpos = GetUnitX(wanderer) - GetUnitX(commander)
set Ypos = GetUnitY(wanderer) - GetUnitY(commander)
if ( SquareRoot( Xpos*Xpos + Ypos*Ypos ) >= udg_BattallionRegroup and not (IsUnitInGroup(wanderer, udg_BattallionQueued ) ) ) then
set udg_Tempunit = wanderer
set udg_TempCommander = commander
call IssuePointOrder( wanderer, "move", GetUnitX(commander), GetUnitY(commander) )
call TriggerExecute( gg_trg_Regroup_wait )
endif
call GroupRemoveUnit(batalion, wanderer)
set wanderer = null
endloop
call GroupClear( batalion )
set commander = null
endif
set i = i + 1
endloop
//call DestroyGroup( batalion )
endfunction
//===========================================================================
function InitTrig_Regroup takes nothing returns nothing
set gg_trg_Regroup = CreateTrigger( )
call TriggerRegisterTimerEventPeriodic( gg_trg_Regroup, 2.0)
call TriggerAddAction( gg_trg_Regroup, function Trig_Regroup_Actions )
endfunction
//TESH.scrollpos=4
//TESH.alwaysfold=0
function Trig_Regroup_wait_Actions takes nothing returns nothing
local unit wanderer = udg_Tempunit
local unit commander = udg_TempCommander
local unit target
local real Xpos
local real Ypos
local integer order
local integer battallionIndex = LoadInteger(udg_hashtable, GetHandleId(commander), 0)
call IssuePointOrder( wanderer, "move", GetUnitX(commander), GetUnitY(commander) )
call GroupAddUnit( udg_BattallionQueued, wanderer )
loop
set commander = GetCaptain( udg_Battallion[battallionIndex] )
set Xpos = GetUnitX(wanderer) - GetUnitX(commander)
set Ypos = GetUnitY(wanderer) - GetUnitY(commander)
exitwhen ( SquareRoot( Xpos*Xpos + Ypos*Ypos ) <= 150 or IsUnitDeadBJ( wanderer ) or IsUnitDeadBJ( commander ) )
call IssuePointOrder(wanderer, "move", GetUnitX(commander), GetUnitY(commander) )
call TriggerSleepAction( 0.5 )
endloop
set Xpos = LoadReal( udg_hashtable, GetHandleId(commander) , udg_BatalionHash_TargetX)
set Ypos = LoadReal( udg_hashtable, GetHandleId(commander) , udg_BatalionHash_TargetY)
set order = LoadInteger( udg_hashtable, GetHandleId(commander), udg_BatalionHash_Order )
set target = LoadUnitHandle( udg_hashtable, GetHandleId(commander), udg_BatalionHash_TargetUnit )
if ( order != 0 and GetUnitCurrentOrder(commander) != String2OrderIdBJ("") ) then
if ( target == null ) then
//call BJDebugMsg("pointing")
call IssuePointOrderById(wanderer, order, Xpos, Ypos )
else
//call BJDebugMsg("acquiring")
call IssueTargetOrderById(wanderer, order, target )
endif
endif
set target = null
call GroupRemoveUnit( udg_BattallionQueued, wanderer )
endfunction
//===========================================================================
function InitTrig_Regroup_wait takes nothing returns nothing
set gg_trg_Regroup_wait = CreateTrigger( )
call TriggerAddAction( gg_trg_Regroup_wait, function Trig_Regroup_wait_Actions )
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_Battalion_reinforce_Conditions takes nothing returns boolean
if ( GetSpellAbilityId() == 'A002' and LoadInteger(udg_hashtable, GetHandleId(GetSpellTargetUnit()), 1) == 1 and LoadInteger(udg_hashtable, GetHandleId(GetSpellTargetUnit()), udg_Summon) == 0 and IsUnitType(GetSpellAbilityUnit(), UNIT_TYPE_STRUCTURE) == true) then
return true
else
return false
endif
endfunction
function Trig_Battalion_reinforce_Actions takes nothing returns nothing
local integer captain = IsCaptain(GetUnitTypeId(GetSpellTargetUnit()))
local integer battallionIndex = LoadInteger(udg_hashtable, GetHandleId(GetSpellTargetUnit()), 0)
local integer size = CountUnitsInGroup(udg_Battallion[battallionIndex])
local location temppoint1 = GetUnitLoc(GetSpellTargetUnit())
local unit reinforcedUnit = GetSpellTargetUnit()
loop
exitwhen size > udg_BattalionSize[captain]
if ( GetPlayerState(GetOwningPlayer(reinforcedUnit), PLAYER_STATE_RESOURCE_GOLD) >= udg_BattalionGoldCost[captain] and GetPlayerState(GetOwningPlayer(reinforcedUnit), PLAYER_STATE_RESOURCE_LUMBER) >= udg_BattalionPowerCost[captain] ) then
//call BJDebugMsg("reinforcing")
call SetPlayerState(GetOwningPlayer(reinforcedUnit), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(GetOwningPlayer(reinforcedUnit), PLAYER_STATE_RESOURCE_GOLD) - udg_BattalionGoldCost[captain])
call SetPlayerState(GetOwningPlayer(reinforcedUnit), PLAYER_STATE_RESOURCE_LUMBER, GetPlayerState(GetOwningPlayer(reinforcedUnit), PLAYER_STATE_RESOURCE_LUMBER) - udg_BattalionPowerCost[captain])
set bj_lastCreatedUnit = CreateUnitAtLoc(ConvertedPlayer( GetConvertedPlayerId(GetOwningPlayer(reinforcedUnit)) + udg_TranslatePlayerNumber ), udg_BattalionTroop[captain], temppoint1, bj_UNIT_FACING)
call SetUnitColor( GetLastCreatedUnit(), GetPlayerColor(GetOwningPlayer(reinforcedUnit)) )
call GroupAddUnit( udg_Battallion[battallionIndex], GetLastCreatedUnit() )
call SaveInteger( udg_hashtable, GetHandleId(GetLastCreatedUnit()), 0, battallionIndex )
call RemoveGuardPosition( GetLastCreatedUnit() )
call IssueTargetOrder( GetLastCreatedUnit(), "move", reinforcedUnit )
else
call DisplayTextToForce( GetForceOfPlayer(GetOwningPlayer(GetSpellTargetUnit())), "Not enough resources" )
call RemoveLocation(temppoint1)
return
endif
set size = size + 1
endloop
call RemoveLocation(temppoint1)
set reinforcedUnit = null
endfunction
//===========================================================================
function InitTrig_Battalion_reinforce takes nothing returns nothing
set gg_trg_Battalion_reinforce = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Battalion_reinforce, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Battalion_reinforce, Condition( function Trig_Battalion_reinforce_Conditions ) )
call TriggerAddAction( gg_trg_Battalion_reinforce, function Trig_Battalion_reinforce_Actions )
endfunction
//TESH.scrollpos=21
//TESH.alwaysfold=0
function Trig_Battalion_train_Conditions takes nothing returns boolean
if ( IsCaptain(GetUnitTypeId(GetTrainedUnit())) > 0 ) then
set udg_Tempunit = GetTrainedUnit()
return true
endif
return false
endfunction
function Trig_Battalion_train_Actions takes nothing returns nothing
local unit trigger_unit = udg_Tempunit
local integer captain = IsCaptain(GetUnitTypeId(trigger_unit))
local integer batallionIndex = 1
local integer size = 1
local boolean found = false
local location temppoint1 = GetUnitLoc(trigger_unit)
local location temppoint2
loop
exitwhen batallionIndex > 8911 or found == true
if ( IsUnitGroupEmptyBJ(udg_Battallion[batallionIndex]) == true ) then
call GroupAddUnit( udg_Battallion[batallionIndex], trigger_unit )
call SaveInteger( udg_hashtable, GetHandleId(trigger_unit), 0, batallionIndex )
call SaveInteger( udg_hashtable, GetHandleId(trigger_unit), 1, 1 )
// Drider
//if ( udg_Status[captain] > udg_BatalionHash_Guards ) then
// call SaveInteger( udg_hashtable, GetHandleId(trigger_unit), udg_Summon, udg_BatalionHash_Guards )
//endif
// Machinery
//if ( udg_Status[captain] == udg_BatalionHash_Crew ) then
// call SaveInteger( udg_hashtable, GetHandleId(trigger_unit), udg_Summon, udg_BatalionHash_Crew )
//endif
if ( udg_Status[captain] > 0 ) then
call SaveInteger( udg_hashtable, GetHandleId(trigger_unit), udg_Summon, udg_Status[captain] )
endif
loop
exitwhen size > udg_BattalionSize[captain] or udg_Status[captain] == udg_BatalionHash_Guards
set temppoint2 = PolarProjectionBJ(temppoint1, GetRandomReal(0, 50.00), GetRandomDirectionDeg() )
set bj_lastCreatedUnit = CreateUnitAtLoc(ConvertedPlayer( GetConvertedPlayerId(GetOwningPlayer(trigger_unit)) + udg_TranslatePlayerNumber ), udg_BattalionTroop[captain], temppoint2, bj_UNIT_FACING)
call SetUnitColor( GetLastCreatedUnit(), GetPlayerColor(GetOwningPlayer(trigger_unit)) )
call SaveInteger( udg_hashtable, GetHandleId(GetLastCreatedUnit()), 0, batallionIndex )
call GroupAddUnit( udg_Battallion[batallionIndex], GetLastCreatedUnit() )
call RemoveGuardPosition( GetLastCreatedUnit() )
//call IssueTargetOrder( GetLastCreatedUnit(), "move", GetTrainedUnit() )
// Machinery
if ( udg_Status[captain] == udg_BatalionHash_Crew ) then
call UnitRemoveAbility( GetLastCreatedUnit(), 'A01A' )
endif
//if ( udg_Status[captain] == udg_BatalionHash_Summonable ) then
// call SaveInteger( udg_hashtable, GetHandleId(GetLastCreatedUnit()), udg_Summon, udg_BatalionHash_Summonable )
// call UnitApplyTimedLife( GetLastCreatedUnit(), 'BTLF', 20 )
//endif
if ( udg_Status[captain] > 0 ) then
call SaveInteger( udg_hashtable, GetHandleId(GetLastCreatedUnit()), udg_Summon, udg_Status[captain] )
if ( udg_Status[captain] == udg_BatalionHash_Summonable ) then
call UnitApplyTimedLife( GetLastCreatedUnit(), 'BTLF', 20 )
endif
endif
set size = size + 1
endloop
set found = true
endif
set batallionIndex = batallionIndex + 1
endloop
set udg_BattallionCount = udg_BattallionCount + 1
call RemoveLocation(temppoint1)
call RemoveLocation(temppoint2)
endfunction
//===========================================================================
function InitTrig_Battalion_train takes nothing returns nothing
set gg_trg_Battalion_train = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Battalion_train, EVENT_PLAYER_UNIT_TRAIN_FINISH )
call TriggerAddCondition( gg_trg_Battalion_train, Condition( function Trig_Battalion_train_Conditions ) )
call TriggerAddAction( gg_trg_Battalion_train, function Trig_Battalion_train_Actions )
endfunction
//TESH.scrollpos=9
//TESH.alwaysfold=0
function Trig_UnLoad_Conditions takes nothing returns boolean
if ( IsCaptain(GetUnitTypeId(GetTriggerUnit())) > 0 ) then
return true
else
return false
endif
return false
endfunction
function UnitHide takes nothing returns nothing
if ( GetEnumUnit() != GetLoadedUnit() ) then
call ShowUnit(GetEnumUnit(), false)
endif
endfunction
function UnitShow takes nothing returns nothing
if ( GetEnumUnit() != GetLoadedUnit() ) then
call ShowUnit(GetEnumUnit(), true)
call SetUnitPosition( GetEnumUnit(), GetUnitX(GetLoadedUnit()), GetUnitY(GetLoadedUnit()) )
endif
endfunction
function Trig_UnLoad_Actions takes nothing returns nothing
local integer battallionIndex = LoadInteger(udg_hashtable, GetHandleId(GetLoadedUnit()), 0)
call ForGroup( udg_Battallion[battallionIndex] , function UnitHide )
loop
exitwhen ( IsUnitInTransport(GetTriggerUnit(), GetTransportUnit()) == false )
call TriggerSleepAction( 0.5 )
endloop
call ForGroup( udg_Battallion[battallionIndex] , function UnitShow )
endfunction
//===========================================================================
function InitTrig_UnLoad takes nothing returns nothing
set gg_trg_UnLoad = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_UnLoad, EVENT_PLAYER_UNIT_LOADED )
call TriggerAddCondition( gg_trg_UnLoad, Condition( function Trig_UnLoad_Conditions ) )
call TriggerAddAction( gg_trg_UnLoad, function Trig_UnLoad_Actions )
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_Battalion_order_target_Conditions takes nothing returns boolean
if ( LoadInteger(udg_hashtable, GetHandleId(GetOrderedUnit()), 1) == 1 and LoadInteger(udg_hashtable, GetHandleIdBJ(GetOrderedUnit()), udg_Summon) != 2) then
return true
else
return false
endif
endfunction
function Trig_Battalion_order_target_Actions takes nothing returns nothing
local unit orderunit = GetOrderedUnit()
local unit target = GetOrderTargetUnit()
local integer generalOrder = GetIssuedOrderId()
local integer BattallionIndex = LoadInteger(udg_hashtable, GetHandleId(GetOrderedUnit()), 0)
//call DisableTrigger( GetTriggeringTrigger() )
call GroupRemoveUnit( udg_Battallion[BattallionIndex], orderunit )
call SaveInteger( udg_hashtable, GetHandleId(orderunit), udg_BatalionHash_Order, generalOrder )
call SaveUnitHandle( udg_hashtable, GetHandleId(GetOrderedUnit()), udg_BatalionHash_TargetUnit, GetOrderTargetUnit() )
call SaveReal( udg_hashtable, GetHandleId(orderunit), udg_BatalionHash_TargetX, 0 )
call SaveReal( udg_hashtable, GetHandleId(orderunit), udg_BatalionHash_TargetY, 0 )
if ( GetOrderAbility( generalOrder, GetUnitTypeId(orderunit) ) > 0 ) then
call GroupTargetOrder( udg_Battallion[BattallionIndex], "move", orderunit)
else
call GroupTargetOrderById( udg_Battallion[BattallionIndex], generalOrder, target)
endif
call GroupAddUnit( udg_Battallion[BattallionIndex], orderunit )
set target = null
set orderunit = null
//call EnableTrigger( GetTriggeringTrigger() )
endfunction
//===========================================================================
function InitTrig_Battalion_order_target takes nothing returns nothing
set gg_trg_Battalion_order_target = CreateTrigger( )
//call DisableTrigger( gg_trg_Battalion_order_target )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Battalion_order_target, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER )
call TriggerAddCondition( gg_trg_Battalion_order_target, Condition( function Trig_Battalion_order_target_Conditions ) )
call TriggerAddAction( gg_trg_Battalion_order_target, function Trig_Battalion_order_target_Actions )
endfunction
//TESH.scrollpos=21
//TESH.alwaysfold=0
function Trig_Battalion_order_no_target_Conditions takes nothing returns boolean
if ( LoadInteger(udg_hashtable, GetHandleIdBJ(GetOrderedUnit()), 1) == 1 and LoadInteger(udg_hashtable, GetHandleIdBJ(GetOrderedUnit()), udg_Summon) != 2 and IsUnitAliveBJ( GetOrderedUnit() ) ) then
return true
else
return false
endif
endfunction
function AddAbility takes nothing returns nothing
call UnitAddAbility(GetEnumUnit(), udg_BattalionSpellAbility[GetOrderAbility(GetIssuedOrderId(), GetUnitTypeId(GetOrderedUnit()))])
endfunction
function RemoveAbility takes nothing returns nothing
call UnitRemoveAbility(GetEnumUnit(), udg_BattalionSpellAbility[GetOrderAbility(GetIssuedOrderId(), GetUnitTypeId(GetOrderedUnit()))])
endfunction
function Trig_Battalion_order_no_target_Actions takes nothing returns nothing
local integer generalOrder = GetIssuedOrderId()
local unit orderunit = GetOrderedUnit()
local integer BattallionIndex = LoadInteger(udg_hashtable, GetHandleId(GetOrderedUnit()), 0)
//call DisableTrigger( GetTriggeringTrigger() )
//call BJDebugMsg("call stop")
call GroupRemoveUnit( udg_Battallion[BattallionIndex], orderunit )
if ( GetOrderAbility( generalOrder, GetUnitTypeId(orderunit) ) > 0 ) then
call ForGroup( udg_Battallion[BattallionIndex], function AddAbility )
//call BJDebugMsg(I2S( GetOrderAbility( generalOrder, GetUnitTypeId(orderunit) ) ))
//call BJDebugMsg(I2S( generalOrder ) )
endif
call GroupImmediateOrderById( udg_Battallion[BattallionIndex], generalOrder)
call SaveReal( udg_hashtable, GetHandleId(orderunit), udg_BatalionHash_TargetX, 0 )
call SaveReal( udg_hashtable, GetHandleId(orderunit), udg_BatalionHash_TargetY, 0 )
call RemoveSavedHandle( udg_hashtable, GetHandleId(orderunit), udg_BatalionHash_TargetUnit)
call TriggerSleepAction( 0.27 )
if ( GetIssuedOrderId() == String2OrderIdBJ("stop") and GetUnitCurrentOrder(GetOrderedUnit()) == String2OrderIdBJ("") ) then
call SaveInteger(udg_hashtable, GetHandleId(orderunit), udg_BatalionHash_Order, 0 )
endif
if ( GetOrderAbility( generalOrder, GetUnitTypeId(orderunit) ) > 0 ) then
call ForGroup( udg_Battallion[BattallionIndex], function RemoveAbility )
call IssueImmediateOrder(orderunit, "stop")
endif
call GroupAddUnit( udg_Battallion[BattallionIndex], orderunit )
set orderunit = null
//call EnableTrigger( GetTriggeringTrigger() )
endfunction
//===========================================================================
function InitTrig_Battalion_order_no_target takes nothing returns nothing
set gg_trg_Battalion_order_no_target = CreateTrigger( )
//call DisableTrigger( gg_trg_Battalion_order_no_target )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Battalion_order_no_target, EVENT_PLAYER_UNIT_ISSUED_ORDER )
call TriggerAddCondition( gg_trg_Battalion_order_no_target, Condition( function Trig_Battalion_order_no_target_Conditions ) )
call TriggerAddAction( gg_trg_Battalion_order_no_target, function Trig_Battalion_order_no_target_Actions )
endfunction
//TESH.scrollpos=11
//TESH.alwaysfold=0
function Trig_Battalion_order_point_Conditions takes nothing returns boolean
if ( LoadInteger(udg_hashtable, GetHandleId(GetOrderedUnit()), 1) == 1 and LoadInteger(udg_hashtable, GetHandleId(GetOrderedUnit()), udg_Summon) != 2) then
return true
else
return false
endif
endfunction
function Trig_Battalion_order_point_Actions takes nothing returns nothing
local real Xmove = GetOrderPointX()
local real Ymove = GetOrderPointY()
local integer generalOrder = GetIssuedOrderId()
local unit orderunit = GetOrderedUnit()
local integer BattallionIndex = LoadInteger(udg_hashtable, GetHandleId(GetOrderedUnit()), 0)
call DisableTrigger( GetTriggeringTrigger() )
call SaveInteger( udg_hashtable, GetHandleId(orderunit), udg_BatalionHash_Order, generalOrder )
call SaveReal( udg_hashtable, GetHandleId(orderunit), udg_BatalionHash_TargetX, Xmove )
call SaveReal( udg_hashtable, GetHandleId(orderunit), udg_BatalionHash_TargetY, Ymove )
call RemoveSavedHandle( udg_hashtable, GetHandleId(orderunit), udg_BatalionHash_TargetUnit)
if ( GetOrderAbility( generalOrder, GetUnitTypeId(orderunit) ) > 0 ) then
call GroupRemoveUnit( udg_Battallion[BattallionIndex], orderunit )
call GroupTargetOrder( udg_Battallion[BattallionIndex], "move", orderunit)
call GroupAddUnit( udg_Battallion[BattallionIndex], orderunit )
else
call GroupPointOrderById( udg_Battallion[BattallionIndex ], generalOrder, Xmove, Ymove)
endif
set orderunit = null
call EnableTrigger( GetTriggeringTrigger() )
endfunction
//===========================================================================
function InitTrig_Battalion_order_point takes nothing returns nothing
set gg_trg_Battalion_order_point = CreateTrigger( )
//call DisableTrigger( gg_trg_Battalion_order_point )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Battalion_order_point, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER )
call TriggerAddCondition( gg_trg_Battalion_order_point, Condition( function Trig_Battalion_order_point_Conditions ) )
call TriggerAddAction( gg_trg_Battalion_order_point, function Trig_Battalion_order_point_Actions )
endfunction
//TESH.scrollpos=48
//TESH.alwaysfold=0
function Trig_Battalion_death_Ctrl_Conditions takes nothing returns boolean
local integer status = LoadInteger(udg_hashtable, GetHandleId(GetDyingUnit()), udg_Summon)
if ( status == udg_BatalionHash_Crew or status == udg_BatalionHash_Beast ) then
return false
else
return true
endif
endfunction
function KillAll takes nothing returns nothing
call KillUnit( GetEnumUnit() )
endfunction
function Trig_Battalion_death_Ctrl_Actions takes nothing returns nothing
local integer battallionIndex = LoadInteger(udg_hashtable, GetHandleId(GetDyingUnit()), 0)
local integer tempint
local real Xpos
local real Ypos
local boolean noOrder = false
local unit tempunit = GetDyingUnit()
local unit tempcommander
local location temppoint1
local location temppoint2
local location temppoint3
// Final death
if ( CountUnitsInGroup(udg_Battallion[battallionIndex]) == 1 and battallionIndex > 0 ) then
call GroupClear( udg_Battallion[battallionIndex])
return
endif
// Drider
if ( LoadInteger(udg_hashtable, GetHandleId(GetDyingUnit()), udg_Summon ) == udg_BatalionHash_Guards ) then
call ForGroupBJ( udg_Battallion[battallionIndex], function KillAll )
return
endif
// Common troop
if ( LoadInteger(udg_hashtable, GetHandleId(GetDyingUnit()), 1 ) != 1 ) then
call GroupRemoveUnit( udg_Battallion[battallionIndex], GetDyingUnit())
return
else
call GroupRemoveUnit( udg_Battallion[battallionIndex], GetDyingUnit())
//if ( LoadInteger(udg_hashtable, GetHandleId(GetDyingUnit()), udg_Summon ) == udg_BatalionHash_Summonable ) then
// set tempunit = GroupPickRandomUnit(udg_Battallion[battallionIndex])
// call ReplaceUnitBJ( udg_Tempunit, GetUnitTypeId(GetDyingUnit()), bj_UNIT_STATE_METHOD_RELATIVE )
// call SetUnitOwner( tempunit, GetOwningPlayer(GetDyingUnit()), true )
// call
endif
set tempunit = GroupPickRandomUnit(udg_Battallion[battallionIndex])
if ( GetUnitCurrentOrder(tempunit) == String2OrderIdBJ("") ) then
//call BJDebugMsg("no order")
set noOrder = true
endif
call GroupAddUnit( udg_Battallion[battallionIndex], GetDyingUnit())
set tempcommander = GetDyingUnit()
set temppoint1 = GetUnitLoc(GetDyingUnit())
set temppoint2 = GetUnitLoc(tempunit)
set temppoint3 = GetRectCenter(GetPlayableMapRect())
call DisableTrigger( GetTriggeringTrigger() )
call DisableTrigger( gg_trg_Battalion_order_no_target )
// dummy
set bj_lastCreatedUnit = CreateUnitAtLoc(GetOwningPlayer(GetDyingUnit()), 'e001', temppoint1, bj_UNIT_FACING)
call IssueImmediateOrder( bj_lastCreatedUnit, "resurrection" )
call RemoveUnit( bj_lastCreatedUnit )
// swap units
call SetUnitPositionLoc( tempunit, temppoint3 )
call SetUnitPositionLoc( GetDyingUnit(), temppoint2 )
call SetUnitPositionLoc( tempunit, temppoint1 )
// kill unit and remove from group
call ReplaceUnitBJ( tempunit, GetUnitTypeId(GetDyingUnit()), bj_UNIT_STATE_METHOD_MAXIMUM )
set tempunit = GetLastReplacedUnitBJ()
call SetUnitOwner( tempunit, GetOwningPlayer(GetDyingUnit()), true )
call KillUnit( tempunit )
call GroupRemoveUnit( udg_Battallion[battallionIndex], tempunit )
// reselect
if ( IsUnitInGroup(GetDyingUnit(), udg_Selected1[GetConvertedPlayerId(GetOwningPlayer(GetDyingUnit()))]) == true ) then
call SelectUnitAddForPlayer( GetDyingUnit(), GetOwningPlayer(GetDyingUnit()) )
endif
call EnableTrigger( gg_trg_Battalion_order_no_target )
// pass order
set Xpos = LoadReal( udg_hashtable, GetHandleId(tempcommander) , udg_BatalionHash_TargetX )
set Ypos = LoadReal( udg_hashtable, GetHandleId(tempcommander) , udg_BatalionHash_TargetY )
set tempint = LoadInteger( udg_hashtable, GetHandleId(tempcommander), udg_BatalionHash_Order )
set tempunit = LoadUnitHandle( udg_hashtable, GetHandleId(tempcommander), udg_BatalionHash_TargetUnit )
if ( tempint != 0 and not (noOrder) ) then
if ( Xpos == 0 and Ypos == 0 ) then
call IssueTargetOrderById(tempcommander, tempint, tempunit )
else
call IssuePointOrderById(tempcommander, tempint, Xpos, Ypos )
endif
endif
call RemoveLocation(temppoint1)
call RemoveLocation(temppoint2)
call RemoveLocation(temppoint3)
// prevent moving
if ( GetPlayerController(GetOwningPlayer(GetDyingUnit())) == MAP_CONTROL_COMPUTER ) then
call RemoveGuardPosition( tempcommander )
endif
set tempunit = null
set tempcommander = null
call EnableTrigger( GetTriggeringTrigger() )
endfunction
//===========================================================================
function InitTrig_Battalion_death_Ctrl takes nothing returns nothing
set gg_trg_Battalion_death_Ctrl = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Battalion_death_Ctrl, EVENT_PLAYER_UNIT_DEATH )
call TriggerAddCondition( gg_trg_Battalion_death_Ctrl, Condition( function Trig_Battalion_death_Ctrl_Conditions ) )
call TriggerAddAction( gg_trg_Battalion_death_Ctrl, function Trig_Battalion_death_Ctrl_Actions )
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_Battalion_death_Ctrl_Crew_Conditions takes nothing returns boolean
local integer status = LoadInteger(udg_hashtable, GetHandleId(GetDyingUnit()), udg_Summon)
//call BJDebugMsg(I2S(status))
if ( status == udg_BatalionHash_Crew or status == udg_BatalionHash_Beast ) then
return true
else
return false
endif
endfunction
function NeutralCannon takes nothing returns nothing
local integer status = LoadInteger(udg_hashtable, GetHandleId(GetDyingUnit()), udg_Summon)
//call UnitAddAbility( GetEnumUnit(), 'A01A' )
//call UnitAddAbilityBJ( 'A01A', GetEnumUnit() )
if ( status == udg_BatalionHash_Crew ) then
call SetUnitOwner( GetEnumUnit(), Player(PLAYER_NEUTRAL_PASSIVE), true )
elseif ( status == udg_BatalionHash_Beast ) then
call SetUnitOwner( GetEnumUnit(), Player(PLAYER_NEUTRAL_AGGRESSIVE), true )
endif
//call BJDebugMsg("neutral cannon")
endfunction
function FreeCrew takes nothing returns nothing
local integer battallionIndex = LoadInteger(udg_hashtable, GetHandleId(GetDyingUnit()), 0)
call SetUnitOwner( GetEnumUnit(), GetOwningPlayer(GetDyingUnit()), false )
call UnitAddAbility( GetEnumUnit(), 'A01A' )
call GroupRemoveUnit( udg_Battallion[battallionIndex], GetEnumUnit() )
//call BJDebugMsg("free crew")
endfunction
function Trig_Battalion_death_Ctrl_Crew_Actions takes nothing returns nothing
local integer battallionIndex = LoadInteger(udg_hashtable, GetHandleId(GetDyingUnit()), 0)
if ( LoadIntegerBJ(1, GetHandleIdBJ(GetDyingUnit()), udg_hashtable) == 1 ) then //cannon destroyed
call ForGroup( udg_Battallion[battallionIndex], function FreeCrew )
call GroupClear( udg_Battallion[battallionIndex] )
else //crew killed
call GroupRemoveUnit( udg_Battallion[battallionIndex], GetDyingUnit() )
if ( CountUnitsInGroup(udg_Battallion[battallionIndex]) == 1 ) then
call ForGroup( udg_Battallion[battallionIndex], function NeutralCannon )
else
endif
endif
//call BJDebugMsg("unit died")
endfunction
//===========================================================================
function InitTrig_Battalion_death_Ctrl_Crew takes nothing returns nothing
set gg_trg_Battalion_death_Ctrl_Crew = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Battalion_death_Ctrl_Crew, EVENT_PLAYER_UNIT_DEATH )
call TriggerAddCondition( gg_trg_Battalion_death_Ctrl_Crew, Condition( function Trig_Battalion_death_Ctrl_Crew_Conditions ) )
call TriggerAddAction( gg_trg_Battalion_death_Ctrl_Crew, function Trig_Battalion_death_Ctrl_Crew_Actions )
endfunction
//TESH.scrollpos=2
//TESH.alwaysfold=0
function ArtilleryType takes nothing returns boolean
local integer status = LoadInteger(udg_hashtable, GetHandleId(GetFilterUnit()), udg_Summon )
return (status == udg_BatalionHash_Crew or status == udg_BatalionHash_Beast) and LoadInteger(udg_hashtable, GetHandleId(GetFilterUnit()), 1 ) == 1
endfunction
function Trig_Crew_regroup_Actions takes nothing returns nothing
local integer batallionIndex
local group cannons = CreateGroup()
local unit tempunit
local location dest
call GroupEnumUnitsInRect(cannons, GetPlayableMapRect(), Filter(function ArtilleryType) )
loop
set tempunit = FirstOfGroup(cannons)
exitwhen (tempunit == null)
set batallionIndex = LoadInteger(udg_hashtable, GetHandleId(tempunit), 0)
set dest = GetUnitLoc(tempunit)
if ( GetUnitCurrentOrder(tempunit) != String2OrderIdBJ("") ) then
//call BJDebugMsg("Crew moving")
call GroupRemoveUnit( udg_Battallion[batallionIndex], tempunit )
call GroupPointOrderLoc( udg_Battallion[batallionIndex], "move", dest )
call GroupAddUnit( udg_Battallion[batallionIndex], tempunit )
call RemoveLocation(dest)
endif
call GroupRemoveUnit(cannons, tempunit)
endloop
call DestroyGroup(cannons)
endfunction
//===========================================================================
function InitTrig_Crew_regroup takes nothing returns nothing
set gg_trg_Crew_regroup = CreateTrigger( )
call TriggerRegisterTimerEventPeriodic( gg_trg_Crew_regroup, 1.00 )
call TriggerAddAction( gg_trg_Crew_regroup, function Trig_Crew_regroup_Actions )
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_Battalion_spells_Conditions takes nothing returns boolean
local integer battallionIndex
if ( LoadInteger(udg_hashtable, GetHandleId(GetSpellTargetUnit()), 0) > 0 and GetBatalionAbility(GetSpellAbilityId()) > 0) then
return true
else
return false
endif
endfunction
function CastSpell takes nothing returns nothing
local unit dummy
local integer abilityIndex = GetBatalionAbility(udg_Tempint)
//call BJDebugMsg(I2S(GetSpellAbilityId()))
set dummy = CreateUnit( GetOwningPlayer(GetTriggerUnit()), 'h60H', GetUnitX(GetEnumUnit()), GetUnitY(GetEnumUnit()), bj_UNIT_FACING)
call IssueTargetOrderById( dummy, udg_BattalionSpellOrderID[abilityIndex], GetEnumUnit() )
call UnitApplyTimedLife( dummy, 'BTLF', 1.00 )
set dummy = null
endfunction
function Trig_Battalion_spells_Actions takes nothing returns nothing
local integer battallionIndexTarget = LoadInteger(udg_hashtable, GetHandleId(GetSpellTargetUnit()), 0)
local integer battallionIndexCaster = LoadInteger(udg_hashtable, GetHandleId(GetTriggerUnit()), 0)
set udg_Tempint = GetSpellAbilityId()
call GroupRemoveUnit( udg_Battallion[battallionIndexCaster], GetTriggerUnit() )
call GroupTargetOrder( udg_Battallion[battallionIndexCaster], "smart", GetTriggerUnit() )
call GroupAddUnit( udg_Battallion[battallionIndexCaster], GetTriggerUnit() )
call DisableTrigger( GetTriggeringTrigger() )
call ForGroup( udg_Battallion[battallionIndexTarget], function CastSpell )
call EnableTrigger( GetTriggeringTrigger() )
endfunction
//===========================================================================
function InitTrig_Battalion_spells takes nothing returns nothing
set gg_trg_Battalion_spells = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Battalion_spells, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Battalion_spells, Condition( function Trig_Battalion_spells_Conditions ) )
call TriggerAddAction( gg_trg_Battalion_spells, function Trig_Battalion_spells_Actions )
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_Untitled_Trigger_003_Actions takes nothing returns nothing
call Cheat("warpten")
call Cheat("greedisgood 20000")
call Cheat("whosyourdaddy")
call Cheat("iseedeadpeople")
endfunction
//===========================================================================
function InitTrig_Cheats takes nothing returns nothing
set gg_trg_Cheats = CreateTrigger( )
call TriggerRegisterTimerEventSingle( gg_trg_Cheats, 1.00 )
call TriggerAddAction( gg_trg_Cheats, function Trig_Untitled_Trigger_003_Actions )
endfunction
//TESH.scrollpos=15
//TESH.alwaysfold=0
function Trig_BuildTrain_P1_Actions takes nothing returns nothing
local integer elysium = 'u005'
local integer kabal = 'u003'
local integer murder = 'u004'
local integer arcanum = 'u002'
local integer altar = 'u001'
local integer slave = 'h00N'
local integer blade = 'h012'
local integer havoc = 'h605'
local integer witch = 'h013'
local integer rider = 'n00H'
local integer warpfire = 'e006'
local integer beholder = 'u006'
local integer sorceror = 'E007'
set udg_AI_Player_Copy = Player(0)
set udg_check = false
call Build( kabal, udg_AI_Townhall[GetConvertedPlayerId(udg_AI_Player_Copy)], 1)
call Train( slave, elysium, 5)
call Train( blade, kabal, 1)
call Build( murder, udg_AI_Townhall[GetConvertedPlayerId(udg_AI_Player_Copy)], 1)
call Train( blade, kabal, 2)
call Build( arcanum, udg_AI_Townhall[GetConvertedPlayerId(udg_AI_Player_Copy)], 1)
call Train( havoc, kabal, 1)
call Train( witch, murder, 1)
call Train( havoc, kabal, 2)
endfunction
//===========================================================================
function InitTrig_BuildTrain_P1 takes nothing returns nothing
set gg_trg_BuildTrain_P1 = CreateTrigger( )
call TriggerRegisterTimerEventPeriodic( gg_trg_BuildTrain_P1, 3.00 )
call TriggerAddAction( gg_trg_BuildTrain_P1, function Trig_BuildTrain_P1_Actions )
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Trig_BuildTrain_P2_Actions takes nothing returns nothing
local integer sanctum = 'h608'
local integer crypt = 'u600'
local integer mausoleum = 'h606'
local integer black = 'h60D'
local integer reanimated = 'h60E'
local integer warrior = 'u605'
local integer archer = 'u007'
local integer bat = 'n60D'
local integer bride = 'h607'
local integer immortal = 'n60G'
local integer catapult = 'n61J'
local integer lord = 'H60A'
set udg_AI_Player_Copy = Player(1)
set udg_check = false
call Build( crypt, udg_AI_Townhall[GetConvertedPlayerId(udg_AI_Player_Copy)], 1)
call Train( reanimated, sanctum, 5)
call Train( warrior, crypt, 1)
call Build( mausoleum, udg_AI_Townhall[GetConvertedPlayerId(udg_AI_Player_Copy)], 1)
call Train( warrior, crypt, 2)
call Train( lord, sanctum, 1)
call Train( bride, mausoleum, 1)
call Build( black, udg_AI_Townhall[GetConvertedPlayerId(udg_AI_Player_Copy)], 1)
call Train( archer, crypt, 2)
call Train( bride, mausoleum, 2)
call Train( catapult, black, 1)
call Train( bat, crypt, 1)
call Train( immortal, mausoleum, 2)
call Train( catapult, black, 2)
call Train( immortal, mausoleum, 3)
call Train( bride, mausoleum, 2)
endfunction
//===========================================================================
function InitTrig_BuildTrain_P2 takes nothing returns nothing
set gg_trg_BuildTrain_P2 = CreateTrigger( )
call TriggerRegisterTimerEventPeriodic( gg_trg_BuildTrain_P2, 3.00 )
call TriggerAddAction( gg_trg_BuildTrain_P2, function Trig_BuildTrain_P2_Actions )
endfunction
//TESH.scrollpos=5
//TESH.alwaysfold=0
function Trig_BuildTrain_P3_Actions takes nothing returns nothing
local integer elysium = 'u005'
local integer kabal = 'u003'
local integer cages = 'u004'
local integer arcanum = 'u002'
local integer altar = 'u001'
local integer slave = 'h00N'
local integer reaper = 'h605'
local integer witch = 'h013'
local integer rider = 'n00H'
local integer warpfire = 'e006'
local integer assassin = 'h012'
local integer lord = 'E008'
local integer archon = 'E007'
set udg_AI_Player_Copy = Player(2)
set udg_check = false
call Build( kabal, udg_AI_Townhall[GetConvertedPlayerId(udg_AI_Player_Copy)], 1)
call Train( slave, elysium, 5)
call Train( reaper, kabal, 1)
call Build( cages, udg_AI_Townhall[GetConvertedPlayerId(udg_AI_Player_Copy)], 1)
call Train( reaper, kabal, 2)
call Build( arcanum, udg_AI_Townhall[GetConvertedPlayerId(udg_AI_Player_Copy)], 1)
call Train( rider, kabal, 1)
call Train( witch, cages, 1)
call Train( rider, kabal, 2)
endfunction
//===========================================================================
function InitTrig_BuildTrain_P3 takes nothing returns nothing
set gg_trg_BuildTrain_P3 = CreateTrigger( )
call TriggerRegisterTimerEventPeriodic( gg_trg_BuildTrain_P3, 3.00 )
call TriggerAddAction( gg_trg_BuildTrain_P3, function Trig_BuildTrain_P3_Actions )
endfunction
//TESH.scrollpos=15
//TESH.alwaysfold=0
function Trig_BuildTrain_P4_Actions takes nothing returns nothing
local integer elysium = 'u005'
local integer kabal = 'u003'
local integer cages = 'u004'
local integer arcanum = 'u002'
local integer altar = 'u001'
local integer slave = 'h00N'
local integer reaper = 'h605'
local integer witch = 'h013'
local integer rider = 'n00H'
local integer warpfire = 'e006'
local integer assassin = 'h012'
local integer lord = 'E008'
local integer archon = 'E007'
set udg_AI_Player_Copy = Player(3)
set udg_check = false
call Build( kabal, udg_AI_Townhall[GetConvertedPlayerId(udg_AI_Player_Copy)], 1)
call Train( slave, elysium, 5)
call Train( reaper, kabal, 1)
call Train( rider, kabal, 1)
call Train( rider, kabal, 2)
call Build( cages, udg_AI_Townhall[GetConvertedPlayerId(udg_AI_Player_Copy)], 1)
call Train( archon, elysium, 1)
call Train( rider, kabal, 3)
call Build( arcanum, udg_AI_Townhall[GetConvertedPlayerId(udg_AI_Player_Copy)], 1)
call Train( reaper, kabal, 2)
call Build( altar, udg_AI_Townhall[GetConvertedPlayerId(udg_AI_Player_Copy)], 1)
call Train( witch, cages, 1)
call Train( assassin, kabal, 1)
call Train( witch, cages, 2)
call Train( assassin, kabal, 2)
call Train( warpfire, arcanum, 1)
endfunction
//===========================================================================
function InitTrig_BuildTrain_P4 takes nothing returns nothing
set gg_trg_BuildTrain_P4 = CreateTrigger( )
call TriggerRegisterTimerEventPeriodic( gg_trg_BuildTrain_P4, 3.00 )
call TriggerAddAction( gg_trg_BuildTrain_P4, function Trig_BuildTrain_P4_Actions )
endfunction
//TESH.scrollpos=6
//TESH.alwaysfold=0
function Trig_Attack_group_P1_Actions takes nothing returns nothing
local player current_player = Player(0)
local integer playernumber = GetConvertedPlayerId(current_player)
local group tempgroup = CreateGroup()
local unit tempunit
local boolean enoughforces
local integer allies
local integer enemies
local real strength
call GroupClear( udg_AI_AttackGroup[playernumber] )
// FOR HEIDAR
//first number is number of waves + 1
//second number is from which waves to repeat until end
if ( udg_AI_Wave[playernumber] > 3 ) then
set udg_AI_Wave[playernumber] = 3
endif
//add or remove waves, just cnp the if and elseif blocks and modify numbers
//to in what order are units represented, check test parameters trigger
if ( udg_AI_Wave[playernumber] == 1 ) then
set enoughforces = Assemble( playernumber, 2, 1, 0, 0, 0, 0, 0, 0 )
elseif ( udg_AI_Wave[playernumber] == 2 ) then
set enoughforces = Assemble( playernumber, 2, 1, 0, 1, 0, 0, 0, 0 )
elseif ( udg_AI_Wave[playernumber] == 3 ) then
set enoughforces = Assemble( playernumber, 2, 2, 0, 1, 0, 0, 0, 0 )
else
call BJDebugMsg("error :)")
endif
//END FOR HEIDAR STUFF
if ( enoughforces ) then
call GroupAddGroup(udg_AI_AttackGroup[playernumber], tempgroup )
loop
set tempunit = FirstOfGroup(tempgroup)
exitwhen (tempunit == null or IsUnitGroupEmptyBJ(udg_AI_AttackGroup[playernumber]) )
if (IsComplete(tempunit) == false and IsUnitType(tempunit, UNIT_TYPE_HERO) == false) then
call GroupAddGroup( udg_AI_AttackGroup[playernumber], udg_AI_Defenders[playernumber] )
call GroupClear(udg_AI_AttackGroup[playernumber])
call BJDebugMsg("Batalion hurt")
endif
if ( IsUnitType(tempunit, UNIT_TYPE_HERO) == true and GetUnitLifePercent(tempunit) < 65.00 ) then
call GroupAddGroup( udg_AI_AttackGroup[playernumber], udg_AI_Defenders[playernumber] )
call GroupClear(udg_AI_AttackGroup[playernumber])
call BJDebugMsg("Hero hurt")
endif
call GroupRemoveUnit(tempgroup, tempunit)
endloop
else
call GroupClear(udg_AI_AttackGroup[playernumber])
call BJDebugMsg("not enough forces")
endif
call DestroyGroup(tempgroup)
if ( not ( IsUnitGroupEmptyBJ(udg_AI_AttackGroup[playernumber]) ) ) then
call BJDebugMsg("attack enough troops")
set udg_AI_PlayerNumber = playernumber
call GroupClear(udg_AI_TooStrong[playernumber])
set strength = 0.5
set tempunit = null
loop
exitwhen tempunit != null or strength > 2
set tempunit = MinDistanceHall(udg_AI_Townhall[playernumber], strength)
set udg_AI_AttackDestination[playernumber] = GetUnitLoc(tempunit)
//call PingMinimapLocForPlayer( Player(3), udg_AI_AttackDestination[playernumber], 10.0 )
if ( tempunit == null ) then
set strength = strength + 0.1
endif
endloop
//call BJDebugMsg(R2S(strength))
set udg_AI_Captain[playernumber] = GroupPickRandomUnit(udg_AI_AttackGroup[playernumber])
set tempunit = null
call TriggerExecute( gg_trg_Group_attacking_Jass )
else
call TriggerSleepAction( 5.00 )
set tempunit = null
if ( udg_AI_Townhall[playernumber] != null ) then
call TriggerExecute( gg_trg_Attack_group_P1 )
endif
return
endif
endfunction
//===========================================================================
function InitTrig_Attack_group_P1 takes nothing returns nothing
set gg_trg_Attack_group_P1 = CreateTrigger( )
call TriggerAddAction( gg_trg_Attack_group_P1, function Trig_Attack_group_P1_Actions )
endfunction
//TESH.scrollpos=18
//TESH.alwaysfold=0
function Trig_Attack_group_P2_Actions takes nothing returns nothing
local player current_player = Player(1)
local integer playernumber = GetConvertedPlayerId(current_player)
local group tempgroup = CreateGroup()
local unit tempunit
local boolean enoughforces
local integer allies
local integer enemies
local real strength
call GroupClear( udg_AI_AttackGroup[playernumber] )
// FOR HEIDAR
//first number is number of waves + 1
//second number is from which waves to repeat until end
if ( udg_AI_Wave[playernumber] > 3 ) then
set udg_AI_Wave[playernumber] = 3
endif
//add or remove waves, just cnp the if and elseif blocks and modify numbers
//to in what order are units represented, check test parameters trigger
if ( udg_AI_Wave[playernumber] == 1 ) then
set enoughforces = Assemble( playernumber, 2, 2, 0, 0, 0, 0, 0, 0 )
elseif ( udg_AI_Wave[playernumber] == 2 ) then
set enoughforces = Assemble( playernumber, 2, 2, 1, 0, 0, 1, 0, 0 )
elseif ( udg_AI_Wave[playernumber] == 3 ) then
set enoughforces = Assemble( playernumber, 0, 0, 0, 2, 2, 1, 1, 0 )
else
call BJDebugMsg("error :)")
endif
//END FOR HEIDAR STUFF
if ( enoughforces ) then
call GroupAddGroup(udg_AI_AttackGroup[playernumber], tempgroup )
loop
set tempunit = FirstOfGroup(tempgroup)
exitwhen (tempunit == null or IsUnitGroupEmptyBJ(udg_AI_AttackGroup[playernumber]) )
if (IsComplete(tempunit) == false and IsUnitType(tempunit, UNIT_TYPE_HERO) == false) then
call GroupAddGroup( udg_AI_AttackGroup[playernumber], udg_AI_Defenders[playernumber] )
call GroupClear(udg_AI_AttackGroup[playernumber])
call BJDebugMsg("Batalion hurt")
endif
if ( IsUnitType(tempunit, UNIT_TYPE_HERO) == true and GetUnitLifePercent(tempunit) < 65.00 ) then
call GroupAddGroup( udg_AI_AttackGroup[playernumber], udg_AI_Defenders[playernumber] )
call GroupClear(udg_AI_AttackGroup[playernumber])
call BJDebugMsg("Hero hurt")
endif
call GroupRemoveUnit(tempgroup, tempunit)
endloop
else
call GroupClear(udg_AI_AttackGroup[playernumber])
call BJDebugMsg("not enough forces")
call BJDebugMsg(I2S(GetPlayerState(Player(1), PLAYER_STATE_RESOURCE_GOLD)))
call BJDebugMsg(I2S(GetPlayerState(Player(1), PLAYER_STATE_RESOURCE_LUMBER)))
endif
call DestroyGroup(tempgroup)
if ( not ( IsUnitGroupEmptyBJ(udg_AI_AttackGroup[playernumber]) ) ) then
call BJDebugMsg("attack enough troops")
set udg_AI_PlayerNumber = playernumber
call GroupClear(udg_AI_TooStrong[playernumber])
set strength = 0.5
set tempunit = null
loop
exitwhen tempunit != null or strength > 2
set tempunit = MinDistanceHall(udg_AI_Townhall[playernumber], strength)
set udg_AI_AttackDestination[playernumber] = GetUnitLoc(tempunit)
//call PingMinimapLocForPlayer( Player(3), udg_AI_AttackDestination[playernumber], 10.0 )
if ( tempunit == null ) then
set strength = strength + 0.1
endif
endloop
//call BJDebugMsg(R2S(strength))
set udg_AI_Captain[playernumber] = GroupPickRandomUnit(udg_AI_AttackGroup[playernumber])
set tempunit = null
call TriggerExecute( gg_trg_Group_attacking_Jass )
else
call TriggerSleepAction( 5.00 )
set tempunit = null
if ( udg_AI_Townhall[playernumber] != null ) then
call TriggerExecute( gg_trg_Attack_group_P2 )
endif
return
endif
endfunction
//===========================================================================
function InitTrig_Attack_group_P2 takes nothing returns nothing
set gg_trg_Attack_group_P2 = CreateTrigger( )
call TriggerAddAction( gg_trg_Attack_group_P2, function Trig_Attack_group_P2_Actions )
endfunction
//TESH.scrollpos=59
//TESH.alwaysfold=0
function Trig_Attack_group_P3_Actions takes nothing returns nothing
local player current_player = Player(2)
local integer playernumber = GetConvertedPlayerId(current_player)
local group tempgroup = CreateGroup()
local unit tempunit
local boolean enoughforces
local integer allies
local integer enemies
local real strength
call GroupClear( udg_AI_AttackGroup[playernumber] )
// FOR HEIDAR
//first number is number of waves + 1
//second number is from which waves to repeat until end
if ( udg_AI_Wave[playernumber] > 3 ) then
set udg_AI_Wave[playernumber] = 3
endif
//add or remove waves, just cnp the if and elseif blocks and modify numbers
//to in what order are units represented, check test parameters trigger
if ( udg_AI_Wave[playernumber] == 1 ) then
set enoughforces = Assemble( playernumber, 0, 1, 0, 0, 0, 0, 0, 0 )
elseif ( udg_AI_Wave[playernumber] == 2 ) then
set enoughforces = Assemble( playernumber, 0, 1, 1, 0, 0, 0, 0, 0 )
elseif ( udg_AI_Wave[playernumber] == 3 ) then
set enoughforces = Assemble( playernumber, 0, 1, 1, 1, 0, 0, 0, 0 )
else
call BJDebugMsg("error :)")
endif
//END FOR HEIDAR STUFF
if ( enoughforces ) then
call GroupAddGroup(udg_AI_AttackGroup[playernumber], tempgroup )
loop
set tempunit = FirstOfGroup(tempgroup)
exitwhen (tempunit == null or IsUnitGroupEmptyBJ(udg_AI_AttackGroup[playernumber]) )
if (IsComplete(tempunit) == false and IsUnitType(tempunit, UNIT_TYPE_HERO) == false) then
call GroupAddGroup( udg_AI_AttackGroup[playernumber], udg_AI_Defenders[playernumber] )
call GroupClear(udg_AI_AttackGroup[playernumber])
call BJDebugMsg("Batalion hurt")
endif
if ( IsUnitType(tempunit, UNIT_TYPE_HERO) == true and GetUnitLifePercent(tempunit) < 65.00 ) then
call GroupAddGroup( udg_AI_AttackGroup[playernumber], udg_AI_Defenders[playernumber] )
call GroupClear(udg_AI_AttackGroup[playernumber])
call BJDebugMsg("Hero hurt")
endif
call GroupRemoveUnit(tempgroup, tempunit)
endloop
else
call GroupClear(udg_AI_AttackGroup[playernumber])
call BJDebugMsg("not enough forces")
endif
call DestroyGroup(tempgroup)
if ( not ( IsUnitGroupEmptyBJ(udg_AI_AttackGroup[playernumber]) ) ) then
call BJDebugMsg("attack enough troops")
set udg_AI_PlayerNumber = playernumber
call GroupClear(udg_AI_TooStrong[playernumber])
set strength = 0.5
set tempunit = null
loop
exitwhen tempunit != null or strength > 2
set tempunit = MinDistanceHall(udg_AI_Townhall[playernumber], strength)
set udg_AI_AttackDestination[playernumber] = GetUnitLoc(tempunit)
//call PingMinimapLocForPlayer( Player(3), udg_AI_AttackDestination[playernumber], 10.0 )
if ( tempunit == null ) then
set strength = strength + 0.1
endif
endloop
//call BJDebugMsg(R2S(strength))
set udg_AI_Captain[playernumber] = GroupPickRandomUnit(udg_AI_AttackGroup[playernumber])
set tempunit = null
call TriggerExecute( gg_trg_Group_attacking_Jass )
else
call TriggerSleepAction( 5.00 )
set tempunit = null
if ( udg_AI_Townhall[playernumber] != null ) then
call TriggerExecute( gg_trg_Attack_group_P3 )
endif
return
endif
endfunction
//===========================================================================
function InitTrig_Attack_group_P3 takes nothing returns nothing
set gg_trg_Attack_group_P3 = CreateTrigger( )
call TriggerAddAction( gg_trg_Attack_group_P3, function Trig_Attack_group_P3_Actions )
endfunction
//TESH.scrollpos=6
//TESH.alwaysfold=0
function Trig_Attack_group_P4_Actions takes nothing returns nothing
local player current_player = Player(3)
local integer playernumber = GetConvertedPlayerId(current_player)
local group tempgroup = CreateGroup()
local unit tempunit
local boolean enoughforces
local integer allies
local integer enemies
local real strength
call GroupClear( udg_AI_AttackGroup[playernumber] )
// FOR HEIDAR
//first number is number of waves + 1
//second number is from which waves to repeat until end
if ( udg_AI_Wave[playernumber] > 4 ) then
set udg_AI_Wave[playernumber] = 4
endif
//add or remove waves, just cnp the if and elseif blocks and modify numbers
//to in what order are units represented, check test parameters trigger
if ( udg_AI_Wave[playernumber] == 1 ) then
set enoughforces = Assemble( playernumber, 0, 1, 1, 0, 0, 0, 0, 1 )
elseif ( udg_AI_Wave[playernumber] == 2 ) then
set enoughforces = Assemble( playernumber, 0, 1, 1, 0, 1, 0, 0, 1 )
elseif ( udg_AI_Wave[playernumber] == 3 ) then
set enoughforces = Assemble( playernumber, 0, 2, 1, 1, 1, 0, 0, 1 )
elseif ( udg_AI_Wave[playernumber] == 4 ) then
set enoughforces = Assemble( playernumber, 0, 2, 2, 1, 1, 1, 0, 1 )
else
call BJDebugMsg("error :)")
endif
//END FOR HEIDAR STUFF
if ( enoughforces ) then
call GroupAddGroup(udg_AI_AttackGroup[playernumber], tempgroup )
loop
set tempunit = FirstOfGroup(tempgroup)
exitwhen (tempunit == null or IsUnitGroupEmptyBJ(udg_AI_AttackGroup[playernumber]) )
if (IsComplete(tempunit) == false and IsUnitType(tempunit, UNIT_TYPE_HERO) == false) then
call GroupAddGroup( udg_AI_AttackGroup[playernumber], udg_AI_Defenders[playernumber] )
call GroupClear(udg_AI_AttackGroup[playernumber])
//call BJDebugMsg("Batalion hurt")
endif
if ( IsUnitType(tempunit, UNIT_TYPE_HERO) == true and GetUnitLifePercent(tempunit) < 65.00 ) then
call GroupAddGroup( udg_AI_AttackGroup[playernumber], udg_AI_Defenders[playernumber] )
call GroupClear(udg_AI_AttackGroup[playernumber])
//call BJDebugMsg("Hero hurt")
endif
call GroupRemoveUnit(tempgroup, tempunit)
endloop
else
call GroupClear(udg_AI_AttackGroup[playernumber])
//call BJDebugMsg("not enough forces")
endif
call DestroyGroup(tempgroup)
if ( not ( IsUnitGroupEmptyBJ(udg_AI_AttackGroup[playernumber]) ) ) then
//call BJDebugMsg("attack enough troops")
set udg_AI_PlayerNumber = playernumber
call GroupClear(udg_AI_TooStrong[playernumber])
set strength = 0.5
set tempunit = null
loop
exitwhen tempunit != null or strength > 2
set tempunit = MinDistanceHall(udg_AI_Townhall[playernumber], strength)
set udg_AI_AttackDestination[playernumber] = GetUnitLoc(tempunit)
//call PingMinimapLocForPlayer( Player(3), udg_AI_AttackDestination[playernumber], 10.0 )
if ( tempunit == null ) then
set strength = strength + 0.1
endif
endloop
//call BJDebugMsg(R2S(strength))
set udg_AI_Captain[playernumber] = GroupPickRandomUnit(udg_AI_AttackGroup[playernumber])
set tempunit = null
call TriggerExecute( gg_trg_Group_attacking_Jass )
else
call TriggerSleepAction( 5.00 )
set tempunit = null
if ( udg_AI_Townhall[playernumber] != null ) then
call TriggerExecute( gg_trg_Attack_group_P4 )
endif
return
endif
endfunction
//===========================================================================
function InitTrig_Attack_group_P4 takes nothing returns nothing
set gg_trg_Attack_group_P4 = CreateTrigger( )
call TriggerAddAction( gg_trg_Attack_group_P4, function Trig_Attack_group_P4_Actions )
endfunction
//TESH.scrollpos=45
//TESH.alwaysfold=0
function IsEnemy takes nothing returns boolean
return IsUnitEnemy( GetFilterUnit(), ConvertedPlayer( udg_AI_PlayerNumber ) ) and IsUnitAliveBJ(GetFilterUnit())
endfunction
function IsAlly takes nothing returns boolean
return IsUnitAlly( GetFilterUnit(), ConvertedPlayer( udg_AI_PlayerNumber ) ) and IsUnitAliveBJ(GetFilterUnit())
endfunction
function IsHero takes nothing returns boolean
return IsUnitType(GetFilterUnit(), UNIT_TYPE_HERO) == true and IsUnitAliveBJ(GetFilterUnit()) == true
endfunction
function Trig_Group_attacking_Jass_Actions takes nothing returns nothing
local integer playernumber = udg_AI_PlayerNumber
local integer enemies
local integer allies
local boolean dead = false
local boolean victory = false
local boolean retreat = false
local group tempgroup = CreateGroup()
local group nearbyenemies = CreateGroup()
local integer numberwaypoints = 20
//local integer waypoints = (playernumber-1)*numberwaypoints
local location array waypoints
local integer counter = 0
local unit pathfinder
//call BJDebugMsg("pathfinding")
set pathfinder = CreateUnit( ConvertedPlayer( playernumber ), 'e601', GetUnitX(udg_AI_Townhall[playernumber]), GetUnitY(udg_AI_Townhall[playernumber]), bj_UNIT_FACING )
call RemoveGuardPosition( pathfinder )
call IssuePointOrderLoc( pathfinder, "move", udg_AI_AttackDestination[playernumber] )
//set counter = 0
loop
call TriggerSleepAction( 5.00 )
//set waypoints[counter] = GetUnitLoc(pathfinder)
set waypoints[counter] = GetUnitLoc(pathfinder)
call AddSpecialEffectLocBJ( waypoints[counter], "Objects\\RandomObject\\RandomObject.mdl" )
set counter = counter + 1
exitwhen counter > numberwaypoints or DistanceBetweenPoints(waypoints[counter-1], udg_AI_AttackDestination[playernumber]) < 100.0
endloop
call RemoveUnit( pathfinder )
call BJDebugMsg("attack")
//call PingMinimapLocForPlayer( Player(3), udg_AI_Waypoints[1 + waypoints], 10.0 )
set numberwaypoints = counter
set counter = 0
//set waypoints = waypoints + 1
call TriggerExecute( gg_trg_Shake_it_baby )
call GroupPointOrderLoc( udg_AI_AttackGroup[playernumber], "attack", waypoints[counter] )
loop
set udg_AI_PlayerNumber = playernumber
//call GroupEnumUnitsInRange(tempgroup, GetLocationX(udg_AI_AttackDestination[playernumber]), GetLocationY(udg_AI_AttackDestination[playernumber]), 1000., Condition(function IsTower))
//set enemies = 5*CountUnitsInGroup(tempgroup)
call GroupEnumUnitsInRange(tempgroup, GetLocationX(udg_AI_AttackDestination[playernumber]), GetLocationY(udg_AI_AttackDestination[playernumber]), 1000., Condition(function IsEnemy))
//set enemies = enemies + OverallStrength( tempgroup )
//set allies = OverallStrength(udg_AI_AttackGroup[playernumber])
set dead = IsUnitGroupEmptyBJ(udg_AI_AttackGroup[playernumber])
set victory = CountUnitsInGroup( tempgroup) == 0
//set retreat = I2R(enemies)/(I2R(allies)+0.01) >= 1.5
exitwhen ( dead or victory or retreat) // or waypoints-(playernumber-1)*numberwaypoints > counter )
loop
call GroupEnumUnitsInRange(nearbyenemies, GetLocationX(waypoints[counter]), GetLocationY(waypoints[counter]), 1000., Condition(function IsEnemy))
exitwhen CloseTogether( udg_AI_AttackGroup[playernumber], waypoints[counter] ) == true //or IsUnitGroupEmptyBJ(nearbyenemies) == false
call BJDebugMsg("regroup")
call TriggerSleepAction( 5.00 )
endloop
set counter = counter + 1
call GroupAddGroup(udg_AI_AttackGroup[playernumber], udg_AI_Movement[playernumber])
call GroupPointOrderLoc( udg_AI_AttackGroup[playernumber], "attack", waypoints[counter] )
call TriggerSleepAction( 8.00 )
call BJDebugMsg("keep attacking")
endloop
//set udg_AI_TooStrong[playernumber] = GroupPickRandomUnit(GetUnitsInRangeOfLocMatching(10.0, udg_AI_AttackDestination[playernumber], Condition(function IsEnemyTownhall)))
if ( dead ) then
call BJDebugMsg("attackers killed")
elseif ( victory ) then
call BJDebugMsg("defenders killed")
elseif ( retreat ) then
call BJDebugMsg("retreating")
endif
call DestroyGroup(tempgroup)
call DestroyGroup(nearbyenemies)
set tempgroup = null
set nearbyenemies = null
call GroupAddGroup(udg_AI_AttackGroup[playernumber], udg_AI_Defenders[playernumber])
call GroupPointOrder( udg_AI_Defenders[playernumber], "move", GetUnitX(udg_AI_Townhall[playernumber]), GetUnitY(udg_AI_Townhall[playernumber]) )
call GroupClear(udg_AI_AttackGroup[playernumber])
set udg_AI_Wave[playernumber] = udg_AI_Wave[playernumber] + 1
call TriggerSleepAction( 10.00 )
if ( playernumber == 1 ) then
call TriggerExecute( gg_trg_Attack_group_P1 )
elseif ( playernumber == 2 ) then
call TriggerExecute( gg_trg_Attack_group_P2 )
elseif ( playernumber == 3 ) then
call TriggerExecute( gg_trg_Attack_group_P3 )
elseif ( playernumber == 4 ) then
call TriggerExecute( gg_trg_Attack_group_P4 )
endif
endfunction
//===========================================================================
function InitTrig_Group_attacking_Jass takes nothing returns nothing
set gg_trg_Group_attacking_Jass = CreateTrigger( )
call TriggerAddAction( gg_trg_Group_attacking_Jass, function Trig_Group_attacking_Jass_Actions )
endfunction
//TESH.scrollpos=6
//TESH.alwaysfold=0
function Trig_Remove_group_Jass_Conditions takes nothing returns boolean
local integer battallionIndex = LoadInteger(udg_hashtable, GetHandleId(GetDyingUnit()), 0)
local integer playernumber = GetConvertedPlayerId(GetOwningPlayer(GetDyingUnit()))
if ( GetPlayerController(GetOwningPlayer(GetDyingUnit())) == MAP_CONTROL_COMPUTER ) then
return true
endif
if ( IsUnitInGroup( GetDyingUnit(), udg_AI_AttackGroup[playernumber]) or IsUnitInGroup( GetCaptain(udg_Battallion[battallionIndex]), udg_AI_AttackGroup[playernumber - udg_TranslatePlayerNumber]) ) then
return true
endif
return false
endfunction
function Trig_Remove_group_Jass_Actions takes nothing returns nothing
local integer playernumber = GetConvertedPlayerId(GetOwningPlayer(GetDyingUnit()))
local integer battallionIndex = LoadInteger(udg_hashtable, GetHandleId(GetDyingUnit()), 0)
call TriggerSleepAction( 0.27 )
if ( IsUnitGroupEmptyBJ(udg_Battallion[battallionIndex]) ) then
call BJDebugMsg("battalion killed")
call GroupRemoveUnit( udg_AI_AttackGroup[playernumber], GetDyingUnit() )
if ( GetDyingUnit() == udg_AI_Captain[playernumber] ) then
set udg_AI_Captain[playernumber] = GroupPickRandomUnit(udg_AI_AttackGroup[playernumber])
endif
elseif ( GetOwningPlayer(GetCaptain(udg_Battallion[battallionIndex])) == Player(PLAYER_NEUTRAL_PASSIVE) ) then
call BJDebugMsg("crew killed")
call GroupRemoveUnit(udg_AI_AttackGroup[playernumber - udg_TranslatePlayerNumber], GetCaptain(udg_Battallion[battallionIndex]) )
if ( GetCaptain(udg_Battallion[battallionIndex]) == udg_AI_Captain[playernumber] ) then
set udg_AI_Captain[playernumber] = GroupPickRandomUnit(udg_AI_AttackGroup[playernumber])
endif
endif
endfunction
//===========================================================================
function InitTrig_Remove_group_Jass takes nothing returns nothing
set gg_trg_Remove_group_Jass = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Remove_group_Jass, EVENT_PLAYER_UNIT_DEATH )
call TriggerAddCondition( gg_trg_Remove_group_Jass, Condition( function Trig_Remove_group_Jass_Conditions ) )
call TriggerAddAction( gg_trg_Remove_group_Jass, function Trig_Remove_group_Jass_Actions )
endfunction
//TESH.scrollpos=0
//TESH.alwaysfold=0
function Avalaible takes nothing returns boolean
local integer playernumber = GetConvertedPlayerId(GetOwningPlayer(GetEnumUnit()))
local integer typeofunit = IsCaptain( GetUnitTypeId( GetEnumUnit() ) )
local real dist = (GetUnitX(udg_AI_Townhall[playernumber]) - GetUnitX(GetFilterUnit())) * (GetUnitX(udg_AI_Townhall[playernumber]) - GetUnitX(GetFilterUnit())) + (GetUnitY(udg_AI_Townhall[playernumber]) - GetUnitY(GetFilterUnit())) * (GetUnitY(udg_AI_Townhall[playernumber]) - GetUnitY(GetFilterUnit()))
if ( GetUnitTypeId( GetFilterUnit() ) == udg_AI_ProductionBuilding[typeofunit] and GetUnitState( GetFilterUnit(), UNIT_STATE_LIFE) > 0 and not (IsUnitInGroup( GetFilterUnit(), udg_AI_TrainingBuildings )) and SquareRoot(dist) < 1000.0 ) then
return true
else
return false
endif
endfunction
function Reinforce takes nothing returns nothing
local integer typeofunit
local unit barracks
local real dist
local player current_player = GetOwningPlayer(GetEnumUnit())
local integer playernumber = GetConvertedPlayerId(current_player)
local group tempgroup = CreateGroup()
if ( not (IsUnitInGroup( GetEnumUnit(), udg_AI_DefendingGroup[playernumber])) and IsUnitInGroup( GetEnumUnit(), udg_AI_Defenders[playernumber]) and LoadInteger(udg_hashtable, GetHandleId(GetEnumUnit()), 1) == 1 and GetUnitState( GetEnumUnit(), UNIT_STATE_LIFE) > 0) then
set typeofunit = IsCaptain( GetUnitTypeId( GetEnumUnit() ) )
call GroupEnumUnitsOfPlayer( tempgroup, current_player, Condition( function Avalaible ) )
set barracks = GroupPickRandomUnit( tempgroup )
if ( not ( IsComplete( GetEnumUnit() ) ) ) then
call IssueTargetOrder( GetEnumUnit(), "hex", barracks )
//call BJDebugMsg("reinforcing")
endif
endif
call DestroyGroup(tempgroup)
set tempgroup = null
set current_player = null
set barracks = null
endfunction
function Trig_Reinforce_Jass_Actions takes nothing returns nothing
//local group P1 = CreateGroup()
local group P2 = CreateGroup()
//local group P3 = CreateGroup()
//local group P4 = CreateGroup()
//call GroupEnumUnitsOfPlayer( P1, Player(0), null)
call GroupEnumUnitsOfPlayer( P2, Player(1), null)
//call GroupEnumUnitsOfPlayer( P3, Player(2), null)
//call GroupEnumUnitsOfPlayer( P4, Player(3), null)
//call ForGroup( P1, function Reinforce )
call ForGroup( P2, function Reinforce )
//call ForGroup( P3, function Reinforce )
//call ForGroup( P4, function Reinforce )
//call DestroyGroup(P1)
call DestroyGroup(P2)
//call DestroyGroup(P3)
//call DestroyGroup(P4)
//set P1 = null
set P2 = null
//set P3 = null
//set P4 = null
endfunction
//===========================================================================
function InitTrig_Reinforce_Jass takes nothing returns nothing
set gg_trg_Reinforce_Jass = CreateTrigger( )
call TriggerRegisterTimerEventPeriodic( gg_trg_Reinforce_Jass, 8.00 )
call TriggerAddAction( gg_trg_Reinforce_Jass, function Trig_Reinforce_Jass_Actions )
endfunction
//TESH.scrollpos=9
//TESH.alwaysfold=0
function IsStructure takes nothing returns boolean
return IsUnitEnemy( GetFilterUnit(), ConvertedPlayer( udg_AI_PlayerNumber ) ) and IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) and IsUnitAliveBJ(GetFilterUnit())
endfunction
function Trig_Defend_Conditions takes nothing returns boolean
local integer attacked = GetPlayerId(GetOwningPlayer(GetAttackedUnitBJ()))
local integer attacker = GetPlayerId(GetOwningPlayer(GetAttacker()))
if ( GetPlayerController(GetOwningPlayer(GetAttackedUnitBJ())) == MAP_CONTROL_COMPUTER and IsUnitType(GetAttackedUnitBJ(), UNIT_TYPE_STRUCTURE) == true and attacked != attacker and attacked != attacker - udg_TranslatePlayerNumber ) then
return true
else
return false
endif
endfunction
function Trig_Defend_Actions takes nothing returns nothing
local integer playernumber = GetConvertedPlayerId(GetOwningPlayer(GetTriggerUnit()))
local location attacked = GetUnitLoc(GetTriggerUnit())
local group tempgroup = CreateGroup()
local integer enemies
local integer allies = OverallStrength(udg_AI_Defenders[playernumber])
call GroupEnumUnitsInRange(tempgroup, GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit()), 1000., Condition(function EnemyTroops))
set enemies = OverallStrength( tempgroup )
call GroupAddGroup( udg_AI_Defenders[playernumber], udg_AI_DefendingGroup[playernumber] )
call DisableTrigger( GetTriggeringTrigger() )
if ( allies > enemies ) then
call BJDebugMsg("defend")
call GroupPointOrderLoc( udg_AI_DefendingGroup[playernumber], "attack", attacked )
loop
call GroupAddGroup( udg_AI_Defenders[playernumber], udg_AI_DefendingGroup[playernumber] )
set allies = OverallStrength(udg_AI_DefendingGroup[playernumber])
call GroupEnumUnitsInRange(tempgroup, GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit()), 1000., Condition(function EnemyTroops))
set enemies = OverallStrength( tempgroup )
exitwhen ( I2R(enemies)/(I2R(allies)+0.01) > 1.5 or enemies == 0 )
call GroupPointOrderLoc( udg_AI_DefendingGroup[playernumber], "attack", attacked )
call TriggerSleepAction(5.00)
endloop
call BJDebugMsg("end defend")
call GroupPointOrderLoc( udg_AI_DefendingGroup[playernumber], "move", udg_AI_TownHall[playernumber])
call GroupClear( udg_AI_DefendingGroup[playernumber] )
call EnableTrigger( GetTriggeringTrigger() )
else
set allies = allies + OverallStrength(udg_AI_AttackGroup[playernumber])
if ( allies > enemies and DistanceBetweenPoints(attacked, GetUnitLoc(udg_AI_Captain[playernumber])) < 5000.00 and DistanceBetweenPoints(attacked, udg_AI_AttackDestination[playernumber]) > 2500.00 ) then
set udg_AI_Wave[playernumber] = udg_AI_Wave[playernumber] - 1
call DisableTrigger( GetTriggeringTrigger() )
//call BJDebugMsg("defend with attackers")
//set udg_AI_AttackDestination[playernumber] = attacked
call GroupAddGroup(udg_AI_AttackGroup[playernumber], udg_AI_DefendingGroup[playernumber])
call GroupClear(udg_AI_AttackGroup[playernumber])
call GroupPointOrderLoc( udg_AI_DefendingGroup[playernumber], "attack", attacked )
//call GroupPointOrderLoc( udg_AI_AttackGroup[playernumber], "attack", attacked )
loop
set allies = OverallStrength(udg_AI_Defenders[playernumber]) + OverallStrength(udg_AI_AttackGroup[playernumber])
set enemies = OverallStrength(GetUnitsInRangeOfLocMatching(1000.0, attacked, Condition(function EnemyTroops))) + CountUnitsInGroup(GetUnitsInRangeOfLocMatching(1000.0, attacked, Condition(function IsStructure)))
exitwhen ( I2R(enemies)/(I2R(allies)+0.01) > 1.5 or enemies == 0 )
call GroupPointOrderLoc( udg_AI_DefendingGroup[playernumber], "attack", attacked )
call TriggerSleepAction(RMaxBJ(bj_WAIT_FOR_COND_MIN_INTERVAL, 5.00))
endloop
//call BJDebugMsg("end defend")
call GroupPointOrderLoc( udg_AI_DefendingGroup[playernumber], "move", udg_AI_TownHall[playernumber])
call GroupClear( udg_AI_DefendingGroup[playernumber] )
set udg_AI_AttackDestination[playernumber] = GetUnitLoc(MinDistanceHall(udg_AI_Townhall[playernumber], 1))
call EnableTrigger( GetTriggeringTrigger() )
else
call GroupClear( udg_AI_DefendingGroup[playernumber] )
call DestroyGroup(tempgroup)
call TriggerSleepAction( 5.0 )
call EnableTrigger( GetTriggeringTrigger() )
endif
endif
endfunction
//===========================================================================
function InitTrig_Defend takes nothing returns nothing
set gg_trg_Defend = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Defend, EVENT_PLAYER_UNIT_ATTACKED )
call TriggerAddCondition( gg_trg_Defend, Condition( function Trig_Defend_Conditions ) )
call TriggerAddAction( gg_trg_Defend, function Trig_Defend_Actions )
endfunction
//TESH.scrollpos=21
//TESH.alwaysfold=0
function Trig_SetupMusic_Func003Func001Func001Func001C takes nothing returns boolean
if ( not ( GetRandomReal(1.00, 4.00) == 4.00 ) ) then
return false
endif
return true
endfunction
function Trig_SetupMusic_Func003Func001Func001C takes nothing returns boolean
if ( not ( GetRandomReal(1.00, 4.00) == 3.00 ) ) then
return false
endif
return true
endfunction
function Trig_SetupMusic_Func003Func001C takes nothing returns boolean
if ( not ( GetRandomReal(1.00, 4.00) == 2.00 ) ) then
return false
endif
return true
endfunction
function Trig_SetupMusic_Func003C takes nothing returns boolean
if ( not ( GetRandomReal(1.00, 4.00) == 1.00 ) ) then
return false
endif
return true
endfunction
function Trig_SetupMusic_Actions takes nothing returns nothing
call SetMapMusicRandomBJ( "Sound\\Music\\mp3Music\\DarkAgents.mp3;Sound\\Music\\mp3Music\\NagaTheme.mp3;Sound\\Music\\mp3Music\\PursuitTheme.mp3;Sound\\Music\\mp3Music\\BloodElfTheme.mp3" )
call TriggerRegisterTimerEventPeriodic( GetTriggeringTrigger(), 200.00 )
if ( Trig_SetupMusic_Func003C() ) then
call SetMapMusicRandomBJ( "Sound\\Music\\mp3Music\\DarkAgents.mp3;Sound\\Music\\mp3Music\\NagaTheme.mp3;Sound\\Music\\mp3Music\\PursuitTheme.mp3;Sound\\Music\\mp3Music\\BloodElfTheme.mp3" )
else
if ( Trig_SetupMusic_Func003Func001C() ) then
call SetMapMusicRandomBJ( "Sound\\Music\\mp3Music\\DarkAgents.mp3;Sound\\Music\\mp3Music\\NagaTheme.mp3;Sound\\Music\\mp3Music\\PursuitTheme.mp3;Sound\\Music\\mp3Music\\BloodElfTheme.mp3" )
else
if ( Trig_SetupMusic_Func003Func001Func001C() ) then
call SetMapMusicRandomBJ( "Sound\\Music\\mp3Music\\DarkAgents.mp3;Sound\\Music\\mp3Music\\NagaTheme.mp3;Sound\\Music\\mp3Music\\PursuitTheme.mp3;Sound\\Music\\mp3Music\\BloodElfTheme.mp3" )
else
if ( Trig_SetupMusic_Func003Func001Func001Func001C() ) then
call SetMapMusicRandomBJ( "Sound\\Music\\mp3Music\\DarkAgents.mp3;Sound\\Music\\mp3Music\\NagaTheme.mp3;Sound\\Music\\mp3Music\\PursuitTheme.mp3;Sound\\Music\\mp3Music\\BloodElfTheme.mp3" )
else
endif
endif
endif
endif
endfunction
//===========================================================================
function InitTrig_SetupMusic2_Copy takes nothing returns nothing
set gg_trg_SetupMusic2_Copy = CreateTrigger( )
call TriggerAddAction( gg_trg_SetupMusic2_Copy, function Trig_SetupMusic_Actions )
endfunction