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
// ********************************************************************
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_AttackGroup | group | Yes | |
AI_Defenders | group | Yes | |
AI_Movement | group | Yes | |
AI_Player_Copy | player | No | |
AI_PlayerNumber | integer | No | 0 |
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 | |
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 | 330 |
BattallionQueued | group | No | |
BattallionRegroup | real | No | 700.00 |
BuildBool | boolean | No | |
BuildingCount | integer | No | 0 |
CaptureCountTotal | integer | Yes | |
captureId | integer | No | |
CaptureStarted | boolean | No | |
CaptureTimer | timer | Yes | |
CaptureTimerWindow | timerdialog | Yes | |
CapturingPlayer | player | Yes | |
CavalryGroup | group | No | |
check | boolean | No | |
ClsR_Ability | abilcode | No | |
ClsR_AbilityLevels | integer | No | |
ClsR_AbilityOrder | ordercode | No | |
ClsR_AreaOfEffect | real | Yes | |
ClsR_Caster | unit | Yes | |
ClsR_casterOwner | player | Yes | |
ClsR_Counter | integer | Yes | |
ClsR_Counter2 | integer | Yes | |
ClsR_CountRockets | boolean | No | |
ClsR_DamagePerRocket | real | Yes | |
ClsR_DelayPerWave | real | No | |
ClsR_Dummy | unitcode | No | |
ClsR_Facing | real | Yes | |
ClsR_FacingZ | real | Yes | |
ClsR_FirstWaveDelay | real | No | |
ClsR_Hashtable | hashtable | No | |
ClsR_HitTargetOnly | boolean | No | |
ClsR_Last | integer | No | |
ClsR_lastX | real | Yes | |
ClsR_lastY | real | Yes | |
ClsR_lastZ | real | Yes | |
ClsR_Level | integer | Yes | |
ClsR_MakeUnitExplode | boolean | No | |
ClsR_mapBorder | real | Yes | |
ClsR_MaxIndex | integer | No | |
ClsR_Next | integer | Yes | |
ClsR_NoTarget | boolean | No | |
ClsR_posX | real | Yes | |
ClsR_posY | real | Yes | |
ClsR_posZ | real | Yes | |
ClsR_PreferTargetUnit | boolean | No | |
ClsR_Prev | integer | Yes | |
ClsR_realTimer | real | Yes | |
ClsR_realTimer2 | real | Yes | |
ClsR_Recyclable | integer | No | |
ClsR_Recycle | integer | Yes | |
ClsR_Rocket | unit | Yes | |
ClsR_RocketAttackType | attacktype | No | |
ClsR_RocketDamageType | damagetype | No | |
ClsR_rocketModel | effect | Yes | |
ClsR_RocketsCollisionSize | real | No | |
ClsR_RocketsCount | integer | Yes | |
ClsR_RocketsCrashHeight | real | No | |
ClsR_RocketsDamageRange | real | Yes | |
ClsR_RocketsExpirationTime | real | No | |
ClsR_RocketsInterval | real | No | |
ClsR_RocketsMaxFacingVariation | real | No | |
ClsR_RocketsMaxPitchVariation | real | No | |
ClsR_RocketsMinFacingVariation | real | No | |
ClsR_RocketsMinPitchVariation | real | No | |
ClsR_RocketsModel | string | No | |
ClsR_RocketsPerSecond | integer | No | |
ClsR_RocketsPerWave | integer | No | |
ClsR_RocketsSize | real | No | |
ClsR_RocketsSpawnHeightBonus | real | No | |
ClsR_RocketsSpawnOffset | real | No | |
ClsR_RocketsSpeedBase | real | Yes | |
ClsR_RocketsTurnAcceleration | real | Yes | |
ClsR_RocketsUnitsHeightBonus | real | No | |
ClsR_Stage | integer | Yes | |
ClsR_Target | unit | Yes | |
ClsR_targetCollision | real | Yes | |
ClsR_targetType | integer | Yes | |
ClsR_tempGroup | group | No | |
ClsR_Timer | timer | No | |
ClsR_ZLocator | location | No | |
Count | integer | Yes | |
cpAttacker | player | Yes | |
cpId | integer | No | |
cpNotified | integer | Yes | |
cpOwner | player | Yes | |
cpPointsGroup | group | No | |
cpProgress | integer | Yes | |
cpUnit | unit | Yes | |
cpVAR_CaptureMessage | string | No | |
cpVAR_CaptureRate | integer | No | |
cpVAR_CaptureReq | integer | No | |
cpVAR_ControlPointIncGold | integer | Yes | |
cpVAR_ControlPointIncLumber | integer | Yes | |
cpVAR_ControlPointType | unitcode | Yes | |
cpVAR_ControlPointTypeId | integer | No | |
cpVAR_FloatOffset | real | No | |
cpVAR_IncomeRate | real | No | |
cpVAR_NotifierCooldown | integer | No | |
cpVAR_PlayerColour | string | Yes | |
cpVAR_PointLostMessage | string | No | |
cpVAR_Range | real | No | |
cpVAR_SystemStyle | integer | No | |
cpVAR_WarningMessage | string | No | |
DefendingPlayer | player | Yes | |
DidBuild | boolean | No | |
DummySystems | unit | No | |
ETG_Angle | real | No | |
ETG_BuffAbilityBurn | abilcode | No | |
ETG_BuffAbilityPoison | abilcode | No | |
ETG_BurnDamageBase | real | No | |
ETG_BurnDamagePerLevel | real | No | |
ETG_BurnDurationBase | real | No | |
ETG_BurnDurationPerLevel | real | No | |
ETG_DissapateModel | string | No | |
ETG_Dummy | unitcode | No | |
ETG_Explodeables | group | No | |
ETG_ExplosionDamageBase | real | No | |
ETG_ExplosionDamagePerLevel | real | No | |
ETG_ExplosionModel | string | No | |
ETG_FireModel | string | No | |
ETG_GasCloudAOE | real | No | |
ETG_GasCloudDurationBase | real | No | |
ETG_GasCloudDurationPerLevel | real | No | |
ETG_GasHeadsBase | integer | No | |
ETG_GasHeadsPerLevel | integer | No | |
ETG_GasModel | string | No | |
ETG_GasProjectileFlyHeight | real | No | |
ETG_GasProjectileModel | string | No | |
ETG_GasProjectileScale | real | No | |
ETG_GasSpeed | real | No | |
ETG_GasSpreadBase | real | No | |
ETG_GasSpreadPerLevel | real | No | |
ETG_GasSpreadSpeed | integer | No | |
ETG_Group | group | No | |
ETG_Hash | hashtable | No | |
ETG_HeightMultiplyer | real | No | |
ETG_i | integervar | No | |
ETG_MinRange | real | No | |
ETG_PoisonDamageBase | real | No | |
ETG_PoisonDamagePerLevel | real | No | |
ETG_PoisonDurationBase | real | No | |
ETG_PoisonDurationPerLevel | real | No | |
ETG_PoisonModel | string | No | |
ETG_RealCache | real | Yes | |
ETG_RockModel | string | No | |
ETG_Spell | abilcode | No | |
ETG_Spell2 | abilcode | No | |
ETG_SpreadRandomiser | real | No | |
ETG_TempGroup | group | No | |
ETG_TempInteger | integer | No | |
ETG_TempPoint | location | No | |
ETG_TempPoint2 | location | No | |
ETG_TempReal | real | No | |
ETG_TempU | unit | No | |
ETG_TempU2 | unit | No | |
ETG_U | unit | No | |
ETG_UHandle | integer | No | |
ETG_UHandleC | integer | No | |
ETG_VolcanicProjectileScale | real | No | |
ETG_VolcanicRockAoeBase | real | No | |
ETG_VolcanicRockAoePerLevel | real | No | |
Faction1Income | integer | No | |
Faction2Income | integer | No | |
Faction3Income | integer | No | |
Faction4Income | integer | No | |
Gold | hashtable | No | |
handle | integer | No | |
hashtable | hashtable | No | |
Income_timer | timer | No | |
KB | integervar | No | |
KB_Angle | real | Yes | |
KB_Distance | real | Yes | |
KB_Group | group | Yes | |
KB_Int | integer | No | |
KB_Off | boolean | Yes | |
KB_Point | location | Yes | |
KB_Skip | integer | No | |
KB_Spam | integer | Yes | |
KB_Speed | real | Yes | |
KB_Target | unit | Yes | |
KB_Times | integer | No | |
LastBuilder | unit | No | UnitNull |
LastBuilderHandle | handle | No | |
NrTypes | integer | No | 50 |
Owner | hashtable | No | |
OwningPlayer | player | No | |
Players | force | No | |
Players_Copy | player | Yes | |
PointRotate | location | No | |
Production | hashtable | No | |
Selected1 | group | Yes | |
Status | integer | Yes | |
STESYS_CheckGroup | group | No | |
STESYS_DefaultVision | integer | No | |
STESYS_Loop_Integer | integer | No | |
STESYS_PERIODIC_TIMEOUT | real | No | |
STESYS_SightAbility | abilcode | No | |
STESYS_TempBool | boolean | Yes | |
STESYS_TempGroup | group | Yes | |
STESYS_TempInteger | integer | Yes | |
STESYS_TempLoc | location | Yes | |
STESYS_TempPlayer | player | No | |
STESYS_TempReal | real | Yes | |
STESYS_TempVis | fogmodifier | Yes | |
STESYS_TempVis1 | fogmodifier | Yes | |
STESYS_TempVis2 | fogmodifier | Yes | |
STESYS_TempVis3 | fogmodifier | Yes | |
STESYS_TempVis4 | fogmodifier | Yes | |
STESYS_TempVis5 | fogmodifier | Yes | |
STESYS_TimeDay | real | No | |
STESYS_TimeNight | real | No | |
STESYS_Trigger | trigger | Yes | |
STESYS_Unit | unit | Yes | |
STESYS_VisionInteger | integer | No | |
Summon | integer | No | 6 |
target | unit | No | |
TempBuilding | unit | No | |
tempCaptureRate | integer | No | |
TempCommander | unit | No | |
tempForce | force | No | |
TempGroiup | group | No | |
TempHero | unit | No | |
tempId | integer | No | |
Tempint | integer | No | |
tempInt | integer | No | |
tempLoc | location | No | |
tempLoc2 | location | No | |
Tempplayer | player | No | |
TempPoint | location | No | |
Temppoint | location | No | |
Temppoint01 | location | No | |
TempRealX | real | No | |
tempString | string | No | |
tempUGAllies | group | No | |
tempUGEnemies | group | No | |
tempUGPerPlayer | group | Yes | |
Tempunit | unit | No | |
testIndex | integer | No | |
testValue | integer | No | |
timer | real | No | |
Town | handle | No | |
Towns | hashtable | No | |
TownUnit | unit | No | UnitNull |
TranslatePlayerNumber | integer | No | 5 |
TurnTime | integer | No | 120 |
UDex | integer | No | |
UDexGen | integer | No | |
UDexNext | integer | Yes | |
UDexPrev | integer | Yes | |
UDexRecycle | integer | No | |
UDexUnits | unit | Yes | |
UDexWasted | integer | No | |
UNITDATA_Hash | hashtable | No | |
UNITDATA_SIGHTDAY | integer | No | |
UNITDATA_SIGHTNIGHT | integer | No | |
UNITDATA_UnitType | unitcode | No | |
UNITDATA_UnitTypeInteger | integer | No | |
UnitIndexerEnabled | boolean | No | |
UnitIndexEvent | real | No | |
UnitIndexLock | integer | Yes | |
Unittype | unitcode | No |
scope YearTimer initializer Init
public function Timer takes nothing returns nothing
local integer y = 0
local integer m
local string now = "Year "
call TimerDialogSetRealTimeRemaining(turndisplay, turn_time)
set month = month + 1
set m = month
loop
exitwhen m < 12
set m = m - 12
set y = y + 1
endloop
set now = now + I2S(y + 1) + ", Month " + I2S(m + 1)
call TimerDialogSetTitle(turndisplay, now)
// GAME TICK OCCURS
//call ForForce(players, function PlayerTick)
call ForForce(GetPlayersAll(), function PlayerTick)
endfunction
public function Actions takes nothing returns nothing
call TimerStart(turn, turn_time, true, function Timer)
call TimerDialogSetTitle(turndisplay, "Year 0, Month 0")
call TimerDialogSetRealTimeRemaining(turndisplay, turn_time)
call TimerDialogDisplay(turndisplay, true)
endfunction
//===========================================================================
private function Init takes nothing returns nothing
set yeartimer = CreateTrigger( )
set turn = CreateTimer()
set turndisplay = CreateTimerDialog(turn)
//call TriggerRegisterTimerEvent(t, 0, false)
//call TriggerAddAction( yeartimer, function Actions )
endfunction
endscope
scope GameTick initializer Init
globals
trigger gametick
private integer cgol = 0
private integer cpro = 0
private integer pid = 0
private constant integer TICK_CONSUMERS = 0
private constant integer TICK_PRODUCERS = 1
private constant integer TICK_UPKEEP = 2
private integer tick = 0
endglobals
private function GetMineResources takes nothing returns boolean
local integer pid = GetUnitTypeId(GetFilterUnit())
return pid == 'h00H' or pid == 'h00E'
endfunction
private function GetMine takes nothing returns boolean
local integer pid = GetUnitTypeId(GetFilterUnit())
return not (pid == 'h00H' or pid == 'h00E')
endfunction
private function MakeUnit takes player p, integer kind, integer size, location at, integer town returns nothing
local integer total_units = LoadInteger(towns, town, towns_units)
local unit u = CreateUnitAtLoc(p, kind, at, Rad2Deg(GetRandomReal(-bj_PI, bj_PI)))
local integer id = GetHandleId(u)
call SaveInteger(towns, town, towns_units, total_units + size)
call SaveInteger(towns, id, 0, town)
call SaveInteger(towns, id, 1, size)
set u = null
endfunction
private function InfirmaryPick takes nothing returns boolean
if IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) or IsUnitType(GetFilterUnit(), UNIT_TYPE_DEAD) then
return false
endif
if GetUnitStatePercent(GetFilterUnit(), UNIT_STATE_LIFE, UNIT_STATE_MAX_LIFE) > 95 then
return false
endif
return true
endfunction
private function RepairBuilding takes unit u, real percent returns nothing
local real hp = GetUnitState(u, UNIT_STATE_LIFE)
local real heal = hp * percent
if hp / GetUnitState(u, UNIT_STATE_MAX_LIFE) <= 0.95 then
call SetUnitState(u, UNIT_STATE_LIFE, hp + heal)
call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Items\\ResourceItems\\ResourceEffectTarget.mdl", GetUnitX(u), GetUnitY(u)))
endif
endfunction
private function InfirmaryHeal takes nothing returns nothing
local unit u = GetEnumUnit()
local real hp = GetUnitState(u, UNIT_STATE_LIFE)
local real heal = 15.0
call SetUnitState(u, UNIT_STATE_LIFE, hp + heal)
call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Undead\\ReplenishMana\\SpiritTouchTarget.mdl", GetUnitX(u), GetUnitY(u)))
set u = null
endfunction
private function ActionTick takes nothing returns nothing
local unit bu = GetEnumUnit()
local player p = GetOwningPlayer(bu)
local integer bh = GetHandleId(bu)
local integer bid = GetBuildId(bu)
local integer town = LoadInteger(towns, bid, 0)
local integer a = LoadInteger(actions, bh, 0)
//local integer total_units = LoadInteger(towns, town, towns_units)
local integer units = GetUnitSlotsLeft(town)
local location loc = GetUnitLoc(bu)
local boolean repeat = LoadBoolean(actions, bh, 0)
local integer cur = LoadInteger(actions, bh, 1)
local integer max = LoadInteger(actions, bh, 2)
local boolean done = false
local group infir = null
if a == ACTION_REST then
//call DisplayTextToForce(GetPlayersAll(), GetUnitName(bu) + " is resting!")
elseif a == ACTION_SWORDSMEN then // Swordsmen, 3g cost
set units = min(units, 2)
loop
exitwhen units <= 0 or cgol < 3
call MakeUnit(p, 'h001', 1, loc, town)
set cgol = cgol - 3
set units = units - 1
set done = true
endloop
elseif a == ACTION_BOWMEN then // Bowmen, 6g cost
set units = min(units, 2)
loop
exitwhen units <= 0 or cgol < 6
call MakeUnit(p, 'h00M', 1, loc, town)
set cgol = cgol - 6
set units = units - 1
set done = true
endloop
elseif a == ACTION_BARD then // Bard, 15g cost
if cgol >= 15 and units > 0 then
call MakeUnit(p, 'h00S', 1, loc, town)
set cgol = cgol - 15
set done = true
endif
elseif a == ACTION_UPGRADE_GUARD_TOWER then
if cpro >= 12 then
set cur = cur + 1
set cpro = cpro - 12
if cur == max then
set bu = SwitchBuild(bu, 'h00K')
set bh = GetHandleId(bu)
set done = true
else
call DisplayAction(bu, GetOwningPlayer(bu))
endif
endif
elseif a == ACTION_ENGINEER then
if cgol >= 20 and units > 0 then
call MakeUnit(p, 'h00V', 1, loc, town)
set cgol = cgol - 20
set done = true
endif
elseif a == ACTION_TREBUCHET then
if cgol >= 30 and cpro >= 14 then
set cur = cur + 1
set cgol = cgol - 30
set cpro = cpro - 14
if cur >= max then
call CreateUnitAtLoc(Player(PLAYER_NEUTRAL_PASSIVE), 'h00W', loc, Rad2Deg(GetRandomReal(-bj_PI, bj_PI)))
set done = true
else
call DisplayAction(bu, GetOwningPlayer(bu))
endif
endif
elseif a == ACTION_RAIDER then
if cgol >= 8 and units > 0 then
set cgol = cgol - 8
call MakeUnit(p, 'h00X', 2, loc, town)
set done = true
endif
elseif a == ACTION_MERCENARY then
set units = min(units, 3)
loop
exitwhen units <= 0 or cgol < 4
call MakeUnit(p, 'h00Y', 1, loc, town)
set cgol = cgol - 4
set units = units - 1
set done = true
endloop
endif
if GetUnitTypeId(bu) == 'h00Q' then
if cgol >= 10 then
set cgol = cgol - 10
set infir = CreateGroup()
call GroupEnumUnitsInRangeOfLoc(infir, loc, 200, Condition(function InfirmaryPick))
call ForGroup(infir, function InfirmaryHeal)
call DestroyGroup(infir)
set infir = null
endif
endif
call SaveInteger(actions, bh, 1, cur)
if done == true then
if not repeat then
call Actions_SetBuildingAction(bu, ACTION_REST)
endif
call SaveInteger(actions, bh, 1, 0) // cur
call SaveInteger(actions, bh, 2, 0) // max
call DisplayAction(bu, GetOwningPlayer(bu))
endif
call RemoveLocation(loc)
set loc = null
set bu = null
endfunction
private function TownUpgrade takes unit u, integer town returns nothing
local real health = GetUnitStatePercent(u, UNIT_STATE_LIFE, UNIT_STATE_MAX_LIFE) / 100.0
local location loc = GetUnitLoc(u)
local real facing = GetUnitFacing(u)
local integer ohid = GetHandleId(u)
local integer otid = GetUnitTypeId(u)
local integer tid = 0
local unit new = null
local group all = LoadGroupHandle(towns, GetPlayerId(GetOwningPlayer(u)), 0)
local group tws = LoadGroupHandle(towns, GetPlayerId(GetOwningPlayer(u)), 1)
if otid == 'h007' then
set tid = 'h008'
elseif otid == 'h008' then
set tid = 'h00N'
else
set tid = 'h007'
endif
call GroupRemoveUnit(all, u)
call GroupRemoveUnit(tws, u)
call RemoveUnit(u)
set new = CreateUnit(GetOwningPlayer(u), tid, GetLocationX(loc), GetLocationY(loc), facing)
call GroupAddUnit(all, new)
call GroupAddUnit(tws, new)
call RemoveSavedInteger(townid, ohid, 0)
call SaveInteger(townid, GetHandleId(new), 0, town)
call SaveUnitHandle(townid, town, 0, new)
call SetUnitState(new, UNIT_STATE_LIFE, health * GetUnitState(new, UNIT_STATE_MAX_LIFE))
call RemoveLocation(loc)
set loc = null
set new = null
endfunction
private function TownTick takes nothing returns nothing
local unit tu = GetEnumUnit()
local integer id = GetHandleId(tu)
local integer town = GetTownId(tu)
local integer bt = GetUnitTypeId(tu)
local boolean built = LoadBoolean(towns, town, towns_built)
local integer a = LoadInteger(actions, id, 0)
local boolean repeat = LoadBoolean(actions, id, 0)
local location loc = GetUnitLoc(tu)
local integer cur = LoadInteger(actions, id, 1)
local integer max = LoadInteger(actions, id, 2)
set cur = cur + 1
call SaveInteger(actions, id, 1, cur)
if a == ACTION_SETTLE then
if cur >= max then
call Actions_SetBuildingAction(tu, ACTION_REST)
call DisplayTag(tu, GetOwningPlayer(tu), "|CFF90FF90New settlers!")
call MakeUnit(GetOwningPlayer(tu), 'h00D', 1, loc, town)
call SaveInteger(towns, town, towns_units, LoadInteger(towns, town, towns_units) - 1)
else
call DisplayAction(tu, GetOwningPlayer(tu))
endif
elseif a == ACTION_UPGRADE_TOWN then
if bt == 'h006' and cpro >= 20 then
set cpro = cpro - 20
call DisplayAction(tu, GetOwningPlayer(tu))
elseif bt == 'h007' and cpro >= 30 then
set cpro = cpro - 30
call DisplayAction(tu, GetOwningPlayer(tu))
elseif bt == 'h008' and cpro >= 40 then
set cpro = cpro - 40
call DisplayAction(tu, GetOwningPlayer(tu))
else
set cur = cur - 1
endif
if cur >= max then
call Actions_SetBuildingAction(tu, ACTION_REST)
call TownUpgrade(tu, town)
endif
elseif a == ACTION_DEFENDING then
call RepairBuilding(tu, 0.03)
call DisplayAction(tu, GetOwningPlayer(tu))
elseif a == ACTION_BEGIN_DEFENDING then
if cur >= max then
call Actions_SetBuildingAction(tu, ACTION_DEFENDING)
endif
call DisplayAction(tu, GetOwningPlayer(tu))
elseif a == ACTION_SCOUT and cgol >= 5 and GetUnitSlotsLeft(town) > 0 then
call Actions_SetBuildingAction(tu, ACTION_REST)
set cgol = cgol - 5
call MakeUnit(GetOwningPlayer(tu), 'h00Z', 1, loc, town)
endif
call SaveInteger(actions, id, 1, cur)
/*if not repeat and a != 0 then
call SaveInteger(actions, id, 0, 0)
call DisplayAction(tu, GetOwningPlayer(tu))
endif*/
call RemoveLocation(loc)
set loc = null
set tu = null
endfunction
private function BuildingTick takes nothing returns nothing
local unit bu = GetEnumUnit()
local integer bid = GetBuildId(bu)
local integer town = LoadInteger(towns, bid, 0)
local integer bt = GetUnitTypeId(bu)
local boolean built = LoadBoolean(towns, bid, 1)
local boolean town_upgrading = IsTownUpgrading(town)
local boolean town_settling = LoadInteger(actions, GetHandleId(GetTownUnit(town)), 0) == ACTION_SETTLE
local boolean town_defending = IsTownDefending(town)
if built then
if tick == TICK_UPKEEP then
if bt == 'h00C' then // HOVEL
set cgol = cgol - 2
elseif bt == 'h00F' then // BARRACKS
set cgol = cgol - 2
elseif bt == 'h00E' then // WORKSHOP
set cgol = cgol - 1
elseif bt == 'h00P' then // MUSICIANS GUILD
set cgol = cgol - 3
elseif bt == 'h00J' then // WATCH TOWER
set cgol = cgol - 1
elseif bt == 'h00K' then // GUARD TOWER
set cgol = cgol - 3
elseif bt == 'h00G' then // ENGINEERS GUILD
set cgol = cgol - 10
set cpro = cpro - 6
elseif bt == 'h00I' then // STABLES
set cgol = cgol - 5
set cpro = cpro - 2
elseif bt == 'h00O' then // MERCENARY POST
set cgol = cgol - 20
endif
elseif tick == TICK_CONSUMERS and (not (town_upgrading or (town_defending and bt != 'h00Q'))) then
if bt == 'h00F' then // BARRACKS
call ActionTick()
elseif bt == 'h00P' then // MUSICIANS GUILD
call ActionTick()
elseif bt == 'h00J' then // WATCH TOWER
call ActionTick()
elseif bt == 'h00G' then // ENGINEERS' GUILD
call ActionTick()
elseif bt == 'h00I' then // STABLES
call ActionTick()
elseif bt == 'h00O' then // MERCENARY POST
call ActionTick()
elseif bt == 'h00Q' then // INFIRMARY
call ActionTick()
endif
elseif tick == TICK_PRODUCERS and (not (town_settling or town_defending)) then
// Produce only if the town is not currently settling or fortifying.
if bt == 'h00H' then // MARKET (gold)
set cgol = cgol + market_gold
call DestroyEffect(AddSpecialEffect("UI\\Feedback\\GoldCredit\\GoldCredit.mdl", GetUnitX(bu), GetUnitY(bu)))
elseif bt == 'h00E' then // WORKSHOP (production)
set cpro = cpro + workshop_prod
endif
endif
if town_defending then
call RepairBuilding(bu, 0.05)
endif
endif
set bu = null
endfunction
private function PlayerTick takes nothing returns nothing
local player p = GetEnumPlayer()
local integer id = GetPlayerId(p)
// Save old values for delta calc.
local integer ogol = GetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD)
local integer opro = GetPlayerState(p, PLAYER_STATE_RESOURCE_LUMBER)
// Delta
local integer dgol
local integer dpro
local group builds = LoadGroupHandle(towns, id, 0)
set pid = id
set cgol = GetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD) + base_income_gold
set cpro = GetPlayerState(p, PLAYER_STATE_RESOURCE_LUMBER) + base_income_prod
// Run all production buildings first, then run resource consumers.
set tick = TICK_PRODUCERS
call ForGroup(builds, function BuildingTick)
set tick = TICK_UPKEEP
call ForGroup(builds, function BuildingTick)
set tick = TICK_CONSUMERS
call ForGroup(builds, function BuildingTick)
call ForGroup(LoadGroupHandle(towns, id, 1), function TownTick)
// Add remaining resources.
call SetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD, cgol)
call SetPlayerState(p, PLAYER_STATE_RESOURCE_LUMBER, cpro)
// Find resource delta.
set dgol = cgol - ogol
set dpro = cpro - opro
// Inform player how much they made.
call DisplayTimedTextToPlayer(p, 0, 0, 5.0, "|CFFFDC689==[ |CFF00AEEFFACTION INCOME |CFFFDC689]==")
if dgol > 0 then
call DisplayTimedTextToPlayer(p, 0, 0, 5.0, " |CFFFFF200Gold: |CFF00FF00+" + I2S(dgol))
else
call DisplayTimedTextToPlayer(p, 0, 0, 5.0, " |CFFFFF200Gold: |CFFED1C24" + I2S(dgol))
endif
if dpro > 0 then
call DisplayTimedTextToPlayer(p, 0, 0, 5.0, " |CFFFF8A00Production: |CFF00FF00+" + I2S(dpro))
else
call DisplayTimedTextToPlayer(p, 0, 0, 5.0, " |CFFFF8A00Production: |CFFED1C24" + I2S(dpro))
endif
set p = null
set builds = null
endfunction
public function Timer takes nothing returns nothing
local integer y = 0
local integer m
local string now = "Year "
call TimerDialogSetRealTimeRemaining(turndisplay, turn_time)
set month = month + 1
set m = month
loop
exitwhen m < 12
set m = m - 12
set y = y + 1
endloop
set now = now + I2S(y + 1) + ", Month " + I2S(m + 1)
call TimerDialogSetTitle(turndisplay, now)
// GAME TICK OCCURS
//call ForForce(players, function PlayerTick)
call ForForce(GetPlayersAll(), function PlayerTick)
endfunction
public function Actions takes nothing returns nothing
call TimerStart(turn, turn_time, true, function Timer)
call TimerDialogSetTitle(turndisplay, "Year 0, Month 0")
call TimerDialogSetRealTimeRemaining(turndisplay, turn_time)
call TimerDialogDisplay(turndisplay, true)
endfunction
//===========================================================================
private function Init takes nothing returns nothing
set gametick = CreateTrigger( )
set turn = CreateTimer()
set turndisplay = CreateTimerDialog(turn)
//call TriggerRegisterTimerEvent(t, 0, false)
//call TriggerAddAction( gametick, function Actions )
endfunction
endscope
globals
boolean DEBUGGING = false
hashtable townid
hashtable towns
integer month = 0
integer towns_num = 0
integer towns_owned = 1
integer towns_hovels = 2
integer towns_units = 3
integer towns_built = 4
integer towns_tag = 5
integer towns_name = 6
integer hovel_units = 4
integer market_gold = 5
integer workshop_prod = 3
real turn_time = 15.0
integer base_income_gold = 4
integer base_income_prod = 2
integer base_gold = 0 // originally 10
integer base_prod = 20 // originally 4
timer turn
timerdialog turndisplay
hashtable s2b
integer array buildings[12]
hashtable bcost
hashtable max_buildings
hashtable actions
integer nexttownid = 9999
integer nextbuildid = 99999
constant integer BUILDING_CONSTRUCTING = 0
constant integer BUILDING_COMPLETED = 1
constant integer BUILDING_REMOVE = 2
constant integer ACTION_REST = 0
constant integer ACTION_SWORDSMEN = 1
constant integer ACTION_BOWMEN = 2
constant integer ACTION_SETTLE = 3
constant integer ACTION_BARD = 4
constant integer ACTION_UPGRADE_GUARD_TOWER = 5
constant integer ACTION_UPGRADE_TOWN = 6
constant integer ACTION_ENGINEER = 7
constant integer ACTION_TREBUCHET = 8
constant integer ACTION_RAIDER = 9
constant integer ACTION_MERCENARY = 10
constant integer ACTION_BEGIN_DEFENDING = 11
constant integer ACTION_DEFENDING = 12
constant integer ACTION_SCOUT = 13
// Special value.
constant integer ACTION_OLD = 999
endglobals
function GetNextBuildId takes nothing returns integer
set nextbuildid = nextbuildid + 1
return nextbuildid
endfunction
function GetBuildUnit takes integer id returns unit
return LoadUnitHandle(townid, id, 10)
endfunction
function GetBuildId takes unit build returns integer
return LoadInteger(townid, GetHandleId(build), 10)
endfunction
function GetNextTownId takes nothing returns integer
set nexttownid = nexttownid + 1
return nexttownid
endfunction
function GetTownUnit takes integer id returns unit
return LoadUnitHandle(townid, id, 0)
endfunction
function GetTownId takes unit town returns integer
return LoadInteger(townid, GetHandleId(town), 0)
endfunction
function IsTown takes unit u returns boolean
return HaveSavedInteger(townid, GetHandleId(u), 0)
endfunction
function GetOwnerId takes unit u returns integer
return LoadInteger(towns, GetBuildId(u), 0)
endfunction
function GetUnitOwnerId takes unit u returns integer
return LoadInteger(towns, GetHandleId(u), 0)
endfunction
function IsTownUpgrading takes integer town returns boolean
local integer tid = GetHandleId(GetTownUnit(town))
return LoadInteger(actions, tid, 0) == ACTION_UPGRADE_TOWN
endfunction
function IsTownDefending takes integer town returns boolean
local integer tid = GetHandleId(GetTownUnit(town))
return LoadInteger(actions, tid, 0) == ACTION_DEFENDING
endfunction
function HasOwningTown takes unit u returns boolean
return HaveSavedInteger(towns, GetBuildId(u), 0)
endfunction
function HasUnitOwningTown takes unit u returns boolean
return HaveSavedInteger(towns, GetHandleId(u), 0)
endfunction
function min takes integer one, integer two returns integer
if one > two then
return two
else
return one
endif
endfunction
function SwitchBuild takes unit from, integer to returns unit
local integer id = GetBuildId(from)
local integer town = GetOwnerId(from)
local real facing = GetUnitFacing(from)
local location loc = GetUnitLoc(from)
local unit u = null
local group g = LoadGroupHandle(towns, town, towns_owned)
local boolean repeat = false
local real health = GetUnitStatePercent(from, UNIT_STATE_LIFE, UNIT_STATE_MAX_LIFE) / 100.0
// Transfer repeat, clear action.
call RemoveSavedInteger(actions, GetHandleId(from), 0)
set repeat = LoadBoolean(actions, GetHandleId(from), 0)
call RemoveSavedBoolean(actions, GetHandleId(from), 0)
// Cleanup old unit.
call RemoveSavedInteger(townid, GetHandleId(from), 10)
call RemoveSavedInteger(towns, GetHandleId(from), 0)
call RemoveSavedBoolean(towns, GetHandleId(from), 1)
call GroupRemoveUnit(g, from)
call GroupRemoveUnit(LoadGroupHandle(towns, GetPlayerId(GetOwningPlayer(from)), 0), from)
call RemoveUnit(from)
set u = CreateUnit(GetOwningPlayer(from), to, GetLocationX(loc), GetLocationY(loc), facing)
call SetUnitState(from, UNIT_STATE_LIFE, health * GetUnitState(from, UNIT_STATE_MAX_LIFE))
call SaveBoolean(actions, GetHandleId(u), 0, repeat)
call SaveInteger(towns, GetHandleId(u), 0, town)
call SaveBoolean(towns, GetHandleId(u), 1, true)
call GroupAddUnit(g, u)
call SaveUnitHandle(townid, id, 10, u)
call SaveInteger(townid, GetHandleId(u), 10, id)
call GroupAddUnit(LoadGroupHandle(towns, GetPlayerId(GetOwningPlayer(u)), 0), u)
call RemoveLocation(loc)
set loc = null
set g = null
return u
endfunction
function DisplayTag takes unit u, player p, string s returns nothing
local texttag txt
local location loc = GetUnitLoc(u)
local integer uh = GetHandleId(u)
if HaveSavedHandle(towns, uh, 11) then
if not HaveSavedHandle(towns, GetHandleId(LoadTextTagHandle(towns, uh, 11)), 0) then
call DestroyTextTag(LoadTextTagHandle(towns, uh, 11))
endif
call RemoveSavedHandle(towns, uh, 11)
endif
set txt = CreateTextTag()
call SaveTextTagHandle(towns, uh, 11, txt)
//call SetTextTagText(txt, "", 0.020)
call SetTextTagPos(txt, GetLocationX(loc) - 32, GetLocationY(loc), 0.023)
call SetTextTagLifespan(txt, 1.5)
call SetTextTagVisibility(txt, true)
call SetTextTagFadepoint(txt, 0.3)
call SetTextTagPermanent(txt, false)
call SetTextTagVelocity(txt, 0, 0.012)
if GetLocalPlayer() == p then
call SetTextTagText(txt, s, 0.020)
endif
set txt = null
call RemoveLocation(loc)
set loc = null
endfunction
function SetTownName takes unit t, string n returns nothing
local integer id = GetTownId(t)
local texttag tag// = LoadTextTagHandle(towns, id, towns_tag)
local location loc = GetUnitLoc(t)
call SaveStr(towns, id, towns_name, n)
if HaveSavedHandle(towns, id, towns_tag) then
call RemoveSavedHandle(towns, GetHandleId(LoadTextTagHandle(towns, id, towns_tag)), 0)
call DestroyTextTag(LoadTextTagHandle(towns, id, towns_tag))
call RemoveSavedHandle(towns, id, towns_tag)
endif
set tag = CreateTextTag()
call SaveTextTagHandle(towns, id, towns_tag, tag)
call SaveUnitHandle(towns, GetHandleId(tag), 0, t)
call SetTextTagPermanent(tag, true)
call SetTextTagVisibility(tag, true)
call SetTextTagPos(tag, GetLocationX(loc) - 64, GetLocationY(loc), 200.0)
call SetTextTagText(tag, GetPlayerColorString(GetOwningPlayer(t)) + n, 0.03)
call RemoveLocation(loc)
set loc = null
set tag = null
endfunction
function InitTown takes unit t returns nothing
local integer tid = GetNextTownId()
local integer pid = GetPlayerId(GetOwningPlayer(t))
// Save town id.
call SaveUnitHandle(townid, tid, 0, t)
call SaveInteger(townid, GetHandleId(t), 0, tid)
//call SaveTextTagHandle(towns, tid, towns_tag, CreateTextTag())
call SaveGroupHandle(towns, tid, towns_owned, CreateGroup())
call SaveBoolean(towns, tid, towns_built, true)
call GroupAddUnit(LoadGroupHandle(towns, pid, 0), t)
call GroupAddUnit(LoadGroupHandle(towns, pid, 1), t)
call SaveInteger(actions, GetHandleId(t), 0, ACTION_REST)
call SetTownName(t, "Settlement")
endfunction
function DisplayAction takes unit u, player p returns nothing
local integer act = LoadInteger(actions, GetHandleId(u), 0)
local string name = LoadStr(actions, act, 0)
local integer cur = LoadInteger(actions, GetHandleId(u), 1)
local integer max = LoadInteger(actions, GetHandleId(u), 2)
if LoadBoolean(actions, GetHandleId(u), 0) then
set name = name + "|CFFFFF200*|r"
endif
if max > 0 then
set name = name + " |CFFC69C6D(" + I2S(cur) + " / " + I2S(max) + ")"
endif
call DisplayTag(u, p, name)
endfunction
function MaxUnits takes integer town returns integer
return LoadInteger(towns, town, towns_hovels) * hovel_units
endfunction
function GetUnitSlotsLeft takes integer town returns integer
return MaxUnits(town) - LoadInteger(towns, town, towns_units)
endfunction
scope Beginning initializer Init
private function InitUnit takes nothing returns nothing
if GetUnitTypeId(GetEnumUnit()) == 'h006' then
call InitTown(GetEnumUnit())
call SetTownName(GetEnumUnit(), "Home")
endif
endfunction
private function InitBuildSpells takes nothing returns nothing
set buildings[0] = 'h00H' // Market
set buildings[1] = 'h00C' // Hovel
set buildings[2] = 'h00F' // Barracks
set buildings[3] = 'h00G' // Engineers' Guild
set buildings[4] = 'h00O' // Mercenary Post
set buildings[5] = 'h00I' // Stables
set buildings[6] = 'h00K' // Guard Tower
set buildings[7] = 'h00J' // Watch Tower
set buildings[8] = 'h00Q' // Infirmary
set buildings[9] = 'h00P' // Musicians Guild
set buildings[10] = 'h00E' // Workshop
// All build spells are mapped here.
call SaveInteger(s2b, 'A00O', 0, 'h00H')
call SaveInteger(s2b, 'A00I', 0, 'h00E')
call SaveInteger(s2b, 'A00H', 0, 'h00C')
call SaveInteger(s2b, 'A00P', 0, 'h00F')
call SaveInteger(s2b, 'A00Z', 0, 'h00P')
call SaveInteger(s2b, 'A016', 0, 'h00J')
call SaveInteger(s2b, 'A01C', 0, 'h00G')
call SaveInteger(s2b, 'A01P', 0, 'h00I')
call SaveInteger(s2b, 'A01S', 0, 'h00O')
call SaveInteger(s2b, 'A01X', 0, 'h00Q')
endfunction
private function InitBuildingCosts takes nothing returns nothing
// Specified production requirement.
// Child 0 is gold, child 1 is production.
call SaveInteger(bcost, 'h00H', 1, 3) // Market
call SaveInteger(bcost, 'h00E', 1, 6) // Workshop
call SaveInteger(bcost, 'h00C', 1, 10) // Hovel
call SaveInteger(bcost, 'h00F', 1, 10) // Barracks
call SaveInteger(bcost, 'h00P', 1, 20) // Musicians Guild
call SaveInteger(bcost, 'h00J', 1, 15) // Tower
call SaveInteger(bcost, 'h00G', 1, 40) // Engineers' Guild
call SaveInteger(bcost, 'h00I', 1, 30) // Stables
call SaveInteger(bcost, 'h00O', 1, 25) // Mercenary Post
call SaveInteger(bcost, 'h00Q', 1, 50) // Infirmary
endfunction
private function InitPlayers takes nothing returns nothing
if not DEBUGGING then
call SetPlayerState(GetEnumPlayer(), PLAYER_STATE_RESOURCE_GOLD, base_gold)
call SetPlayerState(GetEnumPlayer(), PLAYER_STATE_RESOURCE_LUMBER, base_prod)
else
call SetPlayerState(GetEnumPlayer(), PLAYER_STATE_RESOURCE_GOLD, 99999)
call SetPlayerState(GetEnumPlayer(), PLAYER_STATE_RESOURCE_LUMBER, 99999)
endif
// All player buildings
call SaveGroupHandle(towns, GetPlayerId(GetEnumPlayer()), 0, CreateGroup())
// Just towns
call SaveGroupHandle(towns, GetPlayerId(GetEnumPlayer()), 1, CreateGroup())
call SetPlayerAbilityAvailable(GetEnumPlayer(), 'A00S', false)
call SetPlayerAbilityAvailable(GetEnumPlayer(), 'A01U', false)
endfunction
private function InitActions takes nothing returns nothing
/*
Map actions to the following criteria:
* Action name (shows up above the building when clicked) (colored)
* Action id (integer)
Spell mapped to the action id.
*/
// REST / STANDBY
call SaveStr(actions, 0, 0, "|CFFBD8CBFResting|r")
call SaveInteger(actions, 'A00R', 0, ACTION_REST)
call SaveStr(actions, 1, 0, "|CFFED1C24Swordsmen|r")
call SaveInteger(actions, 'A00M', 0, ACTION_SWORDSMEN)
call SaveStr(actions, 2, 0, "|CFFED1C24Bowmen|r")
call SaveInteger(actions, 'A00W', 0, ACTION_BOWMEN)
call SaveStr(actions, 3, 0, "|CFF00AEEFSettlers|r")
call SaveInteger(actions, 'A00X', 0, ACTION_SETTLE)
call SaveStr(actions, 4, 0, "|CFF00AEEFBard|r")
call SaveInteger(actions, 'A010', 0, ACTION_BARD)
call SaveStr(actions, 5, 0, "|CFF6DCFF6Upgrading|r")
call SaveInteger(actions, 'A01D', 0, ACTION_UPGRADE_GUARD_TOWER)
call SaveStr(actions, 6, 0, "|CFF6DCFF6Upgrading|r")
call SaveInteger(actions, 'A01E', 0, ACTION_UPGRADE_TOWN)
call SaveInteger(actions, 'A01F', 0, ACTION_UPGRADE_TOWN)
call SaveInteger(actions, 'A01G', 0, ACTION_UPGRADE_TOWN)
call SaveStr(actions, 7, 0, "|CFFBD8CBFEngineer|r")
call SaveInteger(actions, 'A01N', 0, ACTION_ENGINEER)
call SaveStr(actions, 8, 0, "|CFF00A99DTrebuchet|R")
call SaveInteger(actions, 'A01O', 0, ACTION_TREBUCHET)
call SaveStr(actions, 9, 0, "|CFFFDC689Raider|R")
call SaveInteger(actions, 'A01Q', 0, ACTION_RAIDER)
call SaveStr(actions, 10, 0, "|CFFC69C6DMercenary|r")
call SaveInteger(actions, 'A01R', 0, ACTION_MERCENARY)
call SaveStr(actions, 11, 0, "|CFFC69C6DFortifying|r")
call SaveInteger(actions, 'A01V', 0, ACTION_BEGIN_DEFENDING)
call SaveStr(actions, 12, 0, "|CFFED145BFortified|r")
call SaveStr(actions, 13, 0, "|CFF008400Scout|R")
call SaveInteger(actions, 'A01Y', 0, ACTION_SCOUT)
endfunction
private function InitMaxBuildings takes nothing returns nothing
call SaveInteger(max_buildings, 'h006', 0, 3)
call SaveInteger(max_buildings, 'h007', 0, 5)
call SaveInteger(max_buildings, 'h008', 0, 7)
call SaveInteger(max_buildings, 'h00N', 0, 10)
endfunction
private function Actions takes nothing returns nothing
local group allu = CreateGroup()
call ForForce(GetPlayersAll(), function InitPlayers)
call GroupEnumUnitsInRect(allu, GetPlayableMapRect(), null)
call ForGroup(allu, function InitUnit)
call DestroyGroup(allu)
set allu = null
endfunction
//===========================================================================
private function Init takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerAddAction(t, function Actions)
call TriggerRegisterTimerEvent(t, 0, false)
set townid = InitHashtable()
set towns = InitHashtable()
set s2b = InitHashtable()
call InitBuildSpells()
set bcost = InitHashtable()
call InitBuildingCosts()
set actions = InitHashtable()
call InitActions()
set max_buildings = InitHashtable()
call InitMaxBuildings()
call SetTimeOfDay(9.0)
//local trigger t = CreateTrigger()
//call TriggerAddAction( t, function Trig_Initializer_Actions )
endfunction
endscope
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_Squad_Movement takes nothing returns nothing
set gg_trg_Squad_Movement = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Squad_Movement, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER )
call TriggerAddCondition( gg_trg_Squad_Movement, Condition(function Trig_Move_to_point_Compy_Conditions) )
call TriggerAddAction( gg_trg_Squad_Movement, function Trig_Move_to_point_Compy_Actions )
endfunction
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
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
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) 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())), "|cffffcc00Not enough resources to reinforce.|r" )
call RemoveLocation(temppoint1)
return
endif
set size = size + 1
endloop
call RemoveLocation(temppoint1)
set reinforcedUnit = null
endfunction
//===========================================================================
function InitTrig_Squad_Reinforce takes nothing returns nothing
set gg_trg_Squad_Reinforce = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Squad_Reinforce, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Squad_Reinforce, Condition( function Trig_Battalion_reinforce_Conditions ) )
call TriggerAddAction( gg_trg_Squad_Reinforce, function Trig_Battalion_reinforce_Actions )
endfunction
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 )
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] / 2 + 1 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() )
//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_Squad_Trained takes nothing returns nothing
set gg_trg_Squad_Trained = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Squad_Trained, EVENT_PLAYER_UNIT_TRAIN_FINISH )
call TriggerAddCondition( gg_trg_Squad_Trained, Condition( function Trig_Battalion_train_Conditions ) )
call TriggerAddAction( gg_trg_Squad_Trained, function Trig_Battalion_train_Actions )
endfunction
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_Squad_Order_Target takes nothing returns nothing
set gg_trg_Squad_Order_Target = CreateTrigger( )
//call DisableTrigger( gg_trg_Squad_Order_Target )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Squad_Order_Target, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER )
call TriggerAddCondition( gg_trg_Squad_Order_Target, Condition( function Trig_Battalion_order_target_Conditions ) )
call TriggerAddAction( gg_trg_Squad_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_Squad_Order_No_Target takes nothing returns nothing
set gg_trg_Squad_Order_No_Target = CreateTrigger( )
//call DisableTrigger( gg_trg_Squad_Order_No_Target )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Squad_Order_No_Target, EVENT_PLAYER_UNIT_ISSUED_ORDER )
call TriggerAddCondition( gg_trg_Squad_Order_No_Target, Condition( function Trig_Battalion_order_no_target_Conditions ) )
call TriggerAddAction( gg_trg_Squad_Order_No_Target, function Trig_Battalion_order_no_target_Actions )
endfunction
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_Squad_Order_Point takes nothing returns nothing
set gg_trg_Squad_Order_Point = CreateTrigger( )
//call DisableTrigger( gg_trg_Squad_Order_Point )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Squad_Order_Point, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER )
call TriggerAddCondition( gg_trg_Squad_Order_Point, Condition( function Trig_Battalion_order_point_Conditions ) )
call TriggerAddAction( gg_trg_Squad_Order_Point, function Trig_Battalion_order_point_Actions )
endfunction
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
// Summoned
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_Squad_Order_No_Target )
// dummy
set bj_lastCreatedUnit = CreateUnitAtLoc(GetOwningPlayer(GetDyingUnit()), 'n000', 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_Squad_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_Squad_Death_Ctrl takes nothing returns nothing
set gg_trg_Squad_Death_Ctrl = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Squad_Death_Ctrl, EVENT_PLAYER_UNIT_DEATH )
call TriggerAddCondition( gg_trg_Squad_Death_Ctrl, Condition( function Trig_Battalion_death_Ctrl_Conditions ) )
call TriggerAddAction( gg_trg_Squad_Death_Ctrl, function Trig_Battalion_death_Ctrl_Actions )
endfunction
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
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)
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 KillUnit( GetEnumUnit() )
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_Artillery_Crew takes nothing returns nothing
set gg_trg_Artillery_Crew = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Artillery_Crew, EVENT_PLAYER_UNIT_DEATH )
call TriggerAddCondition( gg_trg_Artillery_Crew, Condition( function Trig_Battalion_death_Ctrl_Crew_Conditions ) )
call TriggerAddAction( gg_trg_Artillery_Crew, function Trig_Battalion_death_Ctrl_Crew_Actions )
endfunction