Name | Type | is_array | initial_value |
library Manhunt initializer InitManhunt
globals
real map_min_x
real map_max_x
real map_min_y
real map_max_y
integer array critters
integer critters_max = 0
integer array creeps1
integer creeps1_max = 0
integer array creeps2
integer creeps2_max = 0
integer array creeps3
integer creeps3_max = 0
integer array creeps4
integer creeps4_max = 0
integer array creeps5
integer creeps5_max = 0
integer array creeps6
integer creeps6_max = 0
unit array playerHero
force survivingPlayers = CreateForce()
endglobals
//=========================================================
// Util
//=========================================================
// Get distance between two units
private function DistanceBetweenUnits takes unit unitA, unit unitB returns real
local real dx = GetUnitX(unitB) - GetUnitX(unitA)
local real dy = GetUnitY(unitB) - GetUnitY(unitA)
return SquareRoot(dx * dx + dy * dy)
endfunction
// Find nearest enemy
private function NearestEnemy takes unit srcUnit returns unit
local unit pickedUnit = null
local player indexPlayer
local integer index = 0
loop
set indexPlayer = Player(index)
if IsPlayerEnemy(GetOwningPlayer(srcUnit), indexPlayer) and GetPlayerSlotState(indexPlayer) == PLAYER_SLOT_STATE_PLAYING then
if pickedUnit == null or DistanceBetweenUnits(playerHero[index], srcUnit) < DistanceBetweenUnits(pickedUnit, srcUnit) then
set pickedUnit = playerHero[index]
endif
endif
set index = index + 1
exitwhen index == bj_MAX_PLAYERS
endloop
set indexPlayer = null
return pickedUnit
endfunction
// Find nearest fountain
private function NearestFountain takes unit srcUnit returns unit
local group fountains = CreateGroup()
local unit pickedUnit = null
local unit checkUnit
call GroupEnumUnitsOfType(fountains, UnitId2String('nfoh'), null)
loop
set checkUnit = FirstOfGroup(fountains)
exitwhen checkUnit == null
call GroupRemoveUnit(fountains, checkUnit)
if pickedUnit == null or DistanceBetweenUnits(checkUnit, srcUnit) < DistanceBetweenUnits(pickedUnit, srcUnit) then
set pickedUnit = checkUnit
endif
endloop
call DestroyGroup(fountains)
set fountains = null
set checkUnit = null
return pickedUnit
endfunction
// Check visibility
private function IsVisible takes real x, real y returns boolean
local boolean visible = false
local integer index = 0
loop
set visible = IsVisibleToPlayer(x, y, Player(index))
set index = index + 1
exitwhen visible or index == bj_MAX_PLAYERS
endloop
return visible
endfunction
// Give victory to surviving players
private function VictorySurvivorsEnum takes nothing returns nothing
local player enumPlayer = GetEnumPlayer()
call RemovePlayer(enumPlayer, PLAYER_GAME_RESULT_VICTORY)
call ForceRemovePlayer(survivingPlayers, enumPlayer)
// UI only needs to be displayed to users.
if (GetPlayerController(enumPlayer) == MAP_CONTROL_USER) then
call MeleeVictoryDialogBJ(enumPlayer, false)
endif
set enumPlayer = null
endfunction
private function CheckVictory takes nothing returns nothing
local player indexPlayer
local integer index = 0
local integer team = -1
local boolean differentTeams = false
// Check surviving players
loop
set indexPlayer = Player(index)
if IsPlayerInForce(indexPlayer, survivingPlayers) then
if team == -1 then
set team = GetPlayerTeam(indexPlayer)
else
set differentTeams = GetPlayerTeam(indexPlayer) != team
endif
endif
set index = index + 1
exitwhen differentTeams or index == bj_MAX_PLAYERS
endloop
// Award victory if there's only one surviving team
if not differentTeams then
call ForForce(survivingPlayers, function VictorySurvivorsEnum)
endif
set indexPlayer = null
endfunction
//=========================================================
// Heroes
//=========================================================
// Get random hero ID
private function RandomHero takes race whichRace returns integer
local integer pick = GetRandomInt(0, 3)
if whichRace == RACE_HUMAN then
if pick == 0 then
return 'Hpal'
elseif pick == 1 then
return 'Hamg'
elseif pick == 2 then
return 'Hmkg'
elseif pick == 3 then
return 'Hblm'
endif
elseif whichRace == RACE_ORC then
if pick == 0 then
return 'Obla'
elseif pick == 1 then
return 'Ofar'
elseif pick == 2 then
return 'Otch'
elseif pick == 3 then
return 'Oshd'
endif
elseif whichRace == RACE_UNDEAD then
if pick == 0 then
return 'Udea'
elseif pick == 1 then
return 'Ulic'
elseif pick == 2 then
return 'Udre'
elseif pick == 3 then
return 'Ucrl'
endif
elseif whichRace == RACE_NIGHTELF then
if pick == 0 then
return 'Ekee'
elseif pick == 1 then
return 'Emoo'
elseif pick == 2 then
return 'Edem'
elseif pick == 3 then
return 'Ewar'
endif
endif
return 0
endfunction
// AI hero learns skill
private function HeroLearnSkill takes unit hero returns nothing
local integer heroId = GetUnitTypeId(hero)
local integer heroLevel = GetHeroLevel(hero)
local integer skill1
local integer skill2
local integer skill3
local integer skill4
local boolean heroFound = true
if heroId == 'Hpal' then
set skill1 = 'AHhb'
set skill2 = 'AHds'
set skill3 = 'AHre'
set skill4 = 'AHad'
elseif heroId == 'Hamg' then
set skill1 = 'AHbz'
set skill2 = 'AHab'
set skill3 = 'AHwe'
set skill4 = 'AHmt'
elseif heroId == 'Hmkg' then
set skill1 = 'AHtc'
set skill2 = 'AHtb'
set skill3 = 'AHbh'
set skill4 = 'AHav'
elseif heroId == 'Hblm' then
set skill1 = 'AHfs'
set skill2 = 'AHbn'
set skill3 = 'AHdr'
set skill4 = 'AHpx'
elseif heroId == 'Obla' then
set skill1 = 'AOwk'
set skill2 = 'AOcr'
set skill3 = 'AOmi'
set skill4 = 'AOww'
elseif heroId == 'Ofar' then
set skill1 = 'AOfs'
set skill2 = 'AOsf'
set skill3 = 'AOcl'
set skill4 = 'AOeq'
elseif heroId == 'Otch' then
set skill1 = 'AOsh'
set skill2 = 'AOae'
set skill3 = 'AOre'
set skill4 = 'AOws'
elseif heroId == 'Oshd' then
set skill1 = 'AOhw'
set skill2 = 'AOhx'
set skill3 = 'AOsw'
set skill4 = 'AOvd'
elseif heroId == 'Udea' then
set skill1 = 'AUdc'
set skill2 = 'AUdp'
set skill3 = 'AUau'
set skill4 = 'AUan'
elseif heroId == 'Ulic' then
set skill1 = 'AUfn'
set skill2 = 'AUfu'
set skill3 = 'AUdr'
set skill4 = 'AUdd'
elseif heroId == 'Udre' then
set skill1 = 'AUav'
set skill2 = 'AUsl'
set skill3 = 'AUcs'
set skill4 = 'AUin'
elseif heroId == 'Ucrl' then
set skill1 = 'AUim'
set skill2 = 'AUts'
set skill3 = 'AUcb'
set skill4 = 'AUls'
elseif heroId == 'Ekee' then
set skill1 = 'AEer'
set skill2 = 'AEfn'
set skill3 = 'AEah'
set skill4 = 'AEtq'
elseif heroId == 'Emoo' then
set skill1 = 'AHfa'
set skill2 = 'AEst'
set skill3 = 'AEar'
set skill4 = 'AEsf'
elseif heroId == 'Edem' then
set skill1 = 'AEmb'
set skill2 = 'AEim'
set skill3 = 'AEev'
set skill4 = 'AEme'
elseif heroId == 'Ewar' then
set skill1 = 'AEbl'
set skill2 = 'AEfk'
set skill3 = 'AEsh'
set skill4 = 'AEsv'
else
set heroFound = false
endif
if heroFound then
if heroLevel == 1 then
call SelectHeroSkill(hero, skill1)
elseif heroLevel == 2 then
call SelectHeroSkill(hero, skill2)
elseif heroLevel == 3 then
call SelectHeroSkill(hero, skill1)
elseif heroLevel == 4 then
call SelectHeroSkill(hero, skill3)
elseif heroLevel == 5 then
call SelectHeroSkill(hero, skill1)
elseif heroLevel == 6 then
call SelectHeroSkill(hero, skill4)
elseif heroLevel == 7 then
call SelectHeroSkill(hero, skill2)
elseif heroLevel == 8 then
call SelectHeroSkill(hero, skill2)
elseif heroLevel == 9 then
call SelectHeroSkill(hero, skill3)
elseif heroLevel == 10 then
call SelectHeroSkill(hero, skill3)
endif
endif
endfunction
//=========================================================
// Create stuff
//=========================================================
// Create tree
private function CreateTree takes boolean checkVisibility returns nothing
local real x = GetRandomReal(map_min_x, map_max_x)
local real y = GetRandomReal(map_min_y, map_max_y)
if not checkVisibility or not IsVisible(x, y) then
call CreateDestructable('LTlt', x, y, GetRandomReal(0, 360), GetRandomReal(0.75, 1.25), GetRandomInt(0, 9))
endif
endfunction
// Create critter
private function CreateCritter takes boolean checkVisibility returns nothing
local real x = GetRandomReal(map_min_x, map_max_x)
local real y = GetRandomReal(map_min_y, map_max_y)
if not checkVisibility or not IsVisible(x, y) then
call CreateUnit(Player(PLAYER_NEUTRAL_AGGRESSIVE), critters[GetRandomInt(0, critters_max)], x, y, GetRandomReal(0, 360))
endif
endfunction
// Create creep level 1
private function CreateCreep1 takes boolean checkVisibility returns nothing
local real x = GetRandomReal(map_min_x, map_max_x)
local real y = GetRandomReal(map_min_y, map_max_y)
local unit creep
if not checkVisibility or not IsVisible(x, y) then
set creep = CreateUnit(Player(PLAYER_NEUTRAL_AGGRESSIVE), creeps1[GetRandomInt(0, creeps1_max)], x, y, GetRandomReal(0, 360))
call SetUnitAcquireRange(creep, 200)
endif
set creep = null
endfunction
// Create creep level 2
private function CreateCreep2 takes boolean checkVisibility returns nothing
local real x = GetRandomReal(map_min_x, map_max_x)
local real y = GetRandomReal(map_min_y, map_max_y)
local unit creep
if not checkVisibility or not IsVisible(x, y) then
set creep = CreateUnit(Player(PLAYER_NEUTRAL_AGGRESSIVE), creeps2[GetRandomInt(0, creeps2_max)], x, y, GetRandomReal(0, 360))
call SetUnitAcquireRange(creep, 200)
endif
set creep = null
endfunction
// Create creep level 3
private function CreateCreep3 takes boolean checkVisibility returns nothing
local real x = GetRandomReal(map_min_x, map_max_x)
local real y = GetRandomReal(map_min_y, map_max_y)
local unit creep
if not checkVisibility or not IsVisible(x, y) then
set creep = CreateUnit(Player(PLAYER_NEUTRAL_AGGRESSIVE), creeps3[GetRandomInt(0, creeps3_max)], x, y, GetRandomReal(0, 360))
call SetUnitAcquireRange(creep, 200)
endif
set creep = null
endfunction
// Create creep level 4
private function CreateCreep4 takes boolean checkVisibility returns nothing
local real x = GetRandomReal(map_min_x, map_max_x)
local real y = GetRandomReal(map_min_y, map_max_y)
local unit creep
if not checkVisibility or not IsVisible(x, y) then
set creep = CreateUnit(Player(PLAYER_NEUTRAL_AGGRESSIVE), creeps4[GetRandomInt(0, creeps4_max)], x, y, GetRandomReal(0, 360))
call SetUnitAcquireRange(creep, 200)
endif
set creep = null
endfunction
// Create creep level 5
private function CreateCreep5 takes boolean checkVisibility returns nothing
local real x = GetRandomReal(map_min_x, map_max_x)
local real y = GetRandomReal(map_min_y, map_max_y)
local unit creep
if not checkVisibility or not IsVisible(x, y) then
set creep = CreateUnit(Player(PLAYER_NEUTRAL_AGGRESSIVE), creeps5[GetRandomInt(0, creeps5_max)], x, y, GetRandomReal(0, 360))
call SetUnitAcquireRange(creep, 200)
endif
set creep = null
endfunction
// Create creep level 6
private function CreateCreep6 takes boolean checkVisibility returns nothing
local real x = GetRandomReal(map_min_x, map_max_x)
local real y = GetRandomReal(map_min_y, map_max_y)
local unit creep
if not checkVisibility or not IsVisible(x, y) then
set creep = CreateUnit(Player(PLAYER_NEUTRAL_AGGRESSIVE), creeps6[GetRandomInt(0, creeps6_max)], x, y, GetRandomReal(0, 360))
call SetUnitAcquireRange(creep, 200)
endif
set creep = null
endfunction
//=========================================================
// Triggers
//=========================================================
// Create new stuff periodically
private function CreateNewStuff takes nothing returns boolean
local integer index = GetRandomInt(0, 7)
if index == 0 then
call CreateTree(true)
elseif index == 1 then
call CreateCritter(true)
elseif index == 2 then
call CreateCreep1(true)
elseif index == 3 then
call CreateCreep2(true)
elseif index == 4 then
call CreateCreep3(true)
elseif index == 5 then
call CreateCreep4(true)
elseif index == 6 then
call CreateCreep5(true)
elseif index == 7 then
call CreateCreep6(true)
endif
return false
endfunction
// Hostile unit dies, award food to killing player and chance to drop item
private function HostileUnitDies takes nothing returns boolean
local unit dyingUnit = GetDyingUnit()
local unit killingUnit = GetKillingUnit()
local player killingPlayer = GetOwningPlayer(killingUnit)
local texttag tt
local integer foodUsed = GetPlayerState(killingPlayer, PLAYER_STATE_RESOURCE_FOOD_USED)
local integer foodCap = GetPlayerState(killingPlayer, PLAYER_STATE_RESOURCE_FOOD_CAP)
local integer unitLevel = GetUnitLevel(dyingUnit)
local integer foodGained = unitLevel
local integer randomInt = GetRandomInt(1, 10)
if foodUsed < foodCap then
if foodUsed+foodGained > foodCap then
set foodGained = foodCap - foodUsed
endif
call SetPlayerState(killingPlayer, PLAYER_STATE_RESOURCE_FOOD_USED, foodUsed+foodGained)
// Create floating text
set tt = CreateTextTag()
call SetTextTagText(tt, "+"+I2S(foodGained), 0.025)
call SetTextTagPosUnit(tt, dyingUnit, -30)
call SetTextTagVelocityBJ(tt, 64, 90)
call SetTextTagPermanent(tt, false)
call SetTextTagLifespan(tt, 3)
call SetTextTagFadepoint(tt, 2)
call SetTextTagColor(tt, 188, 100, 57, 255)
endif
if randomInt > 7 then
set randomInt = GetRandomInt(0, unitLevel)
set bj_lastCreatedItem = CreateItem(ChooseRandomItem(randomInt), GetUnitX(dyingUnit), GetUnitY(dyingUnit))
if GetPlayerController(killingPlayer) == MAP_CONTROL_COMPUTER then
call IssueTargetOrder(killingUnit, "smart", bj_lastCreatedItem)
endif
endif
set killingPlayer = null
set dyingUnit = null
set killingUnit = null
set tt = null
return false
endfunction
// Player eats
private function PlayerEats takes nothing returns boolean
local integer index = 0
local player indexPlayer = null
local integer playerFood
loop
set indexPlayer = Player(index)
if GetPlayerSlotState(indexPlayer) == PLAYER_SLOT_STATE_PLAYING then
set playerFood = GetPlayerState(indexPlayer, PLAYER_STATE_RESOURCE_FOOD_USED)
// Player has enough food
if playerFood >= 1 then
call SetPlayerState(indexPlayer, PLAYER_STATE_RESOURCE_FOOD_USED, playerFood-1)
// Player has insufficient food, damage hero
else
call SetUnitState(playerHero[index], UNIT_STATE_LIFE, GetUnitState(playerHero[index], UNIT_STATE_LIFE)-GetUnitState(playerHero[index], UNIT_STATE_MAX_LIFE)*0.25)
endif
endif
set index = index + 1
exitwhen index == bj_MAX_PLAYERS
endloop
set indexPlayer = null
return false
endfunction
// AI move to fountain or attack nearest enemy
private function AIMovement takes nothing returns boolean
local player indexPlayer
local group playerUnits
local unit targetUnit
local integer index = 0
loop
set indexPlayer = Player(index)
if GetPlayerSlotState(indexPlayer) == PLAYER_SLOT_STATE_PLAYING and GetPlayerController(indexPlayer) == MAP_CONTROL_COMPUTER then
set playerUnits = CreateGroup()
call GroupEnumUnitsOfPlayer(playerUnits, indexPlayer, null)
// Life less than 65%: move to fountain
if GetUnitState(playerHero[index], UNIT_STATE_LIFE) < GetUnitState(playerHero[index], UNIT_STATE_MAX_LIFE)*0.65 then
set targetUnit = NearestFountain(playerHero[index])
call GroupPointOrder(playerUnits, "move", GetUnitX(targetUnit), GetUnitY(targetUnit))
// Attack move to nearest hero
else
set targetUnit = NearestEnemy(playerHero[index])
call GroupPointOrder(playerUnits, "attack", GetUnitX(targetUnit), GetUnitY(targetUnit))
endif
call DestroyGroup(playerUnits)
endif
set index = index + 1
exitwhen index == bj_MAX_PLAYERS
endloop
set indexPlayer = null
set playerUnits = null
set targetUnit = null
return false
endfunction
// Player casts a spell
private function SpellIsCast takes nothing returns boolean
local unit spellUnit = GetSpellAbilityUnit()
local unit pickedUnit = null
// Hunt: ping nearest hero
if GetSpellAbilityId() == 'ANcl' and GetOwningPlayer(spellUnit) == GetLocalPlayer() then
set pickedUnit = NearestEnemy(spellUnit)
if pickedUnit != null then
call PingMinimap(GetUnitX(pickedUnit), GetUnitY(pickedUnit), 3)
endif
endif
set spellUnit = null
set pickedUnit = null
return false
endfunction
// Hero dies
private function HeroDies takes nothing returns boolean
local unit dyingUnit = GetDyingUnit()
local player owningPlayer = GetOwningPlayer(dyingUnit)
if IsUnitType(dyingUnit, UNIT_TYPE_HERO) then
if AllowVictoryDefeat(PLAYER_GAME_RESULT_DEFEAT) then
call RemovePlayer(owningPlayer, PLAYER_GAME_RESULT_DEFEAT)
call DisplayTimedTextFromPlayer(owningPlayer, 0, 0, 60, GetLocalizedString( "PLAYER_DEFEATED" ) )
// UI only needs to be displayed to users.
if (GetPlayerController(owningPlayer) == MAP_CONTROL_USER) then
call MeleeDefeatDialogBJ(owningPlayer, false)
endif
// Remove player from surviving players group & check for victory
call ForceRemovePlayer(survivingPlayers, owningPlayer)
call CheckVictory()
endif
endif
set dyingUnit = null
set owningPlayer = null
return false
endfunction
// Kill leaving player's units
private function KillUnitsEnum takes nothing returns nothing
call KillUnit(GetEnumUnit())
endfunction
// Player leaves
private function PlayerLeaves takes nothing returns boolean
local player leavingPlayer = GetTriggerPlayer()
local group playerUnits = CreateGroup()
// Remove player from survivingPlayers & kill units
call ForceRemovePlayer(survivingPlayers, leavingPlayer)
call GroupEnumUnitsOfPlayer(playerUnits, leavingPlayer, null)
call ForGroup(playerUnits, function KillUnitsEnum)
call DestroyGroup(playerUnits)
// Make sure we check for victory
call CheckVictory()
set leavingPlayer = null
set playerUnits = null
return false
endfunction
// Hero levels up
private function HeroLevels takes nothing returns boolean
call HeroLearnSkill(GetLevelingUnit())
return false
endfunction
//=========================================================
// Initializer
//=========================================================
private function InitManhunt takes nothing returns nothing
local integer index
local boolean haveAI = false
local real x
local real y
local player indexPlayer = null
local trigger trg = null
set map_min_x = GetRectMinX(bj_mapInitialPlayableArea)
set map_max_x = GetRectMaxX(bj_mapInitialPlayableArea)
set map_min_y = GetRectMinY(bj_mapInitialPlayableArea)
set map_max_y = GetRectMaxY(bj_mapInitialPlayableArea)
// Set critters & creeps to be used
set critters[0] = 'nalb'
set critters[1] = 'nech'
set critters[2] = 'ndog'
set critters[3] = 'nfro'
set critters[4] = 'npig'
set critters[5] = 'necr'
set critters[6] = 'nrac'
set critters[7] = 'nrat'
set critters[8] = 'nshe'
set critters[9] = 'nskk'
set critters[10] = 'nsno'
set critters[11] = 'nder'
set critters[12] = 'nvul'
set critters_max = 12
set creeps1[0] = 'nanm'
set creeps1[1] = 'nanb'
set creeps1[2] = 'nanc'
set creeps1[3] = 'nspb'
set creeps1[4] = 'nspg'
set creeps1[5] = 'nspr'
set creeps1[6] = 'nslm'
set creeps1_max = 6
set creeps2[0] = 'nltl'
set creeps2[1] = 'nwlt'
set creeps2_max = 1
set creeps3[0] = 'nanw'
set creeps3[1] = 'nmam'
set creeps3[2] = 'nslh'
set creeps3[3] = 'nslf'
set creeps3_max = 3
set creeps4[0] = 'nane'
set creeps4[1] = 'nsgt'
set creeps4[2] = 'nwlg'
set creeps4_max = 2
set creeps5[0] = 'nano'
set creeps5[1] = 'nssp'
set creeps5[2] = 'nmit'
set creeps5[3] = 'nslr'
set creeps5[4] = 'nsln'
set creeps5_max = 4
set creeps6[0] = 'nsbm'
set creeps6[1] = 'nthl'
set creeps6[2] = 'nwld'
set creeps6_max = 2
// Disable creep camp display on minimap
call SetCreepCampFilterState(false)
// Create trees
set index = 0
loop
call CreateTree(false)
set index = index + 1
exitwhen index == 25000
endloop
// Create critters
set index = 0
loop
call CreateCritter(false)
set index = index + 1
exitwhen index == 800
endloop
// Create creeps level 1
set index = 0
loop
call CreateCreep1(false)
set index = index + 1
exitwhen index == 500
endloop
// Create creeps level 2
set index = 0
loop
call CreateCreep2(false)
set index = index + 1
exitwhen index == 250
endloop
// Create creeps level 3
set index = 0
loop
call CreateCreep3(false)
set index = index + 1
exitwhen index == 100
endloop
// Create creeps level 4
set index = 0
loop
call CreateCreep4(false)
set index = index + 1
exitwhen index == 50
endloop
// Create creeps level 5
set index = 0
loop
call CreateCreep5(false)
set index = index + 1
exitwhen index == 25
endloop
// Create creeps level 6
set index = 0
loop
call CreateCreep6(false)
set index = index + 1
exitwhen index == 10
endloop
// Create fountains
set index = 0
loop
call CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), 'nfoh', GetRandomReal(map_min_x, map_max_x), GetRandomReal(map_min_y, map_max_y), bj_UNIT_FACING)
set index = index + 1
exitwhen index == 6
endloop
// Create starting units
set index = 0
loop
set indexPlayer = Player(index)
if GetPlayerSlotState(indexPlayer) == PLAYER_SLOT_STATE_PLAYING then
// Create a random hero
set x = GetRandomReal(map_min_x, map_max_x)
set y = GetRandomReal(map_min_y, map_max_y)
set playerHero[index] = CreateUnit(indexPlayer, RandomHero(GetPlayerRace(indexPlayer)), x, y, GetRandomReal(0, 360))
//Starting items
set bj_lastCreatedItem = CreateItem('pghe', x, y)
call UnitAddItem(playerHero[index], bj_lastCreatedItem)
set bj_lastCreatedItem = CreateItem('pgma', x, y)
call UnitAddItem(playerHero[index], bj_lastCreatedItem)
call ForceAddPlayer(survivingPlayers, indexPlayer)
// Spell is cast (Hunt)
set trg = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(trg, indexPlayer, EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
call TriggerAddCondition(trg, function SpellIsCast)
// Unit dies (hero)
set trg = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(trg, indexPlayer, EVENT_PLAYER_UNIT_DEATH, null)
call TriggerAddCondition(trg, function HeroDies)
// Player leaves
set trg = CreateTrigger()
call TriggerRegisterPlayerEvent(trg, indexPlayer, EVENT_PLAYER_LEAVE)
call TriggerAddCondition(trg, function PlayerLeaves)
if GetLocalPlayer() == indexPlayer then
call SelectUnit(playerHero[index], true)
call SetCameraTargetController(playerHero[index], 0, 0, false)
elseif GetPlayerController(indexPlayer) == MAP_CONTROL_COMPUTER then
set haveAI = true
call HeroLearnSkill(playerHero[index])
set trg = CreateTrigger()
call TriggerRegisterUnitEvent( trg, playerHero[index], EVENT_UNIT_HERO_LEVEL )
call TriggerAddCondition(trg, function HeroLevels)
//call StartMeleeAI(indexPlayer, "scripts\\Manhunt.ai")
endif
else
set playerHero[index] = null
endif
set index = index + 1
exitwhen index == bj_MAX_PLAYERS
endloop
// Create new stuff
set trg = CreateTrigger()
call TriggerRegisterTimerEvent(trg, 60, true)
call TriggerAddCondition(trg, function CreateNewStuff)
// Hostile unit dies
set trg = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(trg, Player(PLAYER_NEUTRAL_AGGRESSIVE), EVENT_PLAYER_UNIT_DEATH, null)
call TriggerAddCondition(trg, function HostileUnitDies)
// Three meals a day
set trg = CreateTrigger()
call TriggerRegisterGameStateEvent(trg, GAME_STATE_TIME_OF_DAY, EQUAL, 6)
call TriggerRegisterGameStateEvent(trg, GAME_STATE_TIME_OF_DAY, EQUAL, 12)
call TriggerRegisterGameStateEvent(trg, GAME_STATE_TIME_OF_DAY, EQUAL, 18)
call TriggerAddCondition(trg, function PlayerEats)
// Periodically attack nearest enemy or move to fountain
if haveAI then
set trg = CreateTrigger()
call TriggerRegisterTimerEvent(trg, 20, true)
call TriggerAddCondition(trg, function AIMovement)
endif
set indexPlayer = null
set trg = null
endfunction
endlibrary