//===========================================================================
// Starting Units for Nature Players
// - 1 Great Oak, placed at start location
// - 3 Money Spiders, placed between start location and nearest gold mine
// - 2 Elmstones, placed at start location
//
function MeleeStartingUnitsNature takes player whichPlayer, location startLoc, boolean doHeroes, boolean doCamera, boolean doPreload returns nothing
local boolean useRandomHero = IsMapFlagSet(MAP_RANDOM_HERO)
local real unitSpacing = 64.00
local unit nearestMine
local location nearMineLoc
local location heroLoc
local real peonX
local real peonY
set nearestMine = MeleeFindNearestMine(startLoc, bj_MELEE_MINE_SEARCH_RADIUS)
if (nearestMine != null) then
// Spawn Gnoll Camp at the start location.
call CreateUnitAtLoc(whichPlayer, udg_UnitType_Townhall[1], startLoc, bj_UNIT_FACING)
// Spawn Runts near the mine.
set nearMineLoc = MeleeGetProjectedLoc(GetUnitLoc(nearestMine), startLoc, 320, 0)
set peonX = GetLocationX(nearMineLoc)
set peonY = GetLocationY(nearMineLoc)
call CreateUnit(whichPlayer, udg_UnitType_WorkerGold[1], peonX + 0.00 * unitSpacing, peonY + 1.00 * unitSpacing, bj_UNIT_FACING)
call CreateUnit(whichPlayer, udg_UnitType_WorkerGold[1], peonX + 1.00 * unitSpacing, peonY + 0.15 * unitSpacing, bj_UNIT_FACING)
call CreateUnit(whichPlayer, udg_UnitType_WorkerGold[1], peonX - 1.00 * unitSpacing, peonY + 0.15 * unitSpacing, bj_UNIT_FACING)
set peonX = GetLocationX(startLoc)
set peonY = GetLocationY(startLoc) - 224.00
call CreateUnit(whichPlayer, udg_UnitType_WorkerLumber[1], peonX + 0.60 * unitSpacing, peonY - 1.00 * unitSpacing, bj_UNIT_FACING)
call CreateUnit(whichPlayer, udg_UnitType_WorkerLumber[1], peonX - 0.60 * unitSpacing, peonY - 1.00 * unitSpacing, bj_UNIT_FACING)
// Set random hero spawn point to be off to the side of the start location.
set heroLoc = MeleeGetProjectedLoc(GetUnitLoc(nearestMine), startLoc, 384, 45)
else
// Spawn Gnoll Camp at the start location.
call CreateUnitAtLoc(whichPlayer, udg_UnitType_Townhall[1], startLoc, bj_UNIT_FACING)
// Spawn Runts directly south of the Gnoll Camp.
set peonX = GetLocationX(startLoc)
set peonY = GetLocationY(startLoc) - 224.00
call CreateUnit(whichPlayer, udg_UnitType_WorkerGold[1], peonX + 2.00 * unitSpacing, peonY + 0.00 * unitSpacing, bj_UNIT_FACING)
call CreateUnit(whichPlayer, udg_UnitType_WorkerGold[1], peonX + 1.00 * unitSpacing, peonY + 0.00 * unitSpacing, bj_UNIT_FACING)
call CreateUnit(whichPlayer, udg_UnitType_WorkerGold[1], peonX + 0.00 * unitSpacing, peonY + 0.00 * unitSpacing, bj_UNIT_FACING)
call CreateUnit(whichPlayer, udg_UnitType_WorkerLumber[1], peonX - 1.00 * unitSpacing, peonY + 0.00 * unitSpacing, bj_UNIT_FACING)
call CreateUnit(whichPlayer, udg_UnitType_WorkerLumber[1], peonX - 2.00 * unitSpacing, peonY + 0.00 * unitSpacing, bj_UNIT_FACING)
// Set random hero spawn point to be just south of the start location.
set heroLoc = Location(peonX, peonY - 2.00 * unitSpacing)
endif
if (doHeroes) then
// If the "Random Hero" option is set, start the player with a random hero.
// Otherwise, give them a "free hero" token.
if useRandomHero then
call MeleeRandomHeroLoc(whichPlayer, udg_UnitType_Hero1[1], udg_UnitType_Hero2[1], udg_UnitType_Hero3[1], udg_UnitType_Hero4[1], heroLoc)
else
call SetPlayerState(whichPlayer, PLAYER_STATE_RESOURCE_HERO_TOKENS, bj_MELEE_STARTING_HERO_TOKENS)
endif
endif
if (doCamera) then
// Center the camera on the initial Peasants.
call SetCameraPositionForPlayer(whichPlayer, peonX, peonY)
call SetCameraQuickPositionForPlayer(whichPlayer, peonX, peonY)
endif
endfunction
//===========================================================================
function AlteredMeleeStartingUnits takes nothing returns nothing
local integer index
local player indexPlayer
local location indexStartLoc
local race indexRace
call Preloader( "scripts\\SharedMelee.pld" )
//Nature Starting Units and Heroes
set udg_UnitType_Townhall[1] = 'e008'
set udg_UnitType_WorkerGold[1] = 'e001'
set udg_UnitType_WorkerLumber[1] = 'e000'
set udg_UnitType_Hero1[1] = 'E00Q'
set udg_UnitType_Hero2[1] = 'E00R'
set udg_UnitType_Hero3[1] = 'E00P'
set udg_UnitType_Hero4[1] = 'E00P'
//Naga Starting Units and Heroes
set udg_UnitType_Townhall[2] = 'nntt'
set udg_UnitType_WorkerGold[2] = 'nmpe'
set udg_UnitType_WorkerLumber[2] = 'nmpe'
set udg_UnitType_Hero1[2] = 'Nngs'
set udg_UnitType_Hero2[2] = 'Nngs'
set udg_UnitType_Hero3[2] = 'Nngs'
set udg_UnitType_Hero4[2] = 'Nngs'
//Draenei Starting Units and Heroes
set udg_UnitType_Townhall[3] = 'ndh2'
set udg_UnitType_WorkerGold[3] = 'ndrl'
set udg_UnitType_WorkerLumber[3] = 'ndrl'
set udg_UnitType_Hero1[3] = 'Naka'
set udg_UnitType_Hero2[3] = 'Naka'
set udg_UnitType_Hero3[3] = 'Naka'
set udg_UnitType_Hero4[3] = 'Naka'
set index = 0
loop
set indexPlayer = Player(index)
if (GetPlayerSlotState(indexPlayer) == PLAYER_SLOT_STATE_PLAYING) then
set indexStartLoc = GetStartLocationLoc(GetPlayerStartLocation(indexPlayer))
set indexRace = GetPlayerRace(indexPlayer)
// Create initial race-specific starting units
if (udg_RaceChosen[GetConvertedPlayerId(indexPlayer)] == 1) then
call MeleeStartingUnitsHuman(indexPlayer, indexStartLoc, true, true, true)
elseif (udg_RaceChosen[GetConvertedPlayerId(indexPlayer)] == 2) then
call MeleeStartingUnitsOrc(indexPlayer, indexStartLoc, true, true, true)
elseif (udg_RaceChosen[GetConvertedPlayerId(indexPlayer)] == 3) then
call MeleeStartingUnitsUndead(indexPlayer, indexStartLoc, true, true, true)
elseif (udg_RaceChosen[GetConvertedPlayerId(indexPlayer)] == 4) then
call MeleeStartingUnitsNightElf(indexPlayer, indexStartLoc, true, true, true)
elseif (udg_RaceChosen[GetConvertedPlayerId(indexPlayer)] == 5) then
call MeleeStartingUnitsNature(indexPlayer, indexStartLoc, true, true, true)
elseif (udg_RaceChosen[GetConvertedPlayerId(indexPlayer)] == 6) then
else
call MeleeStartingUnitsUnknownRace(indexPlayer, indexStartLoc, true, true, true)
endif
call SetPlayerMaxHeroesAllowed( 3, indexPlayer )
// Limit them to one of each type of custom hero
// Nature Heroes
call SetPlayerTechMaxAllowedSwap( 'E00Q', 1, indexPlayer )
call SetPlayerTechMaxAllowedSwap( 'E00R', 1, indexPlayer )
call SetPlayerTechMaxAllowedSwap( 'E00P', 1, indexPlayer )
endif
set index = index + 1
exitwhen index == bj_MAX_PLAYERS
endloop
endfunction
//***************************************************************************
//*
//* Altered Melee Template Victory / Defeat Conditions
//*
//***************************************************************************
//===========================================================================
// Count buildings currently owned by all allies, including the player themself.
//
function AlteredMeleeGetAllyStructureCount takes player whichPlayer returns integer
local integer playerIndex
local integer buildingCount
local player indexPlayer
// Count the number of buildings controlled by all not-yet-defeated co-allies.
set buildingCount = 0
set playerIndex = 0
loop
set indexPlayer = Player(playerIndex)
// uncomment to cause defeat even if you have control of ally structures, but yours have been nixed
//if (PlayersAreCoAllied(whichPlayer, indexPlayer) and not bj_meleeDefeated[playerIndex]) then
if (PlayersAreCoAllied(whichPlayer, indexPlayer)) then
set buildingCount = buildingCount + GetPlayerStructureCount(indexPlayer, true) - CountLivingPlayerUnitsOfTypeId('haro', indexPlayer)
endif
set playerIndex = playerIndex + 1
exitwhen playerIndex == bj_MAX_PLAYERS
endloop
return buildingCount
endfunction
//===========================================================================
// Counts key structures owned by a player and his or her allies, including
// structures currently upgrading or under construction.
//
// Key structures: Town Hall, Great Hall, Tree of Life, Necropolis
//
function AlteredMeleeGetAllyKeyStructureCount takes player whichPlayer returns integer
local integer playerIndex
local player indexPlayer
local integer keyStructs
// Count the number of buildings controlled by all not-yet-defeated co-allies.
set keyStructs = 0
set playerIndex = 0
loop
set indexPlayer = Player(playerIndex)
if (PlayersAreCoAllied(whichPlayer, indexPlayer)) then
set keyStructs = keyStructs + GetPlayerTypedUnitCount(indexPlayer, "townhall", true, true)
set keyStructs = keyStructs + GetPlayerTypedUnitCount(indexPlayer, "greathall", true, true)
set keyStructs = keyStructs + GetPlayerTypedUnitCount(indexPlayer, "treeoflife", true, true)
set keyStructs = keyStructs + GetPlayerTypedUnitCount(indexPlayer, "necropolis", true, true)
set keyStructs = keyStructs + CountLivingPlayerUnitsOfTypeId(udg_UnitType_Townhall[1], indexPlayer)
endif
set playerIndex = playerIndex + 1
exitwhen playerIndex == bj_MAX_PLAYERS
endloop
return keyStructs
endfunction
//===========================================================================
// Test each player to determine if anyone has been defeated.
//
function AlteredMeleeCheckForLosersAndVictors takes nothing returns nothing
local integer playerIndex
local player indexPlayer
local force defeatedPlayers = CreateForce()
local force victoriousPlayers
local boolean gameOver = false
// If the game is already over, do nothing
if (bj_meleeGameOver) then
return
endif
// If the game was disconnected then it is over, in this case we
// don't want to report results for anyone as they will most likely
// conflict with the actual game results
if (GetIntegerGameState(GAME_STATE_DISCONNECTED) != 0) then
set bj_meleeGameOver = true
return
endif
// Check each player to see if he or she has been defeated yet.
set playerIndex = 0
loop
set indexPlayer = Player(playerIndex)
if (not bj_meleeDefeated[playerIndex] and not bj_meleeVictoried[playerIndex]) then
//call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 60, "Player"+I2S(playerIndex)+" has "+I2S(AlteredMeleeGetAllyStructureCount(indexPlayer))+" ally buildings.")
if (AlteredMeleeGetAllyStructureCount(indexPlayer) <= 0) then
// Keep track of each defeated player so that we can give
// them a defeat later.
call ForceAddPlayer(defeatedPlayers, Player(playerIndex))
// Set their defeated flag now so MeleeCheckForVictors
// can detect victors.
set bj_meleeDefeated[playerIndex] = true
endif
endif
set playerIndex = playerIndex + 1
exitwhen playerIndex == bj_MAX_PLAYERS
endloop
// Now that the defeated flags are set, check if there are any victors
set victoriousPlayers = MeleeCheckForVictors()
// Defeat all defeated players
call ForForce(defeatedPlayers, function MeleeDoDefeatEnum)
// Give victory to all victorious players
call ForForce(victoriousPlayers, function MeleeDoVictoryEnum)
// If the game is over we should remove all observers
if (bj_meleeGameOver) then
call MeleeRemoveObservers()
endif
endfunction
//===========================================================================
// Returns a race-specific "build X or be revealed" message.
//
function AlteredMeleeGetCrippledWarningMessage takes player whichPlayer returns string
if (udg_RaceChosen[GetConvertedPlayerId(whichPlayer )] == 1) then
return GetLocalizedString("CRIPPLE_WARNING_HUMAN")
elseif (udg_RaceChosen[GetConvertedPlayerId(whichPlayer )] == 2) then
return GetLocalizedString("CRIPPLE_WARNING_ORC")
elseif (udg_RaceChosen[GetConvertedPlayerId(whichPlayer )] == 3) then
return GetLocalizedString("CRIPPLE_WARNING_NIGHTELF")
elseif (udg_RaceChosen[GetConvertedPlayerId(whichPlayer )] == 4) then
return GetLocalizedString("CRIPPLE_WARNING_UNDEAD")
elseif (udg_RaceChosen[GetConvertedPlayerId(whichPlayer )] == 5) then
return "You will be revealed unless you build a Great Oak"
else
// Unrecognized Race
return ""
endif
endfunction
//===========================================================================
// Returns a race-specific "build X" label for cripple timers.
//
function AlteredMeleeGetCrippledTimerMessage takes player whichPlayer returns string
if (udg_RaceChosen[GetConvertedPlayerId(whichPlayer )] == 1) then
return GetLocalizedString("CRIPPLE_TIMER_HUMAN")
elseif (udg_RaceChosen[GetConvertedPlayerId(whichPlayer )] == 2) then
return GetLocalizedString("CRIPPLE_TIMER_ORC")
elseif (udg_RaceChosen[GetConvertedPlayerId(whichPlayer )] == 3) then
return GetLocalizedString("CRIPPLE_TIMER_NIGHTELF")
elseif (udg_RaceChosen[GetConvertedPlayerId(whichPlayer )] == 4) then
return GetLocalizedString("CRIPPLE_TIMER_UNDEAD")
elseif (udg_RaceChosen[GetConvertedPlayerId(whichPlayer )] == 5) then
return "Build Great Oak"
else
// Unrecognized Race
return ""
endif
endfunction
//===========================================================================
function AlteredMeleePlayerIsCrippled takes player whichPlayer returns boolean
local integer allyStructures = AlteredMeleeGetAllyStructureCount(whichPlayer)
local integer allyKeyStructures = AlteredMeleeGetAllyKeyStructureCount(whichPlayer)
// Dead teams are not considered to be crippled.
return (allyStructures > 0) and (allyKeyStructures <= 0)
endfunction
//===========================================================================
// Test each player to determine if anyone has become crippled.
//
function AlteredMeleeCheckForCrippledPlayers takes nothing returns nothing
local integer playerIndex
local player indexPlayer
local force crippledPlayers = CreateForce()
local boolean isNowCrippled
local race indexRace
// The "finish soon" exposure of all players overrides any "crippled" exposure
if bj_finishSoonAllExposed then
return
endif
// Check each player to see if he or she has been crippled or uncrippled.
set playerIndex = 0
loop
set indexPlayer = Player(playerIndex)
set isNowCrippled = AlteredMeleePlayerIsCrippled(indexPlayer)
if (not bj_playerIsCrippled[playerIndex] and isNowCrippled) then
// Player became crippled; start their cripple timer.
set bj_playerIsCrippled[playerIndex] = true
call TimerStart(bj_crippledTimer[playerIndex], bj_MELEE_CRIPPLE_TIMEOUT, false, function MeleeCrippledPlayerTimeout)
if (GetLocalPlayer() == indexPlayer) then
// Use only local code (no net traffic) within this block to avoid desyncs.
// Show the timer window.
call TimerDialogDisplay(bj_crippledTimerWindows[playerIndex], true)
// Display a warning message.
call DisplayTimedTextToPlayer(indexPlayer, 0, 0, bj_MELEE_CRIPPLE_MSG_DURATION, AlteredMeleeGetCrippledWarningMessage(indexPlayer))
endif
elseif (bj_playerIsCrippled[playerIndex] and not isNowCrippled) then
// Player became uncrippled; stop their cripple timer.
set bj_playerIsCrippled[playerIndex] = false
call PauseTimer(bj_crippledTimer[playerIndex])
if (GetLocalPlayer() == indexPlayer) then
// Use only local code (no net traffic) within this block to avoid desyncs.
// Hide the timer window for this player.
call TimerDialogDisplay(bj_crippledTimerWindows[playerIndex], false)
// Display a confirmation message if the player's team is still alive.
if (AlteredMeleeGetAllyStructureCount(indexPlayer) > 0) then
if (bj_playerIsExposed[playerIndex]) then
call DisplayTimedTextToPlayer(indexPlayer, 0, 0, bj_MELEE_CRIPPLE_MSG_DURATION, GetLocalizedString("CRIPPLE_UNREVEALED"))
else
call DisplayTimedTextToPlayer(indexPlayer, 0, 0, bj_MELEE_CRIPPLE_MSG_DURATION, GetLocalizedString("CRIPPLE_UNCRIPPLED"))
endif
endif
endif
// If the player granted shared vision, deny that vision now.
call MeleeExposePlayer(indexPlayer, false)
endif
set playerIndex = playerIndex + 1
exitwhen playerIndex == bj_MAX_PLAYERS
endloop
endfunction
//===========================================================================
// Determine if the lost unit should result in any defeats or victories.
//
function AlteredMeleeCheckLostUnit takes unit lostUnit returns nothing
local player lostUnitOwner = GetOwningPlayer(lostUnit)
// We only need to check for mortality if this was the last building.
if (GetPlayerStructureCount(lostUnitOwner, true) <= 0) then
call AlteredMeleeCheckForLosersAndVictors()
endif
// Check if the lost unit has crippled or uncrippled the player.
// (A team with 0 units is dead, and thus considered uncrippled.)
call AlteredMeleeCheckForCrippledPlayers()
endfunction
//===========================================================================
// Determine if the gained unit should result in any defeats, victories,
// or cripple-status changes.
//
function AlteredMeleeCheckAddedUnit takes unit addedUnit returns nothing
local player addedUnitOwner = GetOwningPlayer(addedUnit)
// If the player was crippled, this unit may have uncrippled him/her.
if (bj_playerIsCrippled[GetPlayerId(addedUnitOwner)]) then
call AlteredMeleeCheckForCrippledPlayers()
endif
endfunction
//===========================================================================
function AlteredMeleeTriggerActionConstructCancel takes nothing returns nothing
call AlteredMeleeCheckLostUnit(GetCancelledStructure())
endfunction
//===========================================================================
function AlteredMeleeTriggerActionUnitDeath takes nothing returns nothing
if (IsUnitType(GetDyingUnit(), UNIT_TYPE_STRUCTURE)) then
call AlteredMeleeCheckLostUnit(GetDyingUnit())
endif
endfunction
//===========================================================================
function AlteredMeleeTriggerActionUnitConstructionStart takes nothing returns nothing
call AlteredMeleeCheckAddedUnit(GetConstructingStructure())
endfunction
//===========================================================================
function AlteredMeleeTriggerActionPlayerDefeated takes nothing returns nothing
local player thePlayer = GetTriggerPlayer()
call CachePlayerHeroData(thePlayer)
if (MeleeGetAllyCount(thePlayer) > 0) then
// If at least one ally is still alive and kicking, share units with
// them and proceed with death.
call ShareEverythingWithTeam(thePlayer)
if (not bj_meleeDefeated[GetPlayerId(thePlayer)]) then
call MeleeDoDefeat(thePlayer)
endif
else
// If no living allies remain, swap all units and buildings over to
// neutral_passive and proceed with death.
call MakeUnitsPassiveForTeam(thePlayer)
if (not bj_meleeDefeated[GetPlayerId(thePlayer)]) then
call MeleeDoDefeat(thePlayer)
endif
endif
call AlteredMeleeCheckForLosersAndVictors()
endfunction
//===========================================================================
function AlteredMeleeTriggerActionPlayerLeft takes nothing returns nothing
local player thePlayer = GetTriggerPlayer()
// Just show game over for observers when they leave
if (IsPlayerObserver(thePlayer)) then
call RemovePlayerPreserveUnitsBJ(thePlayer, PLAYER_GAME_RESULT_NEUTRAL, false)
return
endif
call CachePlayerHeroData(thePlayer)
// This is the same as defeat except the player generates the message
// "player left the game" as opposed to "player was defeated".
if (MeleeGetAllyCount(thePlayer) > 0) then
// If at least one ally is still alive and kicking, share units with
// them and proceed with death.
call ShareEverythingWithTeam(thePlayer)
call MeleeDoLeave(thePlayer)
else
// If no living allies remain, swap all units and buildings over to
// neutral_passive and proceed with death.
call MakeUnitsPassiveForTeam(thePlayer)
call MeleeDoLeave(thePlayer)
endif
call AlteredMeleeCheckForLosersAndVictors()
endfunction
//===========================================================================
function AlteredMeleeTriggerActionAllianceChange takes nothing returns nothing
call AlteredMeleeCheckForLosersAndVictors()
call AlteredMeleeCheckForCrippledPlayers()
endfunction
//===========================================================================
function AlteredMeleeInitVictoryDefeat takes nothing returns nothing
local trigger trig
local integer index
local player indexPlayer
// Create a timer window for the "finish soon" timeout period, it has no timer
// because it is driven by real time (outside of the game state to avoid desyncs)
set bj_finishSoonTimerDialog = CreateTimerDialog(null)
// Set a trigger to fire when we receive a "finish soon" game event
set trig = CreateTrigger()
call TriggerRegisterGameEvent(trig, EVENT_GAME_TOURNAMENT_FINISH_SOON)
call TriggerAddAction(trig, function MeleeTriggerTournamentFinishSoon)
// Set a trigger to fire when we receive a "finish now" game event
set trig = CreateTrigger()
call TriggerRegisterGameEvent(trig, EVENT_GAME_TOURNAMENT_FINISH_NOW)
call TriggerAddAction(trig, function MeleeTriggerTournamentFinishNow)
// Set up each player's mortality code.
set index = 0
loop
set indexPlayer = Player(index)
// Make sure this player slot is playing.
if (GetPlayerSlotState(indexPlayer) == PLAYER_SLOT_STATE_PLAYING) then
set bj_meleeDefeated[index] = false
set bj_meleeVictoried[index] = false
// Create a timer and timer window in case the player is crippled.
set bj_playerIsCrippled[index] = false
set bj_playerIsExposed[index] = false
set bj_crippledTimer[index] = CreateTimer()
set bj_crippledTimerWindows[index] = CreateTimerDialog(bj_crippledTimer[index])
call TimerDialogSetTitle(bj_crippledTimerWindows[index], AlteredMeleeGetCrippledTimerMessage(indexPlayer))
// Set a trigger to fire whenever a building is cancelled for this player.
set trig = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(trig, indexPlayer, EVENT_PLAYER_UNIT_CONSTRUCT_CANCEL, null)
call TriggerAddAction(trig, function AlteredMeleeTriggerActionConstructCancel)
// Set a trigger to fire whenever a unit dies for this player.
set trig = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(trig, indexPlayer, EVENT_PLAYER_UNIT_DEATH, null)
call TriggerAddAction(trig, function AlteredMeleeTriggerActionUnitDeath)
// Set a trigger to fire whenever a unit begins construction for this player
set trig = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(trig, indexPlayer, EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
call TriggerAddAction(trig, function AlteredMeleeTriggerActionUnitConstructionStart)
// Set a trigger to fire whenever this player defeats-out
set trig = CreateTrigger()
call TriggerRegisterPlayerEvent(trig, indexPlayer, EVENT_PLAYER_DEFEAT)
call TriggerAddAction(trig, function AlteredMeleeTriggerActionPlayerDefeated)
// Set a trigger to fire whenever this player leaves
set trig = CreateTrigger()
call TriggerRegisterPlayerEvent(trig, indexPlayer, EVENT_PLAYER_LEAVE)
call TriggerAddAction(trig, function AlteredMeleeTriggerActionPlayerLeft)
// Set a trigger to fire whenever this player changes his/her alliances.
set trig = CreateTrigger()
call TriggerRegisterPlayerAllianceChange(trig, indexPlayer, ALLIANCE_PASSIVE)
call TriggerRegisterPlayerStateEvent(trig, indexPlayer, PLAYER_STATE_ALLIED_VICTORY, EQUAL, 1)
call TriggerAddAction(trig, function AlteredMeleeTriggerActionAllianceChange)
else
set bj_meleeDefeated[index] = true
set bj_meleeVictoried[index] = false
// Handle leave events for observers
if (IsPlayerObserver(indexPlayer)) then
// Set a trigger to fire whenever this player leaves
set trig = CreateTrigger()
call TriggerRegisterPlayerEvent(trig, indexPlayer, EVENT_PLAYER_LEAVE)
call TriggerAddAction(trig, function AlteredMeleeTriggerActionPlayerLeft)
endif
endif
set index = index + 1
exitwhen index == bj_MAX_PLAYERS
endloop
// Test for victory / defeat at startup, in case the user has already won / lost.
// Allow for a short time to pass first, so that the map can finish loading.
call TimerStart(CreateTimer(), 2.0, false, function AlteredMeleeTriggerActionAllianceChange)
endfunction
Name | Type | is_array | initial_value |
BooleanNature | boolean | Yes | |
HashtableWebdrag | hashtable | Yes | |
IntegerTemp | integer | No | |
NumOfPlayers | integer | No | 4 |
PointTemp | location | No | |
PointTemp2 | location | No | |
PointTemp3 | location | No | |
RaceChoices | dialog | No | |
RaceChosen | integer | Yes | |
RaceHuman | button | No | |
RaceNature | button | No | |
RaceNightElf | button | No | |
RaceOrc | button | No | |
RaceUndead | button | No | |
UGroupTemp | group | No | |
UGroupTemp2 | group | No | |
UGroupWebDrag | group | No | |
UnitType_Hero1 | unitcode | Yes | |
UnitType_Hero2 | unitcode | Yes | |
UnitType_Hero3 | unitcode | Yes | |
UnitType_Hero4 | unitcode | Yes | |
UnitType_Townhall | unitcode | Yes | |
UnitType_WorkerGold | unitcode | Yes | |
UnitType_WorkerLumber | unitcode | Yes |
function Trig_RacesDialogClickDetection_Actions takes nothing returns nothing
call DialogDisplayBJ( false, udg_RaceChoices, GetTriggerPlayer() )
// Player Clicks Human
if ( GetClickedButtonBJ() == udg_RaceHuman ) then
set udg_RaceChosen[GetConvertedPlayerId(GetTriggerPlayer())] = 1
else
// Player Clicks Orc
if ( GetClickedButtonBJ() == udg_RaceOrc ) then
set udg_RaceChosen[GetConvertedPlayerId(GetTriggerPlayer())] = 2
else
// Player Clicks Undead
if ( GetClickedButtonBJ() == udg_RaceUndead ) then
set udg_RaceChosen[GetConvertedPlayerId(GetTriggerPlayer())] = 3
else
// Player Clicks NightElf
if ( GetClickedButtonBJ() == udg_RaceNightElf ) then
set udg_RaceChosen[GetConvertedPlayerId(GetTriggerPlayer())] = 4
else
// Player Clicks Gnoll
if ( GetClickedButtonBJ() == udg_RaceNature ) then
set udg_RaceChosen[GetConvertedPlayerId(GetTriggerPlayer())] = 5
else
// Player picked invaled race, set race to nothing
set udg_RaceChosen[GetConvertedPlayerId(GetTriggerPlayer())] = -1
endif
endif
endif
endif
endif
endfunction
//===========================================================================
function InitTrig_RacesDialogClickDetection takes nothing returns nothing
set gg_trg_RacesDialogClickDetection = CreateTrigger( )
call TriggerRegisterDialogEventBJ( gg_trg_RacesDialogClickDetection, udg_RaceChoices )
call TriggerAddAction( gg_trg_RacesDialogClickDetection, function Trig_RacesDialogClickDetection_Actions )
endfunction